Android四大组件————广播简单案例

本文介绍了Android中四种广播的使用方法:标准广播、有序广播、自定义权限广播和本地广播。标准广播是全局的,有序广播则按优先级顺序执行,允许接收器拦截。自定义权限广播增加了安全层,限制了广播的接收者。本地广播则只在应用内部传播,更高效安全。每种广播的注册、发送、接收和注销过程都有详细阐述。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、标准广播基本使用

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);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

绝命三郎

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值