Форум программистов, компьютерный форум CyberForum.ru

Программирование Android

Войти
Регистрация
Восстановить пароль
 
Agassy
0 / 0 / 0
Регистрация: 03.10.2014
Сообщений: 5
#1

Как запустить метод в Activity из BroadcastReceiver - Android

03.10.2014, 16:16. Просмотров 968. Ответов 2
Метки нет (Все метки)

Здравствуйте!!!
Все до банальности просто и повторяется, по кругу
Новичок, увлекся Java & Android...
Пытаюсь изобразить приложения первого этапа - при вхождения в сектор, центр которого определен географическими координатами и имеет определенный радиус, срабатывает оповещение и уменьшается счетчик, в соответствии с временем нахождения в секторе.

Оповещение срабатывает, счетчик не как не запускается...
Помогите, пожалуйста преодолеть барьерчик!

MainActivity
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
public class ProximityAlertActivity extends Activity {
    private static final long POINT_RADIUS = 50;               // in Meters
    private static final long PROX_ALERT_EXPIRATION = -1; // It will never expire
    private static final String PROX_ALERT_INTENT = "com.androidmyway.demo.ProximityAlert";
    private LocationManager locationManager;
    private EditText latitudeEditText;
    private EditText longitudeEditText;
    private Button addAlertButton;
    
    TextView tvtextCounterLive;
    
    double counterLive = 100.00;
 
    @Override
    public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_proxymity);
 
            locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
            tvtextCounterLive = (TextView) findViewById(R.id.textCounterLive);
            latitudeEditText = (EditText) findViewById(R.id.point_latitude);
            longitudeEditText = (EditText) findViewById(R.id.point_longitude);
            addAlertButton = (Button) findViewById(R.id.add_alert_button);
 
            addAlertButton.setOnClickListener(new OnClickListener() {
                  public void onClick(View v) {
                      
                      addProximityAlert();
                  }
            });
 
    }    
 
 // запускаем таймер и изменение счетчика жизни 
    public void startTimer(){
        Timer myTimer = new Timer();
        myTimer.schedule(new TimerTask() {
 
    @Override
    public void run() {
        ProximityAlertActivity.this.runOnUiThread(new Runnable() {
            public void run() {
                counterLive-=0.15;
                tvtextCounterLive.setText(" " + String.format("%1$.2f", counterLive) + "%");
            }
        });
    }
}, 0, 2500);
    }
    
 // останавливаем таймер и изменение счетчика жизни
 //   public void stopTimer(){ } 
 
    
    public void showCounterLive(){
        tvtextCounterLive.setText(" " + counterLive + "%");
}
    
    
    private void addProximityAlert() {
           double latitude = Double.parseDouble(latitudeEditText.getText().toString());
           double longitude = Double.parseDouble(longitudeEditText.getText().toString());
           Log.d(getClass().getSimpleName(),"latitude = "+latitude);
           Log.d(getClass().getSimpleName(),"longitude= "+longitude);
           Intent intent = new Intent(PROX_ALERT_INTENT);
           PendingIntent proximityIntent = PendingIntent.getBroadcast(this, 0, intent, 0);
           locationManager.addProximityAlert(
                  latitude,                          // the latitude of the central point of the alert region
                  longitude,                        // the longitude of the central point of the alert region
                  POINT_RADIUS,                // the radius of the central point of the alert region, in meters
                  PROX_ALERT_EXPIRATION, // time for this proximity alert, in milliseconds, or -1 to indicate no  expiration
                  proximityIntent                // will be used to generate an Intent to fire when entry to or exit from the alert region is detected
           );
 
           IntentFilter filter = new IntentFilter(PROX_ALERT_INTENT);
           registerReceiver(new ProximityIntentReceiver(), filter);
           Toast.makeText(getApplicationContext(),"Точка добавлена!",Toast.LENGTH_SHORT).show();
    }     
}
BroadcastReceier
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
public class ProximityIntentReceiver extends BroadcastReceiver {
       private static final int NOTIFICATION_ID = 1000;
       
       
       @SuppressWarnings("deprecation")
       @Override
       public void onReceive(Context context, Intent intent) {
 
           String key = LocationManager.KEY_PROXIMITY_ENTERING;
        
           Boolean entering = intent.getBooleanExtra(key, false);
           if (entering) {
                       Toast.makeText(context, "Вошли в сектор!", Toast.LENGTH_LONG).show();
              }else {
                       Toast.makeText(context, "Вышли из сектора!", Toast.LENGTH_LONG).show();
              }
              NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
 
              Intent notificationIntent = new Intent(context, ProximityAlertActivity.class);
              PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, notificationIntent, 0);
              Notification notification = createNotification();
              notification.setLatestEventInfo(context, "Вошли в ZONE51", "You are near your point of interest.", pendingIntent);
 
