Android开发 - Broadcast的使用

文章目录

    • Android开发 - Broadcast的使用
      • 前言
        • 1. Android 8.0 新特性
        • 2. 静态广播
          • 2.1. 接收器
          • 2.2. 注册
          • 2.3. 发送广播
          • Android 8.0 静态广播
        • 3. 动态广播
          • 3.1. 接收器
          • 3.2. 注册广播
          • 3.3. 注销广播
          • 3.4. 发送广播

Android开发 - Broadcast的使用

前言

  • 本博客示例代码详情参见Project-foodlist
  • 记录一下Android 8.0(SDK 26+)后的Broiadcast的不同以及使用

1. Android 8.0 新特性

  • Android 8.0 新特性

    从清单文件中移除广播接收器

    由于 Android 8.0 引入了新的广播接收器限制,因此您应该移除所有为隐式广播 Intent 注册的广播接收器。将它们留在原位并不会在构建时或运行时令应用失效,但当应用运行在 Android 8.0 上时它们不起任何作用。显式广播 Intent(只有您的应用可以响应的 Intent)在 Android 8.0 上仍以相同方式工作。这个新增限制有一些例外情况。如需查看在以 Android 8.0 为目标平台的应用中仍然有效的隐式广播的列表,请参阅隐式广播例外。

2. 静态广播

以下2.1-2.3部分内容Android 8.0 以上不适用,Android 8.0 在此稍作修改,后面会介绍到。

2.1. 接收器

在静态广播类StaticReceiver 中重写onReceive 方法,当接收到对应广播时进行数据处理,产生通知。

public class StaticReceiver extends BroadcastReceiver {
    private static final String STATICACTION = "com.example.petter.broadcast.MyStaticFilter";
    @Override
    public void onReceive(Context context, Intent intent) {
        if (intent.getAction().equals(STATICACTION) ){
              //do something
        }
    }
}
2.2. 注册

在AndroidMainfest.xml 中进行注册。

<receiver android:name=".StaticReceiver">
    <intent-filter>
        <action android:name="com.example.petter.broadcast.MyStaticFilter" />
    </intent-filter>
</receiver>
2.3. 发送广播

利用bundle 和intent 将图片与文字内容发送出去

Intent intentBroadcast = new Intent(STATICACTION); //定义Intent
//可选择, 利用bundle传递数据
// Bundle bundelse = new Bundle();
// intentBroadcast.putExtras(bundles);
sendBroadcast(intentBroadcast);

参考代码中的STATICATION 为自己设定的广播名称。

Android 8.0 静态广播

由于Android 8.0废除大部分静态广播,对于代码需要修改某些部分

  • 发送广播部分需要设置ComponetName
    Intent intent = new Intent(STATICACTION);
    intent.setComponent(new ComponentName("com.example.petter.broadcast", "com.example.petter.broadcast.StaticReceiver"));
    sendBroadcast(intent);
    
  • ComponetName(“自定义广播的包名”, “自定义广播的路径”)

3. 动态广播

3.1. 接收器

实现BroadcastReceiver子类(这里命名为DynamicReceiver),并且重写onReceive方法,修改方法与静态广播类中类似。

public class DynamicReceiver extends BroadcastReceiver {
    private static final String DYNAMICACTION = "com.example.petter.broadcast.MyDynamicFilter";
    
    @Override
    public void onReceive(Context context, Intent intent) {
        if (intent.getAction().equals(DYNAMICACTION)) {    //动作检测          
            // do something
        }    
    }
}
3.2. 注册广播
IntentFilter dynamic_filter = new IntentFilter();
dynamic_filter.addAction(DYNAMICACTION);    //添加动态广播的Action
DynamicReceiver dynamicReceiver = new DynamicReceiver();
registerReceiver(dynamicReceiver, dynamic_filter);    //注册自定义动态广播消息
3.3. 注销广播
unregisterReceiver(dynamicReceiver);

其中dynamicReceiver 为我们之前实例的DynamicReceiver类。用registerReceiverunregisterReceiver分别对其进行注册与注销。

3.4. 发送广播
Intent intentBroadcast = new Intent();   //定义Intent
intentBroadcast.setAction(DYNAMICACTION);
// 可以使用bundle传送数据
sendBroadcast(intentBroadcast);

你可能感兴趣的:(Android开发)