BrodcastReceiver面试知识小结

本博客是对BrodcastReceiver基本面试知识的一个小结,该博客复制参考了Hensen_,感谢原文博主的分享,在前人的基础上做了补充,方便后期知识的回顾。

推荐博文:Android四大组件:BroadcastReceiver史上最全面解析

1、Broadcast Receiver是什么?

Broadcast是四大组件之一,是一种广泛运用在应用程序之间传输信息的机制,通过发送Intent来传送我们的数据。

2、Broadcast Receiver的使用场景

  • 同一App具有多个进程的不同组件之间的消息通信.
  • 不同App之间的组件之间的消息通信.

3、Broadcast Receiver的种类

  • 普通广播 (Normal Broadcast): 开发者自身定义intent的广播(最常用)。

  • 系统广播 (System Broadcast): Android中内置了多个系统广播:只要涉及到手机的基本操作(如开机、网络状态变化、拍照等等),都会发出相应的广播。

  • 有序广播 (Ordered Broadcast): 发送出去的广播被广播接收者按照先后顺序接收,Priority值大的优先接收,值相同先注册的广播优先,先接收的广播可以进行修改、截断。

  • 本地广播 (Local Broadcast):App应用内的广播,广播的发送者和接收者都同属于一个App,安全性高 & 效率高。

  • 粘性广播 (Sticky Broadcast):在Android5.0 & API 21中已经失效。

4、Broadcast Receiver的实现

  • 静态注册:注册后一直运行,尽管Activity、进程、App被杀死还是可以接收到广播。

  • 动态注册:跟随Activity的生命周期变化的。

5、Broadcast Receiver内部实现机制

1.自定义广播类继承BroadcastReceiver,复写onReceiver()。

2.通过Binder机制向AMS(Activity Manager Service)进行注册广播.

3.广播发送者通过Binder机制向AMS发送广播。

4.AMS查找符合相应条件的广播发送到BroadcastReceiver(一般情况下是Activity)相应的循环队列中。

5.消息队列执行拿到广播,回调BroadcastReceiver的onReceiver()。

6、LocalBroadcastManager特点

1.本地广播只能在自身App内传播,不必担心泄漏隐私数据。

2.本地广播不允许其他App对你的App发送该广播,不必担心安全漏洞被利用。

3.本地广播比全局广播更高效。

4.以上三点都是源于其内部是用Handler实现的,相比系统广播通过Binder实现更高效,使用Handler实现,别的应用无法向我们应用发送广播,我们的应用内发送的广播也不会离开我们的应用。

5.LocalBroadcastManager内部协作主要是靠两个Map集合:mReceivers和mActions,以及一个List集合mPendingBroadcasts来存储待接收的广播对象。

7、代码实践

创建MyBroadcastReceiver广播接收器

public class MyBroadcastReceiver extends BroadcastReceiver {

    // 接收广播方法,在intent中我们可以取出发送广播是携带的数据.
    @Override
    public void onReceive(Context context, Intent intent) {
        // 接收到广播,处理需要的逻辑
    }
}

接收系统广播(监听网络状态变化)

(1).静态注册:

       <!--静态注册广播在Manifests注册-->
        <receiver android:name=".receiver.MyBroadcastReceiver">
            <!--用于指定此广播接收器将接收的广播类型-->
            <!--本示例中给出的是用于接收网络状态改变时发出的广播-->
            <intent-filter>
                <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
            </intent-filter>
        </receiver>

(2).动态注册:

package com.example.ling.myreview.receiver;
import android.content.IntentFilter;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import com.example.ling.myreview.R;

public class BroadcastReceiverActivity extends AppCompatActivity {
    private MyBroadcastReceiver mBroadcastReceiver = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_broadcast_receiver);
        // 创建广播接收器
        mBroadcastReceiver = new MyBroadcastReceiver();
    }

    @Override
    protected void onResume() {
        super.onResume();
        // 注册广播接收器
        //设置广播接收器将接收的广播类型
        //用于接收网络状态改变时发出的广播
        final String action = "android.net.conn.CONNECTIVITY_CHANGE";
        IntentFilter intentFilter = new IntentFilter();
        intentFilter.addAction(action);
        registerReceiver(mBroadcastReceiver, intentFilter);
    }

    @Override
    protected void onPause() {
        super.onPause();
        // 解除注册广播接收器
        unregisterReceiver(mBroadcastReceiver);
    }
}

发送普通广播

(1). 发送广播:

  Intent intent = new Intent();
        //对应BroadcastReceiver中intentFilter的action
        intent.setAction("YOU_BROADCAST_RECEIVER_ACTION");
        //可以在intent中传递数据。
        //发送广播
        sendBroadcast(intent);

(2). 注册监听广播:

        final String action = "YOU_BROADCAST_RECEIVER_ACTION";
        IntentFilter intentFilter = new IntentFilter();
        intentFilter.addAction(action);
        registerReceiver(mBroadcastReceiver, intentFilter);

(3). 解除监听广播:

        unregisterReceiver(mBroadcastReceiver);

发送有序广播

// 发送有序广播
sendOrderedBroadcast(intent, null);
// 注册监听广播、解除监听广播代码类似省略。

本地广播

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

//步骤2:实例化LocalBroadcastManager的实例
localBroadcastManager = LocalBroadcastManager.getInstance(this);

//步骤3:设置接收广播的类型 
intentFilter.addAction(android.net.conn.CONNECTIVITY_CHANGE);

//步骤4:调用localBroadcastManager的registerReceiver()方法进行动态注册 
localBroadcastManager.registerReceiver(mBroadcastReceiver, intentFilter);

//取消注册应用内广播接收器
localBroadcastManager.unregisterReceiver(mBroadcastReceiver);

//发送应用内广播
Intent intent = new Intent();
intent.setAction(BROADCAST_ACTION);
localBroadcastManager.sendBroadcast(intent);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章