一、BroadcastReceiver
用于接受广播的基类
抽象类
(1)监听网络状态改变
public class NetworkStateChangeReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo ni = cm.getActiveNetworkInfo();
if (ni != null && ni.isAvailable()) {
Toast.makeText(context, "网络可用", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(context, "网络不可用", Toast.LENGTH_SHORT).show();
}
}
}
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
注册广播
IntentFilter intentFilter0 = new IntentFilter();
intentFilter0.addAction("android.net.conn.CONNECTIVITY_CHANGE");
mNetworkStateChangeReceiver = new NetworkStateChangeReceiver();
registerReceiver(mNetworkStateChangeReceiver, intentFilter0);
注销广播
@Override
protected void onDestroy() {
super.onDestroy();
unregisterReceiver(mNetworkStateChangeReceiver);
}
(2)监控程序的卸载
public class PackageRemovedReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
//静态注册,当程序没有运行时,还是能监听到系统广播
String action = intent.getAction();
if (TextUtils.equals(action, Intent.ACTION_PACKAGE_REMOVED)) {
Uri uri = intent.getData();
Toast.makeText(context, "程序 " + uri.toString() + " 被卸载",
Toast.LENGTH_SHORT).show();
}
}
}
<receiver android:name=".PackageRemovedReceiver">
<intent-filter>
<action android:name="android.intent.action.PACKAGE_REMOVED"/>
<data android:scheme="package"/>
</intent-filter>
</receiver>
(3)系统广播
intent.ACTION_BATTERY_OKAY;
intent.ACTION_BATTERY_OKAY;
intent.ACTION_BOOT_COMPLETED;//开机完成
intent.ACTION_HEADSET_PLUG;//插入耳机
intent.ACTION_PACKAGE_ADDED;//安装成功
intent.ACTION_SCREEN_OFF;//点亮
intent.ACTION_SCREEN_ON;//变暗
(4)自定义广播action
public class StudentReceiver extends BroadcastReceiver {
private Button mButton;
public StudentReceiver(Button button) {
mButton = button;
}
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (TextUtils.equals("com.netease.student.after_school", action)) {
mButton.setText("我是学生,我放学回家了");
}
}
}
Intent intent = new Intent("com.netease.student.after_school");
sendBroadcast(intent);
(5)有序广播
设置优先级 android:priority
大于-1000,小于1000
默认值为0
值越大,优先级越高
示例代码
public class DesignerReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (TextUtils.equals("com.netease.study.build", action)) {
Bundle extras = intent.getExtras();
if (extras != null) {
String msg = "设计师收到通知: type = " + extras.get("type");
Toast.makeText(context, msg, Toast.LENGTH_SHORT).show();
Bundle bundle = new Bundle();
bundle.putBoolean("isOK", true);
setResult(0, "设计师处理过了", bundle);
}
// 广播拦截
// abortBroadcast();
}
}
}
public class Builder0Receiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (TextUtils.equals("com.netease.study.build", action)) {
//获取数据
int code = getResultCode();
String data = getResultData();
Bundle bundle = getResultExtras(true);
String msg = "建造者 0 收到通知: code " + code +
"; data = " + data +
"; isOK = " + bundle.get("isOK");
Toast.makeText(context, msg, Toast.LENGTH_SHORT).show();
}
}
}
<receiver
android:name=".DesignerReceiver"
android:exported="true"
android:permission="com.netease.permission.build">
<intent-filter
android:priority="100">
<action android:name="com.netease.study.build"/>
</intent-filter>
</receiver>
public void button1Click(View v) {
//发送有序广播,并传递数据
Intent i = new Intent("com.netease.study.build");
i.putExtra("type", "school");
sendOrderedBroadcast(i, null);
}
(6)权限设置
可以安全实现跨应用的广播接受
<receiver
android:name=".DesignerReceiver"
android:exported="true"
android:permission="com.netease.permission.build">
<intent-filter
android:priority="100">
<action android:name="com.netease.study.build"/>
</intent-filter>
</receiver>
<!--使用一个权限-->
<uses-permission android:name="com.netease.permission.build"/>
<!--定义一个权限-->
<permission
android:name="com.netease.permission.build"
android:protectionLevel="normal"/>
(7)本地广播
LocalBroadcastManager
在当前进程中协助注册和发送广播
private LocalBroadcastManager mLocalBroadcastManager;
private LocalReceiver mLocalReceiver;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
mLocalBroadcastManager = LocalBroadcastManager.getInstance(this);
mLocalReceiver = new LocalReceiver();
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction("com.netease.local_broadcast");
mLocalBroadcastManager.registerReceiver(mLocalReceiver, intentFilter);
}
@Override
protected void onDestroy() {
super.onDestroy();
mLocalBroadcastManager.unregisterReceiver(mLocalReceiver);
}
public class LocalReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "局部广播接收成功", Toast.LENGTH_SHORT).show();
}
}