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

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

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

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

03.10.2014, 16:16. Просмотров 1049. Ответов 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 Имею дело ...

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

Servise, BroadcastReceiver, Activity - Программирование Android
Здравствуйте, есть сервис и активити, сервис возвращает данные активити через BroadcastReceiver... все работает отлично, но когда виходиш...

Из одной Activity запустить функцию другой Activity - Программирование Android
например есть Activity2 которое я показываю в Dialog окошке, там у меня находятся Date and Time Picker ы (Дата - начало, Дата - окончание)...

Как при старте приложения запустить другой Activity ? - Программирование Android
Всем привет, ребят подскажите, как при запуске поменять первую запускаемую форму ? То есть чтобы сперва запускалась не main.xml(та что...

Подскажите как запустить через Inten Activity другого приложения - Программирование Android
Добрый день! весь смысл такой я могу просто запустить другое приложение, например как сейчас: Intent intent =...

Как запустить метод из Service? - Программирование Android
При запуске сервиса в onCreate запускается метод, когда он отрабатывает запускается PendingIntent.getBroadcast. Как сделать чтобы...

Как вызвать Activity не из Activity? - Программирование Android
Приложение перехватываем входящие СМС. Есть класс унаследованный от BroadcastReceiver, который обозначен в манифесте как приемник...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Agassy
0 / 0 / 0
Регистрация: 03.10.2014
Сообщений: 5
07.10.2014, 13:51  [ТС] #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
Не подскажете, что сделал не так? и куда копать далее..
Заранее благодарен!
0
Agassy
0 / 0 / 0
Регистрация: 03.10.2014
Сообщений: 5
09.10.2014, 17:45  [ТС] #3
Подскажите, пожалуйста, какие-нибудь "живые" форумы, по разработке приложений под Android.

Заранее благодарен!
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.10.2014, 17:45
Привет! Вот еще темы с ответами:

Как запустить метод из другого класса? - Программирование Android
есть класс: public class Class1 extends DialogFragment implements OnClickListener { TextView textViewMessage; String name;...

Как запустить метод в заданное время - Программирование Android
Доброго времени суток) Борюсь над задачей, в которой нужно, чтобы в указанное время запускался метод, даже если приложение было...

Как запустить метод Fragment из MainActivity? - Программирование Android
есть фрагмент с картой, в нем метод: public void Sputnik(GoogleMap map) { ...

Как запустить метод в сервисе, в определённое время? - Программирование Android
Как запускать метод в сервисе, с понедельника по пятницу в определённое время? Подскажите пожалуйста кто знает куда смотреть?


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

Или воспользуйтесь поиском по форуму:
Ответ Создать тему
Опции темы

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