广播接收器(Broadcast Receiver)
标准广播(Normal Broadcasts)完全异步的广播。广播发出后,所有的广播接收器几乎同时接收到这条广播
有序广播(Ordered Broadcasts)同步广播。同一时刻只有一个广播接收器能接收到这条广播。这个接收器处理完后,广播才会继续传递。
注册广播。在代码中注册称为动态注册。在AndroidManifest.xml中注册称为静态注册。
动态注册的刚波接收器一定要取消注册。在onDestroy()方法中调用unregisterReceiver()方法来取消注册。
创建广播接收器:调用onReceive()方法,需要一个继承BroadcastReceiver()的类。
不要在
onReceive()方法中添加过多的逻辑操作或耗时的操作。因为在广播接收器中不允许开启线程,当
onReceive()方法运行较长时间而没结束时,程序会报错。因此广播接收器一般用来打开其他组件,比如创建一条状态栏通知或启动一个服务。
标准广播
新建一个MyExampleReceiver继承自BroadcastReceiver。
public
class
MyExampleReceiver
extends
BroadcastReceiver
{
@Override
public void onReceive(Context context, Intent intent){
Toast.makeText(context,"Got it",Toast.LENGTH_SHORT).show();
//abortBroadcast();
}
}
abortBroadcast();可以截断有序广播
在AndroidManifest.xml中注册广播接收器;name里填接收器的名字。
可以设置广播接收器优先级:
<intent-filter android:priority="100">
<receiver android:name=".MyExampleReceiver">
<intent-filter>
<action android:name="com.rust.broadcasttest.MY_BROADCAST"/>
</intent-filter>
</receiver>
让接收器接收到一条“
com.rust.broadcasttest.MY_BROADCAST
”广播。
发送自定义广播(标准广播)时,要传送这个值。例如:
Intent intent = new Intent("com.rust.broadcasttest.MY_BROADCAST");
sendBroadcast(intent);
发送有序广播,应当调用sendOrderedBroadcast();
Intent intent = new Intent("com.rust.broadcasttest.MY_BROADCAST");
sendOrderedBroadcast(intent,null);
本地广播
广播只能在应用程序
内部进行传递,并且广播接收器也只能接收到来自本应用程序发出的广播。
本地广播无法静态注册。比全局广播更加高效。
用LocalBroadcastManager管理广播。将其实例化getInstance(),调用发送广播和注册广播接收器的方法。
--> sendBroadcast();--> registerReceiver();
在配置文件中声明权限,程序才能访问一些关键信息。
例如允许查询系统网络状态。
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
机器开机广播
<uses-permission android:name="android.permission.BOOT_COMPLETED">
允许一个程序打开窗口使用 TYPE_SYSTEM_ALERT,显示在其他所有程序的顶层
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
如果没有申请这些权限,程序有可能会意外关闭。并弹出对话框。