定义
Broadcast(广播)
:一种广泛应用在应用程序之间传输信息的机制;
BroadcastReceiver(广播接收器)
:用于接收来自系统和其他应用的广播,并对其进行响应的组件。
注册
1.定义广播接收者
继承BroadcastReceiver
,实现自定义的广播接收者,实现onReceive()
方法用于接受广播
public class ExampleBroadcastReceiver extends BroadcastReceiver {
private static final String TAG = ExampleBroadcastReceiver.class.getSimpleName();
private static final String ACTION_BOOT = "android.intent.action.BOOT_COMPLETED";
@Override
public void onReceive(Context context, Intent intent) {
if (ACTION_BOOT.equals(intent.getAction())) {
Log.i(TAG, "receive boot completed broadcast");
Toast.makeText(context, "system boot completed.", Toast.LENGTH_LONG).show();
}
}
}
当
onReceive()
方法执行完成之后,ExampleBroadcastReceiver
生命周期结束可能会被系统回收,所以onReceive()
中不建议进行异步操作;另外,由于ANR限制,onReceive()
方法必须在10秒内执行完成。2.静态注册
在AndroidManifest.xml中注册
- 静态方式注册广播,即使应用未启动,也能接收到广播,所以可以利用广播作为应用的自启动和保活机制。
- android:name:表示自定义的广播接收者类
- action:指定了接收的广播类型,这里表示接受系统开机启动广播
- uses-permission:声明我们需要使用到接收开机状态的权限
public class ExampleActivity extends AppCompatActivity {
private ExampleBroadcastReceiver myReceiver;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
myReceiver = new ExampleBroadcastReceiver();
IntentFilter filter = new IntentFilter();
filter.addAction("android.intent.action.BOOT_COMPLETED");
registerReceiver(myReceiver, filter);
}@Override
protected void onDestroy() {
super.onDestroy();
unregisterReceiver(myReceiver);
}
}
- 在Activity的
onCreate()
中通过registerReceiver
注册广播,并指定监听的广播类型;最后在onDestory()
中关掉广播监听 - 动态方式注册广播,用户可以在需要使用时进行注册,不再使用后关闭掉广播监听,使用上更为灵活
无序广播
无序广播是一种异步执行方式,所有广播接收者几乎都能同时接收到该广播,没有先后顺序,直到没有接收者再接受广播则广播结束。
- 发送广播
public void sendCustomBroadcast(View view){ Intent intent = new Intent("com.example.broadcast"); sendBroadcast(intent); }
有序广播是一种同步执行方式,广播发送之后,同一时刻只会有一个广播接收者在执行广播接收,广播执行者按照优先级顺序进行广播接收,而且在接收的过程中可以截断广播,后面的接收者就无法再接收到该广播。
- 声明广播接收者优先级
在IntentFilter
中通过android:priority
指定优先级,值越大优先级越高
- 发送广播
public void sendOrderBroadcast(View view){ Intent intent = new Intent("com.example.broadcast"); sendOrderBroadcast(intent); }
- 截断广播
@Override public void onReceive(Context context, Intent intent) { abortBroadcast(); }
在广播接收者的onReceive()
方法中,可以通过调用abortBroadcast()
方法截断广播,优先级较低的广播接收者就无法再接收到该广播
本地广播是一种局部广播,只能在本应用内部传播,广播接收者也只能接收本应用内部的广播,由于这一特点,所以本地广播不支持静态注册方式。
- 注册本地广播接收者
public class ExampleActivity extends AppCompatActivity { private ExampleBroadcastReceiver myReceiver; private LocalBroadcastManager localBroadcastManager; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); myReceiver = new ExampleBroadcastReceiver(); IntentFilter filter = new IntentFilter(); filter.addAction("android.intent.action.BOOT_COMPLETED"); localBroadcastManager = LocalBroadcastManager.getInstance(this); localBroadcastManager.registerReceiver(intent, filter); }@Override protected void onDestroy() { super.onDestroy(); localBroadcastManager.unregisterReceiver(myReceiver); } }
通过LocalBroadcastManager.getInstance()
或者本地广播管理的实例,使用该实例来注册广播接收者
- 发送广播
private void sendBroadcast() { Intent intent = new Intent("com.example.broadcast"); localBroadcastManager.sendBroadcast(intent); }
【Android基础知识梳理-四大组件之BroadcastReceiver】前面了解了几种广播类型,我们可以知道,当所有广播接收者处理完广播接收之后则广播结束。也就是说,只有在发送前已完成注册的广播接收者才能接收到该广播。那么如果我们在某种情况下,广播接收者注册晚于广播发送时间,但是我们又想接收到该广播,该如何处理呢?这里就需要使用到粘性广播。
- 粘性广播在发送之后会保存刚发送过的广播,当有新注册的广播接收者注册后可以继续使用该广播,直到该广播被移除;
- 粘性广播只会保存最后一次的广播,也就是说如果在某个广播接收者注册前,发送了多条同样的广播,那么广播接收者注册后只能接收到最后一条;
- 粘性广播通过
sendStickyBroadcast()
发送广播,removeStickyBroadcast()
移除广播,且需要添加权限
推荐阅读
- 有礼品哦!全新界面工具包 Jetpack Compose 使用情况调研
- 资讯|俄罗斯 Android 系统受限,或将转用 HarmonyOS()
- 笔记|app web 互调js 的web源码
- c++|一文读懂 Android FFmpeg 视频解码过程与实战分析
- Charles 某音最新版本抓包环境搭建
- github|github太慢了(两种方式解决这个痛!.)
- Android Freezer 简介
- Android小项目|Android页面的跳转
- 在 Android TV 上构建优秀的播放体验|中文字幕视频