广播上下文注册接收器不工作
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 :-(
我想要一个应用程序向其他几个应用程序发送广播。而且我无法让它发挥作用:-(
在发送广播的应用程序中,我只是这样做:
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 :-(