【复习】Android四大组件之 BroadCast -- 广播

本文为我复习时的笔记


一、广播
1.广播定义
    在Android中,BroadCast是一种广泛运用在应用程序之间传输信息的机制,Android中我们要发送的广播内容是一个Intent
这个Intent中可以携带我们要传送的数据。
    广播实现了不同程序之间的数据传输与共享。
2.广播场景
    A.同一个app具有多个进程的不同组件之间的消息通信
    B.不同的app之间的组件之间消息通信
    
3.广播种类
    1) 普通广播(Normal Broadcast): Context.sendBroadcast
    2) 有序广播,系统广播(System Broadcast): Context.sendOrderedBroadcast
    3) 本地广播(Local Broadcast) : 只在自己app内传播


二、实现广播-receiver
1.静态注册:注册完成就一直执行(写在Mainfis中,Activity销毁了,仍然可以接受广播,甚至进程杀死了,仍然能收到广播)(不灵活)
2.动态注册:跟随activity的生命周期(在代码中调用 registerReceiver进行注册)


三、广播实现机制

1.自定义广播接收者BroadcastReceiver,并复写onRecvice()方法;
2.通过Binder机制向AMS(Activity Manager Service) 进行注册;
3.广播发送者通过Binder机制向AMS发送广播;
4.AMS查找符合相应条件(IntentFilter/Permission等)的BroadcastReceiver,将广播发送到BroadcastReciver(一般情况下是Activity)
相应的消息循环队列中;
AMS:负责Android四大组件的启动,切换,调度,以及应用程序管理调度的工作, 广播在AMS里面进行注册。 AMS是发送广播的枢纽
Binder:Android进程间通信的一种机制,是Android进程间通信的核心是客户端服务端结构(CS结构) 广播发送者通过Binder机制向AMS里发送广播
5.消息循环执行拿到此广播,回调BroadcastReceiver中的onReceive()方法。



四、LocalBroadcastManager详解
1.使用它发送的广播只在自身APP内传播,因此不必担心泄露隐私数据
2.其他App无法对你的app发送该广播,因为你的app根本就不可能接收到非自身应用发送的该广播,因此不必担心有安全漏洞可以利用
3.比系统的全局广播更加高效


源码分析:

1.LocalBroadcastManager高效的原因主要是因为它内部通过Handler实现的,它的sendBroadcast()方法含义并非和我们平时所用的一样,它的sendBroadcast()方法其实是通过Handler
发送一个Message实现的
2.既然是它内部是通过Handler来实现广播的发送的,那么相比系统广播通过Binder实现肯定高效,同时Handler来实现,别的应用无法向我们的应用发送该广播,而我们应用内的广播也不会离开
我们的应用

3.LocalBroadcastManager内部协作主要是靠这两个Map集合:mReceivers和mActions,当然还有一个List集合mPendingBroadcasts,这个主要就是存储待接收的广播对象。



通过上文 ,我们来实现一个广播,对系统进行广播,让我们的APP显示剩余电量。


public class MainActivity extends AppCompatActivity {

    myBrooadCastReceiver myBrooadCastReceiver ;
    IntentFilter filter;
    TextView text ;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        text = findViewById(R.id.dianliang);
    }

    @Override
    protected void onResume() {
        super.onResume();
        //初始化广播,并创建IntentFilter用来发送广播。
        //使用registerReceiver来注册广播,第一个参数为我们的广播,第二个参数为IntentFilter
        myBrooadCastReceiver = new myBrooadCastReceiver();
        filter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
        registerReceiver(myBrooadCastReceiver,filter);

    }

    class myBrooadCastReceiver extends BroadcastReceiver{

        @Override
        public void onReceive(Context context, Intent intent) {
            //这里就是我们腹泻的onReceive方法了 通过Intent拿到了回到
            // 它内部通过Binder机制进行进程间通讯。
            int levea = intent.getIntExtra("level",0);
            int zong = intent.getIntExtra("scale",0);
            text.setText((levea *100) / zong +"%");
        }
    }
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值