Android学习笔记之Broadcast Receiver

2018-10-19  本文已影响0人  sssssss_

内容目录

  1. 广播的定义
  2. 广播的用途(信息传输与共享通知
  3. 广播的使用场景
  4. 广播主要的种类(普通广播有序广播本地广播
  5. 注册广播接收 (静态接收动态接收)
  6. 广播的发送(sendBroadcastsendOrderBroadcast
  7. 广播内部实现机制
  8. AMS 是什么?
  9. 本地广播 LocalBroadcastManager
  10. 全局广播的缺点
  11. BroadcastReceiver 和 LocalBroadcastReceiver 区别
  12. BroadCastReceiver 的生命周期
  13. 广播传输的数据是否有限制,是多少,为什么要限制?

1.广播的定义


2.广播的用途

  1. 广播实现了不同程序之间的信息传输与共享,只要和发送广播的 action 相同的接收者,都能接收到这个广播。典型的应用就是 android 自带的短信,电话等等广播,只要我们实现了他们的 action 的广播,那么我们就能接收他们的数据了,以便做出一些处理。比如说拦截系统短信,拦截骚扰电话等。
  2. 作为通知的作用,比如在 Service 中要通知主程序、更新主程序的 UI 等,因为 Service 是没有界面的,所以不能直接获得主程序中的控件,这样我们就只能在主程序中实现一个广播接收者专门用来接收service发过来的数据和通知了。

3.广播的使用场景

  1. 同一app内部的同一组件内的消息通信(单个或多个线程之间)(可用handler解决);
  2. 同一app内部的不同组件之间的消息通信(单个进程)(可用EventBus);
  3. 同一app具有多个进程的不同组件之间的消息通信;
  4. 不同app之间的组件之间的消息通信;
  5. Android系统在特定情况下与App之间的消息通信。

4.广播主要的种类


4、注册广播接收 (静态和动态)

4.1两种注册方法的区别

4.2静态注册具体步骤

public class MyReceiver extends BroadcastReceiver {
        //onReceive 不能做过多的耗时操作,10秒没响应就ANR
    public void onReceive(Context context, Intent intent) {
        Toast.makeText(context, "boot complete", Toast.LENGTH_SHORT).show();
    }
}
<receiver
    android:name=".MyReceiver">
    <intent-filter>
        <action android:name="android.intent.action.BOOT_COMPLETED" />
    </intent-filter>
</receiver>

4.3 动态注册

    protected void onCreate() {
       myBroadcastReceiver ChangeReceiver = new myBroadcastReceiver();
       IntentFilter intentFilter = new IntentFilter();
        intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
        registerReceiver(ChangeReceiver, intentFilter);
    }
    //在onDestroy()中要取消注册,否则会引起内存泄漏。
    protected void onDestroy() {
        unregisterReceiver(networkChangeReceiver);
    }
    //ChangeReceiver就是接收后会怎么样怎么样
    class myBroadcastReceiver extends BroadcastReceiver {
        public void onReceive(Context context, Intent intent){
        //to do
        }
     }

5、广播的发送

1.标准广播(异步)

//通过sendBroadcast发送标准合家欢广播
Intent intent = new Intent("com.example.songsong.MY_BROADCAST");
sendBroadcast(intent);

2.有序广播(同步)

//通过sendOrderBroadcast发送
Intent intent = new Intent("com.example.songsong.MY_BROADCAST");
sendOrderBroadcast(intent,null);
    /*给广播接收器设置优先级 */
    <intent-filter android:priority="100">
        <action android:name="com.example.broadcasttest.LOCAL_BROADCAST" />
    </intent-filter>
//广播接收器截断:
public void onReceive(Context context, Intent intent) {
    abortBroadcast();
}

3.本地广播

//发送1:实例化localBroadcastManager
LocalBroadcastManager localBroadcastManager = LocalBroadcastManager.getInstance(this);
//发送2:发送广播
Intent intent = new Intent("android.net.conn.CONNECTIVITY_CHANGE");
localBroadcastManager.sendBroadcast(intent);
//接收1:实例化IntentFilter和接收器LocalReceiver
IntentFilter intentFilter = new IntentFilter(); 
LocalReceiver localReceiver  = new LocalReceiver();
//接收2:设置广播接收类型
intentFilter.addAction(android.net.conn.CONNECTIVITY_CHANGE);
//接收3:进行动态注册本地广播
localBroadcastManager.registerReceiver(localReceiver, intentFilter);
//接收4:在onDestroy中取消注册
localBroadcastManager.unregisterReceiver(localReceiver);
//接收5:在localReceiver中继承BroadcastReceiver并重写onReceiver。
...

6.广播内部实现机制

  1. 自定义广播接收者 BroadcastReceiver,并复写 onRecvice();
  2. 通过 Binder 机制向 AMS(Activity Manager Service) 注册广播;
  3. 通过 Binder 机制向 AMS(Activity Manager Service) 发送广播。
  4. AMS 查找符合相应条件(IntentFilter/Permission等)的BroadcastReceiver,将广播发送到BroadcastReceiver 所在的消息循环队列中。
  5. BroadcastReceiver 所在消息队列拿到此广播后,回调它的 onReceive() 方法。

7.AMS 是什么?

AMS(Activity Manager Service):是贯穿Android系统组件的核心服务,负责启动四大组件启动切换调度。


8.本地广播 LocalBroadcastManager


9.全局广播的缺点


10.BroadcastReceiver 和 LocalBroadcastReceiver 区别



11.Broadcast Receiver能在onReceive中执行耗时任务吗?

BroadcastReceiver 在 10 秒内没有执行完毕,Android 会认为该程序无响应ANR,所以在 onReceive 通常是不能开启线程的,一般是通过 service 或者 IntentService 来处理。


12.BroadCastReceiver 的生命周期


13.广播传输的数据是否有限制,是多少,为什么要限制?


本文参考资料:

上一篇 下一篇

猜你喜欢

热点阅读