Android四大组件--Broadcast介绍


Android系列文章

本博客将围绕Android Security展开,介绍APP/Framework/BSP相关基础知识,博主比较懒但会认真保证质量

Android四大组件–Activity启动与停止
Android四大组件–Broadcast介绍
Android四大组件–服务
加密算法介绍及应用–RSA算法


一、Broadcast概述

Android中所讲的广播和生活中的广播一样,比如地铁每到一站就会播报当前的站信息,地铁上的乘客都可以听到,但乘客一般只关心广播播报的是不是与自己目的地相同(选择性接收广播信息),这就是Android中的标准广播;另一种为有序广播,与标准广播的一次发送,所有人同时收到不同,有序广播的接收者具有优先级,然找优先级由高到低的顺序依次接收广播,高优先级的接收者可以阻断广播继续传播。
Android官网关于广播有如下介绍

Android App可以接收或发送来自于Android系统或其他App的广播消息(Broadcast message),类似于发布-订阅设计模式。这些广播会在相关事件发生时发送。例如,当系统启动或设备开始充电等各种系统事件发生时,Android系统就会发送广播。应用程序也可以发送自定义广播,例如,通知其他应用程序它们可能感兴趣的事件(例如,下载了一些新数据)。

广播的开发可分为三步:

  1. 注册/注销广播
  2. 发送广播
  3. 接收广播

二、标准广播

标准广播会被所有接收者同时接收到,没有先后顺序

2.1 注册广播

广播注册可分为静态注册和动态注册两种

2.1.1 静态注册广播

AndroidManifest.xml中注册广播称为静态注册,静态注册的广播只需要应用被安装上时,App甚至还没有launch就可以开始接收广播。

注意: 也正因为这种特性,过多的注册静态广播会延长系统启动时间、影响系统性能,所以一般不推荐使用静态注册。

注册方法为在AndroidManifest.xml文件中application标签内添加receiver标签,写明接收器类名,并指定意图的action

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">

    <application
    ...
        <!--静态注册广播接收者-->
        <receiver android:name=".StaticReceiver"
            android:exported="true">
            <intent-filter>
                <!--定义一个标记-->
                <action android:name="com.example.customizedaction"/>
            </intent-filter>
        </receiver>
    </application>

</manifest>

2.1.2 动态注册广播

动态注册广播是指利用Android提供的API注册,动态注册和静态注册同样需要指定接收者和指定action,一般注册在onCreate()方法中完成

public class MainActivity extends AppCompatActivity implements View.OnClickListener{
    private static final String TAG = MainActivity.class.getSimpleName();
    //UpdateReceiver类是BroadcastReceiver的子类,重写了onReceive()方法,执行收到广播后的处理
    private UpdateReceiver updateReceiver = new UpdateReceiver();
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

		//指定动作,此处为自定义的动作,则需要手动发送该动作的广播;
		//也可以指定一个系统广播,如Intent.ACTION_TIME_TICK,系统时间分钟改变将发送一次广播,
		//系统广播因为是系统自动发送,不需要我们手动发送广播
        IntentFilter intentFilter = new IntentFilter();
        intentFilter.addAction("com.example.updatabroadcast");
        registerReceiver(updateReceiver, intentFilter);
    }
}

onCreate()中完成注册的广播,应在onDestory()完成注销,防止内存泄漏

    protected void onDestroy() {
        super.onDestroy();
        unregisterReceiver(updateReceiver);
    }

2.2 发送广播

发送广播针对的是自定义的广播类型,比如上文注册中,静态注册的自定义action为com.example.staticreceiver,动态注册的action为com.example.updatabroadcast,发送对应action的广播即可

//1.发送上文中静态注册的广播
//静态注册的自定义广播,指定注册时的同样action
Intent intent = new Intent("com.example.customizedaction");
//发送时需要指定接收者的包名
intent.setPackage(getPackageName());
sendBroadcast(intent);

//2.发送上文中动态注册的广播
//指定相同的action
Intent intent = new Intent("com.example.updatabroadcast");
sendBroadcast(intent);

2.3 接收广播

广播的接收也很简单,自定义一个继承BroadcastReceiver类的子类,子类名称我们在注册时已经指定,重写onReceiver()方法

public class UpdateReceiver extends BroadcastReceiver {
    private static final String TAG = UpdateReceiver.class.getSimpleName();
    @Override
    public void onReceive(Context context, Intent intent) {
    	//当收到广播后打印如下日志
        Log.i(TAG, "UpdateReceiver onReceive");
    }
}

三、有序广播

有序广播会根据注册的优先级,高优先级的接收者会先收到广播

有序广播和标准广播的开发内容一致,同样是注册、发送、接收三部分,不过需要在注册时指定优先级,发送的方法改为sendOrderedBroadcast()

3.1 注册广播

3.1.1 静态注册广播

同样在AndroidManifest.xml中完成注册,以BOOT_COMPLETED为例,当系统启动完成后会发出该广播,我们可以指定接收它,并指定优先级,优先级越大就越先接收到该广播:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
	<application>
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
            <!--静态注册广播接收者-->
        <receiver android:name=".CustomReceiver"
            android:exported="true"
            android:enabled="true">

            <intent-filter android:priority="10">
                <!--指定为BOOT_COMPLETED广播-->
                <action android:name="android.intent.action.BOOT_COMPLETED"/>
            </intent-filter>
        </receiver>
    </application>

</manifest>

3.1.2 动态注册广播

与静态注册相比,只需要增加优先级设置

public class MainActivity extends AppCompatActivity implements View.OnClickListener{
    private static final String TAG = MainActivity.class.getSimpleName();
    private UpdateReceiver updateReceiver = new UpdateReceiver();
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        IntentFilter intentFilter = new IntentFilter();
        intentFilter.setPriority(8);	//设置优先级,值越大优先级越高
        intentFilter.addAction("com.example.updatabroadcast");
        registerReceiver(updateReceiver, intentFilter);
    }
}

3.2 发送广播

有序广播的发送需要使用sendOrderedBroadcast()方法

Intent intent = new Intent("com.example.updatabroadcast");
//第一个参数intent指定发送广播的action
//第二个参数为receiverPermission,可以要求接收者具备相关权限才能接收此广播
sendOrderedBroadcast(intent,null);

在静态注册中指定权限

<receiver android:name=".CustomReceiver" android:permission="com.example.MY_PERMISSION">

在动态注册中指定权限,使用registerReceiver()的另一个重载版本指定权限

registerReceiver(myReceiver, filter, "com.example.MY_PERMISSION", null);

四、参考

https://developer.android.google.cn/develop/background-work/background-tasks/broadcasts
https://developer.android.google.cn/reference/android/content/Context

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值