Статический BroadcastReceiver не получает пользовательское намерение - PullRequest
0 голосов
/ 26 октября 2018

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

1 Ответ

0 голосов
/ 28 октября 2018

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

Надеюсь, это поможет!

...