Android BroadCastReceiver的基本使用

Android BroadCastReceiver的基本使用

参考连接:https://www.jianshu.com/p/ca3d87a4cdf3

一、定义:

Android四大组件之一,用于不同组件或者多线程之间的通信

Android广播分为两个方面:广播发送者和广播接收者,通常情况下,BroadcastReceiver指的就是广播接收者

二、自定义广播接收者BroadcastReceiver

1 继承BroadcastReceivre基类

2 必须复写抽象方法onReceive()方法

说明:(1) 广播接收器接收到相应广播后,会自动回调 onReceive() 方法

  (2 )一般情况下,onReceive方法会涉及 与 其他组件之间的交互,如发送Notification 启动Service

(3) 默认情况下,广播接收器运行在 UI 线程,因此,onReceive()方法不能执行耗时作,否则将导致ANR

// 继承BroadcastReceivre基类

public class MyBroadcastReceiver extends BroadcastReceiver{
    @Override
    public void onReceive(Context context, Intent intent) {
        Log.e("MyBroadcastReceiver","onReceive");
    }

}
三、注册广播接收者

1.静态注册(Android 8.0 静态注册不可以,建议动态注册)

 

<receiver android:name=".MyBroadcastReceiver">
    <intent-filter>
    <action android:name="com.example.action.broadcast"/>
    </intent-filter>
</receiver>

 

2.动态注册

// 选择在Activity生命周期方法中的onResume()中注册
@Override
protected void onResume(){
    super.onResume();

    // 1. 实例化BroadcastReceiver子类 &  IntentFilter
    
mBroadcastReceiver = new MyBroadcastReceiver();
    IntentFilter intentFilter = new IntentFilter();

    // 2. 设置接收广播的类型
    
intentFilter.addAction("com.example.action.broadcast");

    // 3. 动态注册:调用Context的registerReceiver()方法
    
registerReceiver(mBroadcastReceiver, intentFilter);
}


    // 注册广播后,要在相应位置记得销毁广播
// 即在onPause() 中unregisterReceiver(mBroadcastReceiver)
// 当此Activity实例化时,会动态将MyBroadcastReceiver注册到系统中
// 当此Activity销毁时,动态注册的MyBroadcastReceiver将不再接收到相应的广播。
    
@Override
    protected void onPause() {
        super.onPause();
        //销毁在onResume()方法中的广播
        
unregisterReceiver(mBroadcastReceiver);
    }

3.发送广播

@Override
public void onClick(View view) {
    switch (view.getId()) {
        case R.id.btn_main_send:
            Intent intent = new  Intent();
            //设置intent的动作为com.wpl.brodercastnotificationdemo.BROADCAST,可以任意定义
            
intent.setAction("com.example.action.broadcast");
            //发送无序广播
            
sendBroadcast(intent);
            break;
        default:
            break;
    }
}

 

说明:(onResume()注册、onPause()注销是因为onPause()App死亡前一定会被执行,从而保证广播在App死亡前一定会被注销,从而防止内存泄露。

(1)不在onCreate() & onDestory() onStart() & onStop()注册、注销是因为:
当系统因为内存不足(优先级更高的应用需要内存,请看上图红框)要回收Activity占用的资源时,Activity在执行完onPause()方法后就会被销毁,有些生命周期方法onStop()onDestory()就不会执行。当再回到此Activity时,是从onCreate方法开始执行。

(2)假设我们将广播的注销放在onStop()onDestory()方法里的话,有可能在Activity被销毁后还未执行onStop()onDestory()方法,即广播仍还未注销,从而导致内存泄露。

(3)但是,onPause()一定会被执行,从而保证了广播在App死亡前一定会被注销,从而防止内存泄露。

注意:android:enabled: 
这个属性用于定义系统是否能够实例化这个广播接收器,如果设置为true,则能够实例化,如果设置为false,则不能被实例化。默认值是true 
<application>元素有它自己的enabled属性,这个属性会应用给应用程序的所有组件, 
包括广播接收器。<application><receiver>元素的这个属性都必须是true,这个广播接收器才能够被启用。如果有一个被设置为false,该广播接收器会被禁止实例化。 
android:exported: 
这个属性用于指示该广播接收器是否能够接收来自应用程序外部的消息,如果设置true,则能够接收,如果设置为false,则不能够接收。如果设置为false,这该接收只能接收那些由相同应用程序组件或带有相同用户ID的应用程序所发出的消息。

4.区别



 源码地址:https://download.csdn.net/download/silence_sep/10435392

 

猜你喜欢

转载自blog.csdn.net/silence_sep/article/details/80433319