简介:
Broadcast是用于接收广播的组件,用于组件和组件之间的通信,可以跨应用程序传递。如操作系统电池电量低会发送一个广播,这样我们的程序就可以去监听这个广播,然后程序可以做相应的事儿。
需要掌握的类:BroadcastRecevier,开发利器。
BroadcastRecevier创建
- 系统提供的Broadcast是抽象类,需要重写
onReceive(Context context, Intent intent)
方法,这个方法可以得到随广播而来的数据
Broadcast注册
- 静态注册
- 特点:是当程序退出后,广播依然存在,直至用户卸载
- 注册方式:在AndriodManifest文件中
<receiver
android:name="com.mixm.activity.BroadCastT3"
android:exported="true" >
<intent-filter android:priority="4" >
<action android:name="all" >
</action>
</intent-filter>
</receiver>
说明:android:exported=”true” 是否只接收本应用的广播 android:priority=”4”:优先级
- 动态注册
- 特点:该广播只在应用中有效,退出广播后不再接收广播
- 注册方式:动态注册需要在代码中动态的指定广播地址并注册
注册
Recevier r = new Recevier();
IntentFilter filter = new IntentFilter();
filter.addAction("all");
registerReceiver(r, filter);
解除注册
@Override
protected void onDestroy() {
super.onDestroy();
try {
this.unregisterReceiver(r);
} catch (Exception e) {
//不做任何处理
}
}
- 注意:registerReceiver 是 android.content.ContextWrapper 类中的方法, Activity 和 Service都继承了 ContextWrapper,所以可以直接调用。在实际应用中,我们在 Activity 或 Service 中注册了一个 BroadcastReceiver,当这个 Activity 或 Service 被销毁时如果没有解除注册,系统会报一个异常,提示我们是否忘记解除注册了。所以,记得在特定的地方执行解除注册操作
广播的发送
广播的发送和接收都是跨进程的,一个app发送的广播,其他的app只要有权限和action匹配都可以接收到该广播。
- 发送标准广播
Intent intent = new Intent(this, BroadCastT1.class);
sendBroadcast(intent); //这个方法是上下文中的
- 发送有序广播
第一种方式
Intent intent = new Intent();
intent.setAction("all");
intent.putExtra("data", "heiheiheiheida");
sendBroadcast(intent, receiverPermission);
说明:receiverPerssion:是否需要接受者需要选取相应的权限才可以收到广播
第二种方式
sendOrderedBroadcast(intent, receiverPermission, resultReceiver, scheduler, initialCode, initialData, initialExtras);
说明:由于发送广播的时候,中间可能会被接受者拦截,resultReceiver指定一个这个广播的最终接受者,最终接收者肯定会接收到。其余的参数暂且给0或者null。 - 注意:
- 发送有序广播时,先接到广播的可以取消广播,导致后面的优先级低的广播接收者不会接到广播。
abortBroadcast(); //放弃当前的广播,则优先级低的无法收到当前广播
- 如果优先级高的广播想给优先级低的广播接收者传递数据,可以通过以下方法:
setResult();
setResultData()
setResultCode()
setResultExtras();
广播的分类
- 普通广播
说明:普通广播对于多个接收者来说是完全异步的,通常每个接收者都无需等待即可以接收到广播,接收者相互之间不会有影响。对于这种广播,接收者无法终止广播,即无法阻止其他接收者的接收动作。
- 有序广播
说明:有序广播比较特殊,它每次只发送到优先级较高的接收者那里,然后由优先级高的接收者再传播到优先级低的接收者那里,优先级高的接收者有能力终止这个广播可以使用 intent-filter 里面的 android:priority=”1000”去解决
使用方式:
- 可以通过
android:priority
属性指定广播接收者的接收顺序,值较大的广播接收者会优先接收 - 每个广播接受者是有序接收广播,如果中间使用
abortBraodcast()
方法会终止广播,即后面的接收者不会再收到广播。 - 每个接收者接收的intent都是从发送方发送的同一个intent对象,每个接收者都是孤立的,它们之间不可以互相接收intent。
注意:
- 静态注册的广播接收者 app 一旦安装在系统,则可以接收到指定的广播。不管这个 app 有没有启动。 2、动态注册的广播接收者只有在注册完成后才能接收到广播,当注册他的组件销毁的时候,广播接收者也应该解除注册。
- 如果接收者处于一个非前台的状态下,就不能随便创建实例化可视化的view,包括alertDialog,可以创建notification对象。