记:BroadcastReceiver中知识点梳理

知识点1.广播的应用范围

(1)广播可用于接收系统广播
(2)广播可用于监听/接收APP发出的广播(同应用或不同应用)
(3)广播可用于多线程通信

知识点2.广播的简单流程

首先消息处理者将自己注册到AMS(Activity Manager Service 推荐阅读),再之后有消息发送者,发送一个广播到AMS,AMS从包名、action等属性中找到相匹配的注册的消息处理者,并把这个消息发给它,消息处理者接收到广播后再进行接下来处理

记:BroadcastReceiver中知识点梳理_第1张图片
广播发送流程.jpg

知识点3.如何声明一个广播

自定义类继承BroadcastReceiver即可

public class MyBroadcastReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        // 接收到广播后,则自动调用该方法
        Toast.makeText(context,"收到",Toast.LENGTH_SHORT).show();
    }
}
知识点4.广播的分类

分为静态广播动态广播
静态广播
静态广播只需要把自定义的广播注册到Manifest中即可。
静态广播生命周期是整个APP,不随Activity销毁而消失。也有说即使APP被关掉仍可以接收到,此说法从3.1可能会不好用,并且各个手机现在都定制系统会管制。除非那些大厂被加入白名单中。
动态广播
动态广播注册是在activity中。注册一般在onResume(),销毁在onPause()这是因为onPause()一定会执行,而onStop()和onDestory()在activity非正常销毁可能不会执行。如果不销毁会由于广播仍存在,导致内存溢出。activity关闭,广播结束

知识点5.静态广播使用方法:

使用上述自定义的MyBroadcastReceiver注册到Manifest。发送广播的方式静动一致。

  
      
          
      
  

静态广播的属性全说明(参考自https://www.jianshu.com/p/ca3d87a4cdf3)



//用于指定此广播接收器将接收的广播类型
//本示例中给出的是用于接收网络状态改变时发出的广播
 

    

知识点6.动态广播使用方法:
注册:
    @Override
    protected void onResume() {
        super.onResume();
        //动态广播注册在onResume
        receiver = new MyBroadcastReceiver();
        IntentFilter intentFilter = new IntentFilter("danny");
        registerReceiver(receiver, intentFilter);
    }
销毁:
   @Override
    protected void onPause() {
        super.onPause();
        //动态广播销毁在onPause
        unregisterReceiver(receiver);
    }
知识点7.广播的分类(包含如何发送广播)

1.普通广播
特点
a.需要包含注册和发送
b.action可自定义,发送与注册时保持一致即可
c.接收异步,不一定哪个广播先收到消息
注册可采用静态或动态方法,下面列举如何发送,注册要和发送时传递的action能对上

  Intent intent = new Intent();
  intent.setAction("danny");
  sendBroadcast(intent);

2.系统广播
特点
a.只包含注册,不包含手动调用发送,会在系统定义的action发送改变时,自动调用并回调进onReceive()。若人为调用会保错
b.action是系统定义好的(需要时可查找https://www.jianshu.com/p/ca3d87a4cdf3)
c.动态注册或静态注册都可以

3.有序广播
特点
a.发送广播按照优先级,若优先级相同,动态注册>静态注册
b.优先级高的接收到后可拦截,也可修改。之后广播收到都是拦截或修改后的

有序广播优先级设置-静态注册


     
         
     

有序广播优先级设置-动态注册

@Override
protected void onResume() {
   super.onResume();
   //动态广播注册在onResume
   receiver = new My4BroadcastReceiver();
   IntentFilter intentFilter = new IntentFilter("lalala");
   intentFilter.setPriority(100);
   registerReceiver(receiver, intentFilter);
}

有序广播发送sendOrderedBroadcast()有2个重载函数

  Intent intent = new Intent();
  intent.setAction("danny");
  sendOrderedBroadcast(intent,null);

4.APP应用内广播
特点
a.只能在同一APP内接收发送
如何设置
a.将exported设为false,android:exported="false"
b.发送和接收增加permission
c.发送指定包名,intent.setPackage(packageName)

5.粘性广播
在Android5.0 & API 21中已经失效

你可能感兴趣的:(记:BroadcastReceiver中知识点梳理)