              notificationManager.notify(NOTIFICATION_ID, notification);
      }
 
 
    private Notification createNotification() {
              Notification notification = new Notification();
              notification.icon = R.drawable.ic_launcher;
              notification.when = System.currentTimeMillis();
              notification.defaults |= Notification.DEFAULT_VIBRATE;
 
              return notification;
        }
}
Пробовал работать разные варианты "в лоб" - не заработало
Java
1
2
3
4
5
6
7
8
9
10
11
           Boolean entering = intent.getBooleanExtra(key, false);
           if (entering) {
 
                     Toast.makeText(context, "Вошли в сектор!", Toast.LENGTH_LONG).show();
                  //Вариант I   
                          //startTimer();
                  //Вариант II
                          // ProximityAlertActivity on = new ProximityAlertActivity ();
                          // startTimer.on();
                                 
              }
Пока читаю инет...если не сложно намекните, куда копать, первый раз с BroadcastReceiver Имею дело ...

Заранее благодарен!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.10.2014, 16:16     Как запустить метод в Activity из BroadcastReceiver
Посмотрите здесь:

Как поучить/передать данные в/из BroadcastReceiver ? Android
Servise, BroadcastReceiver, Activity Android
Как запустить метод из другого класса? Android
Android Как при старте приложения запустить другой Activity ?
Android Как заставить работать BroadcastReceiver?
Как узнать что BroadcastReceiver сообщение зарегистрировано? Android
Android Везде ли выполняется метод finish() для закрытия activity
Android Как запустить метод Fragment из MainActivity?
Android Как запустить метод в сервисе, в определённое время?
Как запустить метод из Service? Android
Android Подскажите как запустить через Inten Activity другого приложения
Как запустить метод в заданное время Android

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Agassy
0 / 0 / 0
Регистрация: 03.10.2014
Сообщений: 5
07.10.2014, 13:51  [ТС]     Как запустить метод в Activity из BroadcastReceiver #2
Попробовал внедрить static ..

MainActivity
Java
1
2
3
4
5
6
7
8
9
10
11
12
...
    private static EditText latitudeEditText;
    private EditText longitudeEditText;
    private Button addAlertButton;
    
    public static TextView tvtextCounterLive;
    public static double counterLive = 100.00;
 
    @Override
    public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_proxymity);
