Статический BroadcastReceiver не получает настраиваемое намерение

Мой 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 не получает намерение?

@kelalaka Где, в классе трансляции? Каким должен быть контент?

mind 27.10.2018 00:10

по деятельности. onDestroy никогда не может быть вызван. OnDestroy

kelalaka 27.10.2018 00:16

Но, как видите, я веду журнал «Service onDestroy» и вижу это. Но я не добираюсь до "Служба останавливается, перезапускает службу ..."

mind 27.10.2018 00:30

Вместо этого используйте флаг START_STICKY при запуске службы, чтобы она перезапустилась в случае остановки.

daka 27.10.2018 23:24

@daka Уже делаю, сервис все равно убит.

mind 27.10.2018 23:47
3
5
1 497
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Ваша проблема может заключаться в том, что 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

mind 27.10.2018 23:50

Другие вопросы по теме