Android四大组件————广播简单案例
一、标准广播基本使用
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 {@Overridepublic 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 {@Overridepublic 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 {@Overridepublic 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 {@Overridepublic 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"/><applicationandroid: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"><activityandroid: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 {@Overridepublic 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);