记:BroadcastReceiver中知识点梳理

2019-01-04  本文已影响10人  爱吃板栗的小女孩
知识点1.广播的应用范围

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

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

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

广播发送流程.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。发送广播的方式静动一致。

  <receiver android:name=".MyBroadcastReceiver">
      <intent-filter>
          <action android:name="danny" />
      </intent-filter>
  </receiver>

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

<receiver 
    android:enabled=["true" | "false"]
//此broadcastReceiver能否接收其他App的发出的广播
//默认值是由receiver中有无intent-filter决定的:如果有intent-filter,默认值为true,否则为false
    android:exported=["true" | "false"]
    android:icon="drawable resource"
    android:label="string resource"
//继承BroadcastReceiver子类的类名
    android:name=".mBroadcastReceiver"
//具有相应权限的广播发送者发送的广播才能被此BroadcastReceiver所接收;
    android:permission="string"
//BroadcastReceiver运行所处的进程
//默认为app的进程,可以指定独立的进程
//注:Android四大基本组件都可以通过此属性指定自己的独立进程
    android:process="string" >

//用于指定此广播接收器将接收的广播类型
//本示例中给出的是用于接收网络状态改变时发出的广播
 <intent-filter>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
    </intent-filter>
</receiver>
知识点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.优先级高的接收到后可拦截,也可修改。之后广播收到都是拦截或修改后的

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

<receiver android:name=".SystemReceiver" >
     <intent-filter android:priority="100">
         <action android:name="danny" />
     </intent-filter>
</receiver>

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

@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中已经失效

上一篇 下一篇

猜你喜欢

热点阅读