静态广播接收器无法接收自定义意图

6

我的广播接收器似乎没有接收到它正在监听的意图。

我启动了一个必须一直运行的后台服务。每当服务被杀死时,它会向我的广播接收器发送一个意图,然后重新启动服务。

这是我的服务的onDestroy

@Override
public void onDestroy() {
    Log.i(TAG, "onDestroy");
    sendBroadcast(new Intent("com.myapp.app.RESTART_SERVICE"));
    stoptimertask();
    super.onDestroy();
}

这是我的广播接收器:

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 Manifest 中重要的部分:

<receiver
    android:name=".RestarterBroadcastReceiver"
    android:enabled="true"
    android:exported="true">
    <intent-filter>
        <action android:name="com.myapp.app.RESTART_SERVICE"/>
    </intent-filter>
</receiver>

为什么我的广播接收器没有收到意图?

@kelalaka 在广播类中的哪里?内容应该是什么? - mind
在Activity中,onDestroy可能永远不会被调用。OnDestroy - kelalaka
但是正如你所看到的,我正在记录“Service onDestroy”,并且我能够看到这个信息。但是我没有看到“Service stops, restarting service…”的信息。 - mind
在启动服务时,使用START_STICKY标志,以便在服务停止时自动重新启动。 - olfek
@daka 已经在做了,服务仍然被杀死。 - mind
1个回答

4
你的问题可能是因为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>

希望这可以帮助你!

这似乎适用于我的情况。在开发者指南中也提到了:https://developer.android.com/guide/components/broadcasts - mind

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接