大家好,现在我们开始讲解四大组件之三-广播接收者,一下是技能点大总结,让我们详细的去了解吧.
广播接收者:
1.请描述一下BroadcastReceiver
- 1.是四大组件之一,主要用于接收app发送的广播
- 2.内部通信实现机制:通过android系统的Binder机制.
3.广播分为两种:
- 无序广播
- 优点:完全异步,逻辑上可被任何接受者收到广播,效率高
- 缺点:接受者不能讲处理结果交给下一个接受者,且无法终止广播.
- 有序广播
- 按被接收者的优先级循序传播
- A>B>C,每个都有权终止广播,下一个就得不到
- 每一个都可进行修改操作,下一个就得到上一个修改后的结果.
- 无序广播
4.最终广播者:
- Context.sendOrderedBroadcast(intent,receiverPermission,resultReceiver,scheduler,initialCode,initialData,initialExtras)时我们可以指定resultReceiver为最终广播接收者.
- 如果比他优先级高的接受者不终止广播,那么他的onReceive会执行两次
- 第一次是正常的接收
- 第二次是最终的接收
- 如果优先级高的那个终止广播,那么还是依然收到一次最终的广播
5.常见的广播接收者运用场景:
- 开机启动,sd卡挂载,低电量,外拨电话,锁屏等
- 比如根据产品经理要求,设计播放音乐时,锁屏是否决定暂停音乐.
2.在mainfest和代码如何注册和使用BroadcastReceiver?-一个action是重点
1.情况文件注册(静态广播)
- 只要app还在运行,那么会一直收到广播消息
演示:
1.一个app里:自定义一个类继承BroadcastReceiver然后要求重写onReveiver方法
public class MyBroadCastReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Log.d("MyBroadCastReceiver", "收到信息,内容是 : " + intent.getStringExtra("info") + ""); } }
2.清单文件注册,并设置Action,就那么简单完成接收准备工作
<receiver android:name=".MyBroadCastReceiver"> <intent-filter> <action android:name="myBroadcast.action.call"/> </intent-filter> </receiver>
2.代码注册(动态广播)
- 当注册的Activity或者Service销毁了那么就会接收不到广播.
演示:
- 1.在和广播接受者相同的app里的MainActivity添加一个注册按钮,用来注册广播接收者
2.设置意图过滤,添加Action
//onCreate创建广播接收者对象 mReceiver = new MyBroadCastReceiver(); //注册按钮 public void click(View view) { IntentFilter intentFilter = new IntentFilter(); intentFilter.addAction("myBroadcast.action.call"); registerReceiver(mReceiver, intentFilter); }
3.销毁的时候取消注册
@Override protected void onDestroy() { unregisterReceiver(mReceiver); super.onDestroy(); }
3.在另一个app,定义一个按钮,设置意图,意图添加消息内容,意图设置action()要匹配,然后发送广播即可.
public void click(View view) { Intent intent = new Intent(); intent.putExtra("info", "消息内容"); intent.setAction("myBroadcast.action.call"); sendBroadcast(intent); }
两个app都运行之后:静
- 静态注册的方法:另一app直接发广播就收到了
- 动态注册的方法:自己的app先代码注册,然后另一个app直接发广播即可.
3.BroadCastReceiver的生命周期
- a.只有一个onReceiver, 相当的短暂,方法完成后广播接受者 就销毁,发送一次调用一次
- b.接受者不要做耗时操作,否则出现ANR
- c.也不要开启子线程进行耗时操作,因为生命周期结束后 整个进程就变进程了,容易被系统杀掉
- d.耗时较长的工作最好放在服务里.
4.如何让自己的广播只让指定的app接收?
在发送广播的app端,自定义定义权限,那么想要接收的另外app端必须声明权限才能收到.
- 1.权限,保护层级是普通正常.
- 2.用户权限
<permission android:name="broad.ok.receiver" android:protectionLevel="normal"/>
<uses-permission android:name="broad.ok.receiver" />
- 3.发送广播的时候加上权限字符串
public void click(View view) {
Intent intent = new Intent();
intent.putExtra("info", "消息内容");
intent.setAction("myBroadcast.action.call");
sendBroadcast(intent, "broad.ok.receiver");
//sendOrderedBroadcast(intent,"broad.ok.receiver");
}
其他app接收者想好获取广播,必须声明在清单文件权限
<uses-permission android:name="broad.ok.receiver"/>
5.什么是最终广播接收者
(针对有序广播来说)
- Context.sendOrderedBroadcast(intent,receiverPermission,resultReceiver,scheduler,initialCode,initialData,initialExtras)时我们可以指定resultReceiver为最终广播接收者.
- 最终接受者可能会接收到两次:第一次:按照标准的优先级接收,第二次,作为final receiver肯定会收到.
6.广播的优先级对无序广播生效吗?
- 优先级对无序也生效.
7.动态注册的广播优先级谁高?
- 谁先注册,谁就高
8.如何判断当前的BrodcastReceiver接收到的是有序还是无序的广播?
- 在onReceiver方法里,直接调用判断方法得返回值
public void onReceive(Context context, Intent intent) {
Log.d("MyBroadCastReceiver", "收到信息,内容是 : " + intent.getStringExtra("info") + "");
boolean isOrderBroadcast = isOrderedBroadcast();
}
9.总结:
- 人家app发送广播,有action;那么广播接收者当然要注册广播(动/静),并声明action才能获取到广播
- 人家发广播,有action,但是如果人家添加了权限,那么你虽然有action,但是如果没权限还是收不到,你也要懂权限字符串,并声明才行.