Мои приложения используют BroadcastReceiver
с Geofencing API
. BroadcastReceiver
будет вызываться, когда пользователь вводит Geofence
.Android BroadcastReceiver onReceive иногда не называется
Вчера код работает безупречно. BroadcastReceiver
обнаружить меня вводом Geofence, который я установил вокруг моего места этого код:
builder.setInitialTrigger(GeofencingRequest.INITIAL_TRIGGER_ENTER);
Geofence
setExpirationDuration(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
.
Странная часть мне нужно изменить, чтобы PendingIntent
IntentService
каждый мой 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
?
Большое спасибо за ваше время
после новой установки приложения, вы начали приложение вручную? Иногда это не работает, если вы сначала не запускаете приложение. –
Спасибо за ответ. Приложения будут запускаться автоматически, потому что я запускаю его из 'android studio', что я подразумеваю под« вручную »- это удаление старого« APK »перед запуском нового из« android studio ». –