BroadCastReceiver
一.广播接收者介绍
Android四大组件之一,没有可视化界面,用于不同组件和多线程之间的通信。
广播三要素:
(1)广播发送者 : 发送广播
(2)广播接收者(调频): 用于接收广播
(3)要处理的事情 :处理广播的相关信息, Intent有图对象
广播的使用场景:
(1)同一APP下多个组件之间传递数据(Activity/Fragment/Service之间传递数据)
(2)2个APP之间传递数据
技能get点:
(1)自定义广播接受者
(2)使用广播接受者进行电话拦截和短信拦截和系统电量的变化
静态注册和动态注册的区别:假如说Activity是接受者:
动态注册:
(1)广播接收者会跟Activity的生命周期的结束而结束;
(2)自由的控制注册和取消,有很大的灵活性
静态注册:
(1)广播接收者不会跟随Activity的生命周期的结束而结束,一直存在,即使应用程序关闭,也会被唤醒接受广播
(2)全局的广播
二.BroadCastReceiver实现
1.创建
通过包右键new一个Other中的BroadCast Receiver即可
public class MyReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
}
}
2.注册
(1).静态注册
在清单文件中注册广播接收者就是静态注册
<receiver
android:name=".MyReceiver"
android:enabled="true"
android:exported="true">
</receiver>
(2).动态注册
通过java代码注册广播接收者即动态注册
public class Main2Activity extends AppCompatActivity {
private MyReceiver myReceiver;
private Button send;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
initViews();
}
private void initViews() {
//创建广播接收者
myReceiver = new MyReceiver();
send = (Button) findViewById(R.id.send);
//创建广播过滤器
IntentFilter intentFilter = new IntentFilter();
//添加Action
intentFilter.addAction("com.xzk.app3");
//注册
registerReceiver(myReceiver, intentFilter);
send.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent();
intent.setAction("com.xzk.app3");
sendBroadcast(intent);
}
});
}
@Override
protected void onDestroy() {
super.onDestroy();
unregisterReceiver(myReceiver);
}
}
三.分类
从顺序上分为有序广播和无序广播(标准广播)
从作用域上分为全局广播和本地广播
1.无序广播(标准广播)
Intent intent = new Intent();
intent.setAction("com.xzk.no");
sendBroadcast(intent);
2.有序广播
Intent intent = new Intent();
intent.setAction("com.xzk.ord");
//第一个参数 intent 第二个参数 权限
sendOrderedBroadcast(intent,null);
无序广播和有序广播的区别在于使用的方法不同
无序调用sendBroadcast方法
有序调用sendOrderedBroadcast方法
有序广播的顺序在于
1.清单文件中,广播接收者的先后顺序:哪个在上,哪个先接收
2.他们的priority属性,值越大,执行顺序越靠前
priority的范围在-1000 到 1000之间
<receiver
android:name=".MyReceiver2"
android:enabled="true"
android:exported="true">
<!-- 设置优先级 -->
<intent-filter android:priority="900">
<action android:name="com.xzk.ord" />
</intent-filter>
</receiver>
3.全局广播
全局广播就是可以在其它的应用程序中接收到本程序发送的广播
我们一直举的例子就是全局广播
sendBroadcast(intent);
用sendBroadcast直接发送广播
4.本地广播
本地广播就是只能在本应用程序中获得广播,而不能被其他程序获取也不能获取其他程序的广播
需要通过LocalBroadcastManager.getInstance(this)获取到本地广播的管理者
在发送广播时,用获取到的对象发送
具体实现过程
public class LocalActivity extends AppCompatActivity {
private LocalBroadcastManager manager;
private MyLocalReceiver myLocalReceiver;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_local);
initViews();
}
private void initViews() {
//获取本地广播管理者
manager = LocalBroadcastManager.getInstance(this);
//广播接收者
myLocalReceiver = new MyLocalReceiver();
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction("com.xzk.local");
manager.registerReceiver(myLocalReceiver,intentFilter);//注册广播
}
@Override
protected void onDestroy() {
super.onDestroy();
//解除注册
manager.unregisterReceiver(myLocalReceiver);
}
public void onClick(View view) {
Intent intent = new Intent().setAction("com.xzk.local");
manager.sendBroadcast(intent);//发送广播
}
}
四.系统广播
安卓常用系统广播
https://blog.csdn.net/cc_want/article/details/82344899
(其他博主的收集)
系统在某些时候会发送相应的系统广播,下面我们就来让我们的APP接收系统广播, 接收之前,还需要为我们的APP注册广播接收器,而注册的方法又分为以下两种:动态与静态
我们只需要在广播过滤器加上系统的action 就可以实现对于某些特定的广播接收。
五.使用注意事项
不要在广播里添加过多逻辑或者进行任何耗时操作,因为在广播中是不允许开辟线程的, 当onReceiver( )方法运行较长时间(超过10秒)还没有结束的话,那么程序会报错(ANR), 广播更多的时候扮演的是一个打开其他组件的角色,比如启动Service,Notification提示, Activity等!
要开心加油