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

针对Android8.0中广播接收的限制,本文介绍了两种解决方案:一是使用动态广播替代静态广播;二是保留静态广播并添加Component或Package参数。此外,还提供了一种通过设置特定Flag来发送广播的方法。

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

1. 问题的前提:

本人维护的一个应用是通过按键发送一个自定义广播,然后拉起服务。原来项目开发是在Android6,但是安装到Android8上面,死活收不到广播。

2.原因:

Android8在静态广播的使用上做了一些限制具体可查看Google:Android 8.0 功能和 API

3. 解决办法:

(1)使用动态广播代替静态广播。

(2)保留原来的静态广播,但是加入Component或者Package参数

看下方式2的实现:

广播Action定义:com.test.broadcast

广播接收方应用包名:com.example.broadcasttest

广播接收方接收器包名+类名路径:com.example.broadcasttest.MyBroadcast

以上定义需要替换为你实际项目中广播接收方的包名和广播接收器类名。

如下是发送方的代码:

Intent intent = new Intent("com.test.broadcast");
intent.setComponent(new ComponentName("com.example.broadcasttest",
                        "com.example.broadcasttest.MyBroadcast"));
sendBroadcast(intent);

或者以下实现方式发送也可以:

Intent intent = new Intent("com.test.broadcast");
intent.setPackage("com.example.broadcasttest");
sendBroadcast(intent);

当然你对广播源码有了解的话也可以这样实现:

Intent intent = new Intent("com.test.broadcast");
intent.addFlags(0x01000000);
sendBroadcast(intent);

第三种加的是如下的flag,没被豁免的隐式广播之所以发送不出去,是因为源码中加了这个标志位判断,所以我们加上以后广播发送正常,但是因为该flag是隐藏的,所以需要硬编码使用。(个人不建议这样做)

/**
 * If set, the broadcast will always go to manifest receivers in background (cached
 * or not running) apps, regardless of whether that would be done by default.  By
 * default they will only receive broadcasts if the broadcast has specified an
 * explicit component or package name.
 *
 * NOTE: dumpstate uses this flag numerically, so when its value is changed
 * the broadcast code there must also be changed to match.
 *
 * @hide
 */
public static final int FLAG_RECEIVER_INCLUDE_BACKGROUND = 0x01000000;

参考文章:

      博客1:Android 8.0 功能和 API

      博客2:Android8.0广播使用

      博客3:Android8.0后静态注册广播的用法

### 如何在 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 下实现自定义广播接收器的过程描述与示例代码展示。 ---
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值