A类(abstract 类)
AS中创建:New>Other>BroadcastReceiver
两种类型:
- Normal broadcasts (sent with Context.sendBroadcast)
- Ordered broadcasts (sent with Context.sendOrderedBroadcast)
无序广播不可以被拦截,不可以被终止,不可以被修改,无序广播任何接收者只要匹配条件都可以接收到,无优先级问题。
如果想通过无序广播传递数据,则可以调用intent.putExtra方法传递, 接收者可通过intent.get…接收,不可通过getResultData接收。
1.标准广播
Manifest配置:
<receiver
android:name=".MyReceiver"
android:enabled="true"
android:exported="true">
//设定接收哪种广播(手动)
<intent-filter>
<action android:name="my"></action>
</intent-filter>
</receiver>
发送标准广播:
Intent intent=new Intent();
// 发送广播一般由两部分组成:1:action (指定为是那种广播); 2:data (指定广播的信息);
intent.setAction(Intent.ACTION_ANSWER);
// 系统action
// intent.setAction(Intent.ACTION_ANSWER);
// 自定义action
intent.setAction("my");
intent.putExtra("name","value");
sendBroadcast(intent);
接收标准广播:
public class MyReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// TODO: This method is called when the BroadcastReceiver is receiving
//接收多个广播时,取出action
String action = intent.getAction();
// 取出数据
String s=intent.getStringExtra("name");
// an Intent broadcast.
throw new UnsupportedOperationException("Not yet implemented");
}
}
2.有序广播
Manifest配置:
//优先级设定:android:priority=“1”
<receiver
android:name=".Broadcast.MyOrderedReceiver"
android:enabled="true"
android:exported="true" >
<intent-filter
android:priority="1">
<action android:name="my" />
</intent-filter>
</receiver>
<receiver
android:name=".Broadcast.MyOrderedReceiver2"
android:enabled="true"
android:exported="true">
<intent-filter
android:priority="2">
<action android:name="my" />
</intent-filter>
</receiver>
发送有序广播
// 有序广播发送
// new MyOrderedResultReceiver()最终的广播接收者,可以查询发送过程中的广播修改情况
// 无需manifest配置
sendOrderedBroadcast(intent,null,new MyOrderedResultReceiver(),null,1,"initialData",null);
接收无序广播
// 取出数据
String s=getResultData();
// 修改数据
setResultData("setResultData");
// 终止广播,但ResultReceiver仍可以接收广播
abortBroadcast();
3.特殊广播
对于操作频繁的广播,Manifest注册无效,只能动态注册
//屏幕被关闭之后的广播
Intent.ACTION_SCREEN_OFF;
//屏幕被打开之后的广播
Intent.ACTION_SCREEN_ON;
//充电状态,或者电池的电量发生变化
//电池的充电状态、电荷级别改变,不能通过组建声明接收这个广播,只有通过Context.registerReceiver()注册
Intent.ACTION_BATTERY_CHANGED;
示例:
//必须全局变量,因为注销广播时需要。
BroadcastReceiver broadcastReceiver;
// 创建filter对象
IntentFilter filter=new IntentFilter();
// 添加action
filter.addAction("Intent.ACTION_SCREEN_OFF");
filter.addAction("Intent.ACTION_SCREEN_ON");
// 广播接收者
broadcastReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
}
};
// 动态注册
registerReceiver(broadcastReceiver, filter);
必须执行注销操作。
@Override
protected void onDestroy() {
// 注销注册
unregisterReceiver(broadcastReceiver);
super.onDestroy();
}