0

Мои приложения используют BroadcastReceiver с Geofencing API. BroadcastReceiver будет вызываться, когда пользователь вводит Geofence.Android BroadcastReceiver onReceive иногда не называется

Вчера код работает безупречно. BroadcastReceiver обнаружить меня вводом Geofence, который я установил вокруг моего места этого код:

builder.setInitialTrigger(GeofencingRequest.INITIAL_TRIGGER_ENTER); 

GeofencesetExpirationDuration(Geofence.NEVER_EXPIRE) и radius является 1609 Meter (1 миля)

Сегодня я удалил приложение и запустить точно такой же код снова, на тот же компьютер и такое же устройство. Я наткнулся на тот факт, что BroadcastReceiver's onReceive так и не получил вызов.

Я проверил подключение к интернету, которое в порядке. Я пробовал clean, rebuild и make project на android studio и вручную удалять APK перед запуском android studio, но BroadcastReceiver все еще не работает.

Существует важный момент, я узнал:

breakpoint я положил внутрь onReceive включен (обычный красный), но не действует (красный с галочкой). Это link того, что я имею в виду.

Вчера (когда тот же самый код работает), то точки останова является действительным.

Затем я попытался использовать IntentService вместо BroadcastReceiver (я поделюсь с кодом их обоих позже в этом вопросе). IntentService называется, поэтому работает мой PendingIntent.

После этого я попытался снова использовать BroadcastReceiver, а BroadcastReceiver работает отлично, как вчера. Теперь иногда иногда называют BroadcastReceiver.

Странная часть мне нужно изменить, чтобы PendingIntentIntentService каждый мой BroadcastReceiver не работает, чтобы сделать мой BroadcastReceiver начала работать снова.

И как только он начинает работать снова, BroadcastReceiver все еще называется даже с меньшим (250 Метром) radius. Так что я думаю, что radius не проблема.

Я пытался отладить onReceive и выяснили breakpoint должен быть valid (не только enabled), чтобы сделать свою работу BroadcastReceiver. Другими словами, если точка останова равна enabled (не valid), тогда onReceive никогда не будет вызываться.

Это, как я называю BroadcastReceiver:

Intent intent = new Intent("mypackage.ACTION_RECEIVE_GEOFENCE"); 
    PendingIntent geofencePendingIntent = PendingIntent.getBroadcast(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); 

    LocationServices.GeofencingApi.addGeofences(
      mGoogleApiClient, 
      getGeofencingRequest(), 
      geofencePendingIntent 
    ).setResultCallback(this); 

И это, как я называю IntentService:

 Intent intent = new Intent(this, GeofenceUpdateService.class); 
     PendingIntent geofencePendingIntent = PendingIntent.getService(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); 

     LocationServices.GeofencingApi.addGeofences(
       mGoogleApiClient, 
       getGeofencingRequest(), 
       geofencePendingIntent 
     ).setResultCallback(this); 

И это мой manifest, которые содержат оба IntentService и BroadcastReceiver:

 <service android:enabled="true" android:name="mypackage.GeofenceUpdateService" /> 

     <receiver android:name="mypackage.GeofenceUpdateReceiver" 
      android:exported="false"> 
      <intent-filter > 
       <action android:name="mypackage.ACTION_RECEIVE_GEOFENCE"/> 
      </intent-filter> 
     </receiver> 

I не опубликуйте onReceive или onHandleIntent, потому что проблема не в том коде, но почему этот метод иногда не набирается.

Как сделать мой BroadcastReceiver работать более стабильным? (всегда работает)

Или есть ли обходной путь? Должен ли я просто использовать IntentService?

Большое спасибо за ваше время

+0

после новой установки приложения, вы начали приложение вручную? Иногда это не работает, если вы сначала не запускаете приложение. –

+0

Спасибо за ответ. Приложения будут запускаться автоматически, потому что я запускаю его из 'android studio', что я подразумеваю под« вручную »- это удаление старого« APK »перед запуском нового из« android studio ». –

ответ

1

Проверьте этот ответ, как это кажется, что вы не знакомы с тем, как работает Android Do I need to acquire wake lock when invoking a BroadcastReceiver.

И затем используйте WakefulBroadcastReceiver вместо BroadcastReceiver и проверьте, не помогает ли он.

+0

Большое спасибо за вашу помощь. Я уверен, что устройство все еще просыпается (экран не спит), когда я тестировал свой «BroadcastReceiver». Я попытаюсь использовать 'WakefulBroadcastReceiver' и дам вам знать –

Смежные вопросы