Android开发四大组件——broadcastReceiver基本使用介绍

本文介绍了Android中广播的动态和静态注册方式,特别强调了从Android8.0开始对静态注册的限制,即不允许使用隐式广播。动态注册广播在Activity中完成,而静态注册在Manifest文件中声明。文章还展示了如何发送隐式和显式广播,并提供了示例代码。
摘要由CSDN通过智能技术生成

问题背景

安卓日常开发和学习过程中,可能会时不时的用到或者接触到广播。通常理解广播有动态注册和配置文件中静态注册两种方式。本文会对两种方式进行介绍。

问题分析

首先看下Google官方声明: Beginning with Android 8.0 (API level 26), the system imposes additional restrictions on manifest-declared receivers. If your app targets API level 26 or higher, you cannot use the manifest to declare a receiver for most implicit broadcasts (broadcasts that do not target your app specifically). 翻译如下: 从Android 8.0(API级别26)开始,系统对清单声明的接收器施加了额外的限制。如果您的应用程序以API级别26或更高为目标,则不能使用清单声明大多数隐式广播(不以应用程序为目标的广播)的接收方。 也就是说,从Android 8.0开始,系统对广播的静态注册做了限制,如果使用了自定义静态注册广播,那么不能通过隐式广播的方式进行接收

问题解决

1、广播动态注册使用

(1)定义自己的广播接收类,代码如下:

/**
 * @author baorant
 */
public class MyBroadcastReceiver2 extends BroadcastReceiver {
    private static final String TAG = "MyBaorantReceiver2";

    @Override
    public void onReceive(Context context, Intent intent) {
        Log.d(TAG, "MyBroadcastReceiver2 onReceive begin");
    }
}

(2)在activity中动态注册,配置action,代码如下:

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        ...
        registerBroadReceiver();
    }

    private void registerBroadReceiver() {
        IntentFilter intentFilter = new IntentFilter();
        intentFilter.addAction("MyBroadcastReceiver2");
        MyBroadcastReceiver2 myBroadcastReceiver = new MyBroadcastReceiver2();
        registerReceiver(myBroadcastReceiver, intentFilter);
    }
}

(3)在本应用或者其他应用中可以发送隐式广播,代码如下:

sendBroadBtn5.setOnClickListener(v -> {
            Intent intent = new Intent("MyBroadcastReceiver2");
            sendBroadcast(intent);
        });

运行结果如下: image.png

2、广播静态注册使用

(1)定义自己的广播接收类,代码如下:

/**
 * @author baorant
 */
public class MyBroadcastReceiver extends BroadcastReceiver {
    private static final String TAG = "TestBaorantBroadcastReceiver";

    @Override
    public void onReceive(Context context, Intent intent) {
        Log.d(TAG, "TestBaorantBroadcastReceiver onReceive begin");
    }
}

(2)manifest中进行静态注册,代码如下:

<receiver android:name=".MyBroadcastReceiver"
            android:exported="true">
            <intent-filter>
                <action android:name="baorant"/>
            </intent-filter>
        </receiver>

(3)本应用或者三方应用中进行显示广播,代码如下:

// setPackage方式
        sendBroadBtn3.setOnClickListener(v -> {
            Intent intent = new Intent("baorant");
            intent.setPackage("com.baorant.providerapplication");
            sendBroadcast(intent);
        });

        // setComponent方式
        sendBroadBtn4.setOnClickListener(v -> {
            Intent intent = new Intent("baorant");
            intent.setComponent(new ComponentName("com.baorant.providerapplication", "com.baorant.providerapplication.MyBroadcastReceiver"));
            sendBroadcast(intent);
        });

运行结果如下: image.png

问题总结

本文对四大组件之一的广播进行了简单介绍,包括动态注册广播,以及对Android 8.0以后系统对静态广播的限制,禁用了隐式广播访问静态注册的广播接收器,介绍了两种显示访问静态注册的广播接收器的方式。有兴趣的同学可以进一步深入研究。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值