广播上下文注册接收器不工作

Broadcast context-registered receiver not working

我想要一个应用程序向其他几个应用程序发送广播。而且我无法让它发挥作用:-(

在发送广播的应用程序中,我只是这样做:

        sendBroadcast((new Intent("myBusiness.intent.action.MY_ACTION"))
            .putExtra("some_extra_data", "the_extra_data"), "my_receiver_permission");

在应该接收广播的应用程序中,我使用上下文注册的接收器来最小化系统负载,但它不起作用...这些应用程序以 SDK 26 为目标,我已经在多个版本上对其进行了测试。 .我在MainActivity中声明了一个成员变量class来保存正在注册的接收者:

public class MainActivity extends AppCompatActivity {
...
    public static BroadcastReceiver mMyReceiver = null;
...
}

我在 onCreate() 和 onDestroy() 方法中注册和取消注册接收器:

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        ...
        if (savedInstanceState == null) {
            ...
            this.registerReceiver(mMyReceiver = new MyReceiver(),
            new IntentFilter("myBusiness.intent.action.MY_ACTION"),
            "my_receiver_permission", null);
            ...
        }
    }

    @Override
    protected void onDestroy() {
        ...
        if (mMyReceiver != null)
            this.unregisterReceiver(mMyReceiver);
    }

并已声明接收者class:

public class MyReceiver extends BroadcastReceiver {
    public MyReceiver() {
        super();
    }

    @Override
    public void onReceive(Context context, Intent intent) {
        // And here is where I would like to do my stuff...
    }
}

因为我正在使用权限,所以我认为应用程序安装的顺序可能很重要。所以我正在做的是首先安装、执行和关闭 "receiving" 应用程序。然后我安装并执行 "broadcasting" 应用程序,然后关闭它。最后我执行了一个 "receiving" 应用程序,期望 Broacastreceiver.onReceive() 触发...但是没有...

根据 Roey 的评论,我将接收器合并到清单中并使用 FLAG_INCLUDE_STOPPED_PACKAGES 标志发送广播。如果我不使用权限来保护接收者,是什么让它起作用了。但如果我使用权限,它仍然不起作用:-( Manifest 是这样的:

<manifest ...>
...
    <uses-permission android:name="my_receiver_permission" />
    <permission android:name="my_receiver_permission"/>
...
    <application ...>
...
        <receiver
            android:name=".MyReceiver"
            android:enabled="true"
            android:exported="true"
            android:permission="my_receiver_permission">
            <intent-filter>
                <action android:name="myBusiness.intent.action.MY_ACTION" />
            </intent-filter>
        </receiver>
...
     </application>
</manifest>

知道为什么它不起作用吗? Thaaank yoouuuu

避免广播注册问题的好方法是在 APP B 的清单本身中声明意图:

 <receiver android:name=".BroadcastReceiverExample">
    <intent-filter>
        <action android:name="myBusiness.intent.action.MY_ACTION" />
    </intent-filter>
</receiver>

此外,为了确保 APP B 能够收到广播,请在发送消息之前使用以下代码添加标志:intent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES); 这样APP B即使不在后台等待也能收到广播。

终于找到了权限问题的症结所在:还必须在发送广播的应用程序的清单中声明权限...

但是,它现在适用于所有 API 最多 25 个,但不适用于 API 26 :-(