关于自定义广播接收不到的问题

博客主要讲述在Android 8.0及以上版本中,自定义广播接收不到的问题。在项目里用广播监听PCO状态值改变时,发送的广播无法接收,原因是系统对隐式广播有限制。还介绍了不同包间和同一包内接收广播的情况,以及adb发送广播的命令和参数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

关于自定义广播接收不到的问题

8.0及以上版本,自定义广播接收不到

在最近的项目中,需要使用广播监听PCO状态值的改变,发现发送的广播接收不到,查看log后,发现
Background execution not allowed: receiving Intent { act=com.hotpepper.datasaver.action.statechange flg=0x10 (has extras) } to com.android.settings/.datausage.PcoReceiver
在查阅资料后,发现是系统对隐式广播做了限制,目前查到两种方法

  1. 在不同包间接收广播
    Intent.addFlags(0x01000000);//加上这句话,可以解决在android8.0系统以上2个module之间发送广播接收不到的问题}
  2. 在同一个包内发送
intent.setComponent(new ComponentName("com.android.settings","com.android.settings.datausage.PcoReceiver"));

adb 发送广播

adb shell am broadcast -a “com.hotpepper.datasaver.action.statechange” --es prostate 1 -f 0x01000000
adb shell am broadcast 后面的参数有:

[-a ]
[-d <DATA_URI>]
[-t <MIME_TYPE>]
[-c [-c ] …]
[-e|–es <EXTRA_KEY> <EXTRA_STRING_VALUE> …]
[–ez <EXTRA_KEY> <EXTRA_BOOLEAN_VALUE> …]
[-e|–ei <EXTRA_KEY> <EXTRA_INT_VALUE> …]
[-n ]
[-f ] []

### 如何在 Xamarin.Android 中实现自定义广播接收器 要在 Xamarin.Android 中实现自定义广播接收器,可以按照以下方式构建代码逻辑。以下是关于如何注册和注销广播接收器以及处理接收到的广播事件的相关说明。 #### 注册广播接收器 可以通过两种方式进行广播接收器的注册:静态注册(在 AndroidManifest.xml 文件中声明)或动态注册(通过代码完成)。下面分别介绍这两种方法: 1. **静态注册** 静态注册需要在 `AndroidManifest.xml` 文件中配置 `<receiver>` 节点来指定广播接收器及其监听的动作。 ```xml <application> <!-- 定义广播接收器 --> <receiver android:name=".MyBroadcastReceiver"> <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED" /> <action android:name="com.example.CUSTOM_BROADCAST" /> </intent-filter> </receiver> </application> ``` 2. **动态注册** 动态注册允许程序运行时灵活控制广播接收器的行为。这通常用于临时订阅某些特定类型的广播消息。 ```csharp public class MainActivity : Activity { private MyBroadcastReceiver myBroadcastReceiver; protected override void OnCreate(Bundle savedInstanceState) { base.OnCreate(savedInstanceState); SetContentView(Resource.Layout.Main); // 初始化广播接收器实例 myBroadcastReceiver = new MyBroadcastReceiver(); // 创建 IntentFilter 对象并添加要监听的 Action 类型 var intentFilter = new IntentFilter(); intentFilter.AddAction("com.example.CUSTOM_BROADCAST"); // 注册广播接收器 RegisterReceiver(myBroadcastReceiver, intentFilter); } protected override void OnDestroy() { base.OnDestroy(); // 卸载广播接收器以防止内存泄漏 UnregisterReceiver(myBroadcastReceiver); } } ``` #### 自定义广播接收器类 创建继承于 `BroadcastReceiver` 的子类,并重写其 `OnReceive` 方法以响应广播事件。 ```csharp public class MyBroadcastReceiver : BroadcastReceiver { public override void OnReceive(Context context, Intent intent) { string action = intent.Action; if (action.Equals("com.example.CUSTOM_BROADCAST")) { Toast.MakeText(context, "Custom Broadcast Received!", ToastLength.Short).Show(); } } } ``` 上述代码展示了当应用程序接收到名为 `"com.example.CUSTOM_BROADCAST"` 的广播时触发的操作[^3]。 #### 发送广播 如果希望测试广播功能或者向其他组件发送广播,则可使用如下代码片段: ```csharp Intent broadcastIntent = new Intent("com.example.CUSTOM_BROADCAST"); SendBroadcast(broadcastIntent); // 向所有已注册该动作的接收者分发此意图对象 ``` 以上即为完整的 Xamarin.Android 下实现自定义广播接收器的过程描述与示例代码展示。 ---
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值