Android面试四(BroadCast)

一,广播

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");

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值