Android四大组件之BroadcastReceiver

2019-10-04  本文已影响0人  彭空空

导读

BroadcastReceiver简介

BroadcastReceiver(广播接收器)是Android四大组件之一,通过广播的方式进行消息传递,其本质是一个全局的监听器,可以监听到各种广播,可以用来实现不同组件之间的通信。广播最大的特点就是发送方并不关心接收方是否接到数据,也不关心接收方是如何处理数据的,通过这样的形式来达到接、收双方的完全解耦合。

广播接收者:

public class MyReceivre  extends BroadcastReceiver{

    // 复写onReceive()方法,接收到广播后,则自动调用该方法
    @Override
    public void onReceive(Context context, Intent intent) {
        //写入接收广播后的操作
    }
}

注册方式

静态注册(AndroidManifest.xml注册广播并添加接收的广播)
在配置文件中注册的接收者的特点是即使应用程序已被关闭,该接收者依然可接受它感兴趣的广播,比如手机电池电量的广播接收者,没有必要将某个程序开启。

 <receiver android:name=".MyReceivre">
      <intent-filter>
           <!--屏幕被打开之后的广播-->
           <action android:name="android.intent.action.ACTION_SCREEN_ON"/>
      </intent-filter>
</receiver>

动态注册广播
在Activity中绑定接收者必须依附该应用程序存在,或者一个BroadcastReceiver用于更新UI,就没有必要再程序关闭时接收者还运行,故无需在AndroidManifest.xml中注册而可以放在Activity/Service中注册。
对于动态广播,有注册就必然得有注销,否则会导致内存泄露,重复注册、重复注销也不允许。

public class MainActivity extends AppCompatActivity {

    private MyReceivre mMyReceivre;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //1.实例化BroadcastReceiver子类 &  IntentFilter
        mMyReceivre = new MyReceivre();
        IntentFilter intentFilter = new IntentFilter();
        //2.设置接收广播的类型
        intentFilter.addAction(Intent.ACTION_SCREEN_ON);
        //3.动态注册:调用Context的registerReceiver()方法
        registerReceiver(mMyReceivre, intentFilter);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        //销毁在onDestroy()方法中的广播
        unregisterReceiver(mMyReceivre);
    }
}

Android 8.0静态注册有什么变化

在Android 8.0(API级别26)的平台上,应用不能对大部分的广播进行静态注册,也就是说,不能在AndroidManifest文件对有些广播进行静态注册,这里必须强调是有些广播,因为有些广播还是能够注册的。比如,经过楼主测试,对接收Android 开机的广播通过静态注册还是能够正常接收的。

相关链接https://developer.android.google.cn/about/versions/oreo/android-8.0

广播的优先级

添加优先级取值范围:-1000到1000,优先级越大就优先接收到广播
静态设置:<intent-filter android:priority="100">
动态设置:filter.setPriority(100);

广播的类别

普通/无序 广播(Normal Broadcast)

这种广播完全是异步的,所有与广播Intent匹配的BroadcastReceiver,都可以收到这条广播,并且不分先后顺序,视为同时收到,通过Context.sendBroadcast()方法发送。这种广播的效率比较高,但缺点是接收器不能将处理结果传递给下一个接收器,并且无法在中途终止广播。

     Intent intent = new Intent();
     //对应BroadcastReceiver中intentFilter的action
    intent.setAction("test");
    //发送广播
    sendBroadcast(intent);

有序广播(Ordered Broadcast)

这是一种同步执行的广播,通过Context.sendOrderedBroadcast()方法发送,这种广播发出后,通过receiver的intent-filter中的android:priority属性来设置优先级,优先级从-1000~1000,数越大,优先级越高,使用setResult()方法把结果传递给下一个接收者,通过getResult()方法获取上一个接收者传递过来的结果,并可以通过abortBroadcast()方法丢弃该广播,使该广播不再传递给下一个接收者。

粘性广播(Sticky Broadcast)

粘性广播通过Context.sendStickBroadcast()方法来发送,用此方法发送的广播会一直滞留,当有匹配此广播的接收器被注册后,该广播接收器就会收到此广播。使用此广播时,需要获得BROADCAST_STICKY权限。(在 android 5.0/api 21后不再推荐使用)

系统广播(System Broadcast)

Android系统中内置了多个系统广播,只要涉及到手机的基本操作,基本上都会发出相应的系统广播。如:开启启动,网络状态改变,拍照,屏幕关闭与开启,点亮不足等等。每个系统广播都具有特定的intent-filter,其中主要包括具体的action,系统广播发出后,将被相应的BroadcastReceiver接收。系统广播在系统内部当特定事件发生时,有系统自动发出。

本地广播(Local Broadcast)

以上广播都属于全局广播,发出去的广播,只要有匹配的接收者,就可以收到广播。这样一来会造成一些问题,一是消耗性能,二是容易引起安全性的问题,为了能够简单的解决这方面的问题,Android引入了一套广播本地广播机制,使用该机制发出的广播只能够在本应用内部进行传递,并且广播接收器也只能接收来自本应用发出的广播。

上一篇下一篇

猜你喜欢

热点阅读