Мой BroadcastReceiver, похоже, не получает намерение, которое он прослушивает.
Я запускаю фоновую службу, которая должна работать постоянно. Всякий раз, когда служба уничтожается, она отправляет намерение моему BroadcastReceiver, который затем перезапускает службу.
Вот onDestroy
моего сервиса:
@Override
public void onDestroy() {
Log.i(TAG, "onDestroy");
sendBroadcast(new Intent("com.myapp.app.RESTART_SERVICE"));
stoptimertask();
super.onDestroy();
}
Вот мой BroadcastReceiver:
public class RestarterBroadcastReceiver extends BroadcastReceiver {
public RestarterBroadcastReceiver() {
}
@Override
public void onReceive(Context context, Intent intent) {
Log.i(TAG, "Service stopped, restarting...");
context.startService(new Intent(context, ActivityRecognitionService.class));
}
}
И важная часть манифеста Android:
<receiver
android:name = ".RestarterBroadcastReceiver"
android:enabled = "true"
android:exported = "true">
<intent-filter>
<action android:name = "com.myapp.app.RESTART_SERVICE"/>
</intent-filter>
</receiver>
Почему мой BroadcastReceiver не получает намерение?
по деятельности. onDestroy никогда не может быть вызван. OnDestroy
Но, как видите, я веду журнал «Service onDestroy» и вижу это. Но я не добираюсь до "Служба останавливается, перезапускает службу ..."
Вместо этого используйте флаг START_STICKY при запуске службы, чтобы она перезапустилась в случае остановки.
@daka Уже делаю, сервис все равно убит.
Ваша проблема может заключаться в том, что Android Oreo эффективно запретил неявные трансляции. Самый простой способ исправить это - использовать явную трансляцию вместо неявной.
Попробуйте изменить код onDestroy
вашей службы на следующий:
@Override
public void onDestroy() {
Log.i(TAG, "onDestroy");
// Here you're using an explicit intent instead of an implicit one
sendBroadcast(new Intent(getApplicationContext(), RestarterBroadcastReceiver.class));
stoptimertask();
super.onDestroy();
}
Поскольку вы больше не используете действие намерения, вы также можете изменить свой манифест Android на следующее:
<receiver
android:name = ".RestarterBroadcastReceiver"
android:enabled = "true"
android:exported = "true">
</receiver>
Надеюсь это поможет!
Кажется, это применимо к моему случаю. Это также упоминается в руководстве для разработчиков: developer.android.com/guide/components/broadcasts
@kelalaka Где, в классе трансляции? Каким должен быть контент?