BroadcastReceiver
Java
1
2
3
4
5
6
7
8
    ....       
       Boolean entering = intent.getBooleanExtra(key, false);
           if (entering) {
                    // Log.d(getClass().getSimpleName(), "entering");
                     Toast.makeText(context, "Вошли в сектор!", Toast.LENGTH_LONG).show();
                    ProximityAlertActivity.startTimer();
                                 
              }else {....
получил следующий результат:
Код
10-07 09:27:08.115: W/dalvikvm(774): threadid=11: thread exiting with uncaught exception (group=0x40a13300)
10-07 09:27:08.394: E/AndroidRuntime(774): FATAL EXCEPTION: Timer-0
10-07 09:27:08.394: E/AndroidRuntime(774): android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
10-07 09:27:08.394: E/AndroidRuntime(774): 	at android.view.ViewRootImpl.checkThread(ViewRootImpl.java:4609)
10-07 09:27:08.394: E/AndroidRuntime(774): 	at android.view.ViewRootImpl.invalidateChildInParent(ViewRootImpl.java:867)
10-07 09:27:08.394: E/AndroidRuntime(774): 	at android.view.ViewGroup.invalidateChild(ViewGroup.java:4066)
10-07 09:27:08.394: E/AndroidRuntime(774): 	at android.view.View.invalidate(View.java:10250)
10-07 09:27:08.394: E/AndroidRuntime(774): 	at android.view.View.invalidate(View.java:10205)
10-07 09:27:08.394: E/AndroidRuntime(774): 	at android.widget.TextView.checkForRelayout(TextView.java:6296)
10-07 09:27:08.394: E/AndroidRuntime(774): 	at android.widget.TextView.setText(TextView.java:3547)
10-07 09:27:08.394: E/AndroidRuntime(774): 	at android.widget.TextView.setText(TextView.java:3405)
10-07 09:27:08.394: E/AndroidRuntime(774): 	at android.widget.TextView.setText(TextView.java:3380)
10-07 09:27:08.394: E/AndroidRuntime(774): 	at com.androidmyway.demo.proxymityalert.ProximityAlertActivity$2.run(ProximityAlertActivity.java:72)
10-07 09:27:08.394: E/AndroidRuntime(774): 	at java.util.Timer$TimerImpl.run(Timer.java:284)
10-07 09:27:09.525: D/dalvikvm(774): GC_CONCURRENT freed 141K, 3% free 8268K/8519K, paused 329ms+121ms, total 1080ms
10-07 09:27:11.315: E/ActivityThread(774): Activity com.androidmyway.demo.proxymityalert.ProximityAlertActivity has leaked IntentReceiver com.androidmyway.demo.proxymityalert.ProximityIntentReceiver@4122ff70 that was originally registered here. Are you missing a call to unregisterReceiver()?
10-07 09:27:11.315: E/ActivityThread(774): android.app.IntentReceiverLeaked: Activity com.androidmyway.demo.proxymityalert.ProximityAlertActivity has leaked IntentReceiver com.androidmyway.demo.proxymityalert.ProximityIntentReceiver@4122ff70 that was originally registered here. Are you missing a call to unregisterReceiver()?
10-07 09:27:11.315: E/ActivityThread(774): 	at android.app.LoadedApk$ReceiverDispatcher.<init>(LoadedApk.java:792)
10-07 09:27:11.315: E/ActivityThread(774): 	at android.app.LoadedApk.getReceiverDispatcher(LoadedApk.java:593)
10-07 09:27:11.315: E/ActivityThread(774): 	at android.app.ContextImpl.registerReceiverInternal(ContextImpl.java:1111)
10-07 09:27:11.315: E/ActivityThread(774): 	at android.app.ContextImpl.registerReceiver(ContextImpl.java:1098)
10-07 09:27:11.315: E/ActivityThread(774): 	at android.app.ContextImpl.registerReceiver(ContextImpl.java:1092)
10-07 09:27:11.315: E/ActivityThread(774): 	at android.content.ContextWrapper.registerReceiver(ContextWrapper.java:365)
10-07 09:27:11.315: E/ActivityThread(774): 	at com.androidmyway.demo.proxymityalert.ProximityAlertActivity.addProximityAlert(ProximityAlertActivity.java:135)
10-07 09:27:11.315: E/ActivityThread(774): 	at com.androidmyway.demo.proxymityalert.ProximityAlertActivity.access$0(ProximityAlertActivity.java:119)
10-07 09:27:11.315: E/ActivityThread(774): 	at com.androidmyway.demo.proxymityalert.ProximityAlertActivity$1.onClick(ProximityAlertActivity.java:55)
10-07 09:27:11.315: E/ActivityThread(774): 	at android.view.View.performClick(View.java:4084)
10-07 09:27:11.315: E/ActivityThread(774): 	at android.view.View$PerformClick.run(View.java:16966)
10-07 09:27:11.315: E/ActivityThread(774): 	at android.os.Handler.handleCallback(Handler.java:615)
10-07 09:27:11.315: E/ActivityThread(774): 	at android.os.Handler.dispatchMessage(Handler.java:92)
10-07 09:27:11.315: E/ActivityThread(774): 	at android.os.Looper.loop(Looper.java:137)
10-07 09:27:11.315: E/ActivityThread(774): 	at android.app.ActivityThread.main(ActivityThread.java:4745)
10-07 09:27:11.315: E/ActivityThread(774): 	at java.lang.reflect.Method.invokeNative(Native Method)
10-07 09:27:11.315: E/ActivityThread(774): 	at java.lang.reflect.Method.invoke(Method.java:511)
10-07 09:27:11.315: E/ActivityThread(774): 	at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
10-07 09:27:11.315: E/ActivityThread(774): 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
10-07 09:27:11.315: E/ActivityThread(774): 	at dalvik.system.NativeStart.main(Native Method)
10-07 09:27:17.275: I/Process(774): Sending signal. PID: 774 SIG: 9
Не подскажете, что сделал не так? и куда копать далее..
Заранее благодарен!
Agassy
0 / 0 / 0
Регистрация: 03.10.2014
Сообщений: 5
09.10.2014, 17:45  [ТС]     Как запустить метод в Activity из BroadcastReceiver #3
Подскажите, пожалуйста, какие-нибудь "живые" форумы, по разработке приложений под Android.

Заранее благодарен!
Yandex
Объявления
09.10.2014, 17:45     Как запустить метод в Activity из BroadcastReceiver
Ответ Создать тему
Опции темы

Текущее время: 06:16. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru