一,广播
1,广播定义
Broadcast是一种广泛运用的在应用程序之间传输信息的机制,Android中我们要发送的广播内容是一个Intent,这个Intent中可以携带我们要传送的数据。(其实类似于观察者模式,当被观察者数据变化时,会通知所有观察者。)
2,使用场景
可以在同一个app具有的多个进程的不同组件之间的通信机制。
不同APP之间的组件之间消息通信。
3,广播种类
(1),普通广播 Normal Broadcast : Context.sendBroadcast,
(2),有序广播 System Broadcast : Context.sendOrderedBroadcast
广播有先后顺序,前面的广播可以对后续的广播进行截断,防止其继续广播,权限高的会获得广播信息。
动态注册时:filter.setPriority(100);//设置权限 权限值为-1000~1000
静态注册时:android:priority="100"
截断方法是在OnReceive()方法中添加:abortBroadcast();
(3),本地广播 Local Broadcast : 只在自身APP内传播
二,实现广播-receiver
静态注册:在Manifest.xml中注册,注册完成就一直运行,及时activity或进程杀死,也会运行。
<receiver android:name=".MainActivity$DemoReceiver"
android:enabled="true" //能接收到信息
android:permission="com.cn.customview.permissions.MY_BROADCAST" //设置广播权限
android:exported="true"> //能接收其他apk发送的广播
<intent-filter>
<action android:name="com.example.Broad"/>
</intent-filter>
</receiver>
class DemoReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Log.e(TAG,"onReceive:内部接收" );
}
}
动态注册:在代码中调用方法注册的,跟随actvity的生命周期,一定要在onDestroy注销
三,动态注册内部实现机制
1,自定义广播接受者BroadcastReceiver,并复写onRecvice()方法;
class DemoRecceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Log.e(Tag,"onReceive:内部接收");
}
}
2,接收者通过Binder机制向AMS(Activity Manager Service)进行注册;
IntentFilter filter=new IntentFilter("com.example.Broad");//广播过滤器,只能接收com.example.Broad发出的广播
receiver=new DemoRecceiver();
registerReceiver(receiver,filter);
3,广播发送者通过Binder机制向AMS发送广播;
Intent intent=new Intent("com.example.Broad");
intent.putExtra("name","HelloWorld");
sendBroadcast(intent);
4,AMS查找符合想要条件的BroadcastReceiver,将广播发送到BroadcastReceiver相应的消息循环队列中;
5,消息循环拿到此广播,回调BroadcastReceiver中的onReceive()方法。
6,不需要广播时在onDestroy里注销
unregisterReceiver(receiver);
四,LocalBroadcastManager详解
发送方:
LocalBroadcastManager localManager=LocalBroadcastManager.getInstance(this);
Intent localIntent=new Intent("com.example.Broad");
localManager.sendBroadcast(localIntent);
接收方:
IntentFilter localFilter=new IntentFilter("com.example.Broad");
LocalReceiver localReceiver=new LocalReceiver();
localManager.registerReceiver(localReceiver,localFilter);
1,只在自身APP传播,不必担心泄露隐私数据
2,其他APP不可以向本身APP发送该广播,所有本身APP不会接受其他APP发送的该广播,不必担心安全漏洞被利用
3,比系统的全局广播更高效
因为它内部是通过Handler实现的,它的sendBroadcast()方法是通过Handler发送了一个Message实现的。
所以,比系统广播通过Binder实现要高效,同时,因为使用Handler实现,别的应用就无法向我们的应用发送该广播,本身应用发送的广播也不会离开自身应用。
内部主要靠两个Map集合:
HashMap<BroadcastReceiver, ArrayList<ReceiverRecord>> mReceivers
HashMap<String, ArrayList<ReceiverRecord>> mActions
还有一个List集合
ArrayList<BroadcastRecord> mPendingBroadcasts 这个主要存储待接收的广播对象。
五,权限机制
1,防止被其他程序监听自身广播造成的数据泄露:
发送方:
Intent intent=new Intent("com.example.Broad");
intent.putExtra("temp","Lin");
sendBroadcast(intent,"com.broadcast.permissions.BROADCAST_AA");//设置权限
接收方:
<protected-broadcast android:name="com.example.Broad" />
<uses-permission android:name="com.broadcast.permissions.BROADCAST_AA"/>
<permission android:name="com.broadcast.permissions.BROADCAST_AA" />
2,防止其他程序恶意发送该广播,造成频繁启动广播接收程序
静态注册时设置广播权限:android:permission="com.cn.customview.permissions.MY_BROADCAST"
动态注册时设置权限:registerReceiver(receiver,filter,"com.broadcast.permissions.BROADCAST_AA");