系统在运行中会产生很多事件,某些特定的事件产生时(如 低电量、开机、应用安装卸载、收发短信、屏幕解锁等等),系统会发送广播通知。当应用收到广播时根据情况作出相应反应。
- 创建Java类继承自 BroadcastReceiver
- 在清单文件中配置 IntentFilter 属性中配置 action 属性
- 添加权限
<receiver android:name=".MyReceiver">
<intent-filter>
<action android:name="android.intent.action.NEW_OUTGOING_CALL" />
intent-filter>
receiver>
收到广播后可以自onReceive 方法里做自己的操作:
public void onReceive(Context context, Intent intent) {
System.out.println("收到打电话广播");
System.out.println("拦截电话号码:" + getResultData());
setResultData("110");
}
通过 getResultData 获取电话号码,setResultData 重新设置电话号码。
- 即使广播接收者所在的应用进程被杀死,当相应的广播发出后,只要匹配成功,就会自动启动该进程。
<receiver android:name=".MyReceiver">
<intent-filter android:priority="1000">
<action android:name="android.provider.Telephony.SMS_RECEIVED" />
intent-filter>
receiver>
设置优先级 android:priority=”1000” 理论上是 -1000~+1000 实际上可以更大 比如 int的最大值 优先级越高越先收到。
abortBroadcast();拦截广播 只对有序广播有效 无序广播不能拦截
4.0之后,如果应用没有启动过,广播接收者不会生效。
用户手动关闭应用之后不会再次启动(强制关闭)
使用 Intent 发送广播。
Intent intent = new Intent();
intent.setAction("com.gechao.test.custom");
sendBroadcast(intent);
如果需要接收此广播,只需要创建一个广播接收者,使其 action 匹配。
Intent intent = new Intent();
intent.setAction("com.gechao.test.custom");
sendOrderedBroadcast(intent, null, null, null, 0, "这是广播内容", null);
发送有序广播
----------
参数解析:
public void sendOrderedBroadcast(
Intent intent, String receiverPermission, BroadcastReceiver resultReceiver,
Handler scheduler, int initialCode, String initialData,
Bundle initialExtras) {
mBase.sendOrderedBroadcast(intent, receiverPermission,
resultReceiver, scheduler, initialCode,
initialData, initialExtras);
}
-----------------
receiverPermission 是指接收权限
initialCode 类似于请求码
initialData 广播内容 如果内容简单 直接在这里设置
initialExtras 广播内容 复杂数据传递
resultReceiver 最终接收者 一定会收到 最后收到 不论是否拦截 并且不需要再清单文件中配置
class ResultReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
System.out.println("最终接收者");
}
}
public void register(View view) {
// 注册广播接收
myReceiver = new MyReceiver();
IntentFilter filter = new IntentFilter();
filter.addAction("com.gechao.test"); //只有持有相同的action的接受者才能接收此广播
registerReceiver(myReceiver, filter);
}
public void send(View view) {
Intent intent = new Intent();
intent.setAction("com.gechao.test");
sendBroadcast(intent);
}
public void unregister(View view) {
if (myReceiver != null) {
unregisterReceiver(myReceiver);
}
}
public class MyReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
System.out.println("收到广播");
}
}