知识点1.广播的应用范围
(1)广播可用于接收系统广播
(2)广播可用于监听/接收APP发出的广播(同应用或不同应用)
(3)广播可用于多线程通信
知识点2.广播的简单流程
首先消息处理者将自己注册到AMS
(Activity Manager Service 推荐阅读),再之后有消息发送者,发送一个广播到AMS,AMS从包名、action等属性中找到相匹配的注册的消息处理者,并把这个消息发给它,消息处理者接收到广播后再进行接下来处理
知识点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中已经失效