系列文章目录
前言
探究 Android 的广播机制,有静态注册和动态注册。
一、动态注册广播
注册广播:
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction("com.example.broadcastbestpractice.FORCE_OFFLINE");
receiver = new ForceOfflineReceiver();
registerReceiver(receiver, intentFilter);
动态注册的广播接收器一定要取消注册,可以在onDestroy() 方法或者 onPause() 等方法通过调用unregisterReceiver() 方法来实现。
protected void onPause() {
//当一个活动失去栈顶位置时,就取消广播器的注册
super.onPause();
if(receiver != null) {
unregisterReceiver(receiver);
receiver = null;
}
}
创建一个继承于BroadcastReceiver 的类,并重写 onReceive() 方法:
class ForceOfflineReceiver extends BroadcastReceiver {
@Override
public void onReceive(final Context context, Intent intent) {
//响应的逻辑
}
}
二、静态注册
在程序未启动时就可以接收广播,但必须在 AndroidManifest.xml 中注册才可以使用。
例如开机广播:
<receiver>
android:name=".BootCompleteReceiver"
android:enabled="true"
android:exported="true"
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED"/>
</intent-filter>
</receiver>
Enabled 属性表示是否启用这个广播接收器。
Exported 属性表示是否允许这个广播接收器接收本程序以外创建的广播。
三、发送自定义广播
sendBroadcast(new Intent("com.example.broadcasttest.MY_BROADCAST");
然后在AndroidManifest.xml中修改:
<intent-filter>
<action android:name="com.example.broadcasttest.MY_BROADCAST"/>
</intent-filter>
1、发送有序广播
把 sendBroadcast(intent) 换成 sendOrderedBroadcast(intent, null) ,在AndroidManifest.xml中添加优先级:
<intent-filter android:priority="100">
<action android:name="com.example.broadcasttest.MY_BROADCAST"/>
</intent-filter>
在onReceive() 方法中添加 abortBroadcast() 方法,可以将这条广播截断。
2、发送本地广播
只有在本程序中才能传递,
在MainActivity.java中
public class MainActivity extends AppCompatActivity {
private LocalReceiver localReceiver;
private LocalBroadcastManager localBroadcastManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
localBroadcastManager = LocalBroadcastManager.getInstance(this); //获取实例
// private NetworkChangeReceiver networkChangeReceiver;
Button button = findViewById(R.id.button);
button.setOnClickListener(v -> {
//发送自定义广播
Intent intent = new Intent("com.example.broadcasttest.LOCAL_BROADCAST");
localBroadcastManager.sendBroadcast(intent);//发送本地广播
// Toast.makeText(MainActivity.this, "aaaaa", Toast.LENGTH_SHORT).show();
});
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction("com.example.broadcasttest.LOCAL_BROADCAST");
localReceiver = new LocalReceiver();
localBroadcastManager.registerReceiver(localReceiver, intentFilter);// 注册本地广播监听器
}
@Override
protected void onDestroy() {
super.onDestroy();
localBroadcastManager.unregisterReceiver(localReceiver);
}
class LocalReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "received local broadcast", Toast.LENGTH_SHORT).show();
}
}
}
总结
略