Android BroadcastReceiver广播接收器的两种注册方式

BroadcastReceiver广播接收器

用于监听/接受Android应用分发的各类广播并做出相应的响应

应用场景:

  • 监听系统事件:如开机广播,网络链接与断开,屏幕转向灯
  • 不同组件间(Activity/Service,包括不同APP间)的通信
  • 多线程通信

先自定义一个广播接收器,创建MyBroadcastReceiver类来继承广播接收器类,并实现它内部的方法

public class MyBroadcastReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {

    }
}

广播接收器的注册方法分为静态注册动态注册两种方式

静态注册

AndroidManifest.xml文件的<application>标签内声明

    <!--静态注册广播接收器-->
    <receiver
        android:name=".MyBroadcastReceiver">

        <!--接受哪些广播-->
        <intent-filter>
            <!--开机广播-->
            <action android:name="android.intent.action.BOOT_COMPLETED"/>
            <!--电量低广播-->
            <action android:name="android.intent.action.BATTERY_LOW"/>
        </intent-filter>
    </receiver>

完成注册后就可以在MyBroadcastReceiver类中接受广播实现相关功能

public class MyBroadcastReceiver extends BroadcastReceiver {

    private static final String TAG = "MyBroadcastReceiver";

    @Override
    public void onReceive(Context context, Intent intent) {
        // 接受广播
        if (intent != null) {
            // 接收到的什么广播(广播的名称)
            String action = intent.getAction();
            Log.d(TAG, "onReceive: " + action);
        }
    }
}

这里已经可以通过意图对象来接受广播信息并进行处理了

动态注册

动态注册在onCreate()方法里进行注册

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // 新建一个广播接收器
        broadcastReceiver = new MyBroadcastReceiver();

        // 要接收哪些广播
        IntentFilter intentFilter = new IntentFilter();
        /// 电量低广播
        intentFilter.addAction(Intent.ACTION_BATTERY_LOW);

        // 注册广播接收器
        registerReceiver(broadcastReceiver, intentFilter);
    }

动态注册的广播接收器必须要在onDestroy()方法里面取消注册
注册和取消注册要一一对应,不然会报错,内存会泄漏

    @Override
    protected void onDestroy() {
        super.onDestroy();
        // 取消注册广播接收器
        if (broadcastReceiver != null) {
            unregisterReceiver(broadcastReceiver);
        }
    }

动态注册不需要在AndroidManifest.xml文件里声明,直接通过代码进行注册。对于接收广播进行处理也是在创建的MyBroadcastReceiver类里面,这点跟静态注册一样

广播生命周期

BroadcastReceiver的生命周期很短暂,该类的onReceive()方法是运行在主线程中,如果在该方法里的操作超过了10s,会阻塞主线程,出现ANR程序无响应情况
如果需要进行耗时操作,可以通过Intent传递给Service进行处理,尽量不要在该方法中开启线程进行处理,否则10s后,该线程有可能会变陈空线程,导致任务丢失

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值