一、标准广播基本使用
1. 定义标签
public static final String TAG="com.test.broadcast";
2. 发送
//发送标准广播
Intent intent = new Intent(TAG);
intent.putExtra("DATA1","AAAAAA");
intent.putExtra("DATA2","BBBBBB");
sendBroadcast(intent);
3. 注册(接收)
public class MyBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Log.d("fxHou","收到广播 Data1="+intent.getStringExtra("DATA1"));
Log.d("fxHou","收到广播 Data2="+intent.getStringExtra("DATA2"));
}
}
IntentFilter filter = new IntentFilter();
filter.addAction(TAG);
BroadcastReceiver br = new MyBroadcastReceiver();
registerReceiver(br, filter);
4. 注销(必须要有注销,否则有可能导致内存泄漏)
unregisterReceiver(br);
二、有序广播基本使用
1. 定义标签
public static final String TAG="com.test.broadcast";
2. 发送
//发送有序广播
Intent intent = new Intent(TAG);
intent.putExtra("DATA1","AAAAAA");
intent.putExtra("DATA2","BBBBBB");
sendOrderedBroadcast(intent,null);
3. 注册(接收)
(1)高等级的接收器
public class MyBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Log.d("fxHou","收到广播 Data1="+intent.getStringExtra("DATA1"));
Log.d("fxHou","收到广播 Data2="+intent.getStringExtra("DATA2"));
}
}
IntentFilter filter = new IntentFilter();
filter.setPriority(100);//设置优先级(广播根据这个优先级,判断先通知谁,数字越大,优先级越高)
filter.addAction(TAG);
MyBroadcastReceiver br = new MyBroadcastReceiver();
registerReceiver(br, filter);
(2)低等级的接收器
public class MyBroadcastReceiverLow extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Log.d("fxHou","收到广播Low Data1="+intent.getStringExtra("DATA1"));
Log.d("fxHou","收到广播Low Data2="+intent.getStringExtra("DATA2"));
}
}
IntentFilter filter2 = new IntentFilter();
filter2.setPriority(90);//设置优先级(广播根据这个优先级,判断先通知谁,数字越大,优先级越高)
filter2.addAction(TAG);
br2 = new MyBroadcastReceiverLow();
registerReceiver(br2, filter2);
(3)打印结果
2023-02-28 17:05:13.799 28917-28917 fxHou 收到广播 Data1=AAAAAA
2023-02-28 17:05:13.799 28917-28917 fxHou 收到广播 Data2=BBBBBB
2023-02-28 17:05:13.807 28917-28917 fxHou 收到广播Low Data1=AAAAAA
2023-02-28 17:05:13.808 28917-28917 fxHou 收到广播Low Data2=BBBBBB
4. 拦截广播(高优先级拦截,不传递给低优先级)
(1)在高优先级的接收器中调用abortBroadcast();
public class MyBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Log.d("fxHou","收到广播 Data1="+intent.getStringExtra("DATA1"));
Log.d("fxHou","收到广播 Data2="+intent.getStringExtra("DATA2"));
//中止广播(拦截有序广播不往下一个接收器传递)
abortBroadcast();
}
}
(2)打印结果(低优先级的监听器监听不到广播)
2023-02-28 17:05:13.799 28917-28917 fxHou 收到广播 Data1=AAAAAA
2023-02-28 17:05:13.799 28917-28917 fxHou 收到广播 Data2=BBBBBB
5. 注销
unregisterReceiver(br);
unregisterReceiver(br2);
三、自定义权限广播
有时候我们想发一个系统广播给另外一个APP,但是又不希望所有的第三方APP都能监听到这条广播,就可以通过权限管理实现隔离。
1. 定义权限名称
public static final String MY_PERMISSION_NAME="com.my.permission.name";
2. 发送广播时,带上权限
sendBroadcast(intent,MY_PERMISSION_NAME); //标准广播,带权限
sendOrderedBroadcast(intent,MY_PERMISSION_NAME);//有序广播,带权限
3. 第三方的APP想要监听这条广播,就必须申请权限
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.soface.broadcastdemo">
<!--申请广播权限-->
<uses-permission android:name="com.my.permission.name"/>
<application
android:allowBackup="true"
android:dataExtractionRules="@xml/data_extraction_rules"
android:fullBackupContent="@xml/backup_rules"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.BroadcastDemo"
tools:targetApi="31">
<activity
android:name=".MainActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
四、本地广播
1. 指定接收器的广播
Intent intent = new Intent();
intent.setComponent(new ComponentName("com.example.youyu4", "com.example.youyu4.MyBroadcastReceiver"));//参数为包名和类名,注意类名中要包括包名
sendBroadcast(intent);
2. 应用广播
(1) 写一个监听器
public class MyBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Log.d("fxHou","收到广播 Data1="+intent.getStringExtra("DATA1"));
Log.d("fxHou","收到广播 Data2="+intent.getStringExtra("DATA2"));
}
}
(2) 注册
IntentFilter filter = new IntentFilter();
filter.addAction("TAG");
BroadcastReceiver br = new MyBroadcastReceiver();
//本地广播管理器获取实例
LocalBroadcastManager localBroadcastManager = LocalBroadcastManager.getInstance(this);
//本地广播注册方式略有不同
localBroadcastManager.registerReceiver(br,filter);
(3) 注销
ocalBroadcastManager.unregisterReceiver(br);
(4)发送广播
Intent intent = new Intent("com.example.viewmodeltest.LOCALBROADCAST_TEST");
localBroadcastManager.sendBroadcast(intent);