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

时间:2017-09-19 18:11:56

标签: android broadcastreceiver

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

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

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

在应该接收广播的应用中,我使用上下文注册的接收器来最小化系统负载,但它无法正常工作......这些应用针对的是SDK 26,我已在多个版本上对其进行了测试。我在MainActivity类中声明了一个成员变量来保持接收器的注册:

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);
    }

并宣布了接收器类:

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...
    }
}

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

根据Roey的评论,我将接收器合并到Manifest中,并使用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

2 个答案:

答案 0 :(得分:0)

避免广播注册问题的好方法是在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不在后台等待,APP B也会收到广播。

答案 1 :(得分:0)

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

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

相关问题