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系统就会发送广播。应用程序也可以发送自定义广播,例如,通知其他应用程序它们可能感兴趣的事件(例如,下载了一些新数据)。
广播的开发可分为三步:
- 注册/注销广播
- 发送广播
- 接收广播
二、标准广播
标准广播会被所有接收者同时接收到,没有先后顺序
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