Android中LocalBroadcastManager的基本用法及源码分析

本文介绍了Android中LocalBroadcastManager的使用,包括如何注册和反注册广播接收器,以及发送广播。并深入源码分析了LocalBroadcastManager的构造函数、广播处理流程,展示了其如何实现在应用内部高效、轻量级的一对多通信。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我们知道Android中的广播(Broadcast)主要用于应用间的通信,这种通信机制依赖于Binder通信机制及AMS的参与。
当我们想实现应用内部组件之间的一对多通信时,广播机制的效率和开销可能无法满足要求。
这个时候我们可以使用第三方提供的开源库,例如EventBus等,
也可以使用Android支持库提供的LocalBroadcastManager。

本篇博客主要记录一下LocalBroadcastManager的基本用法,
同时分析一下LocalBroadcastManager的源码,看看其功能实现的原理。


1、基本用法

我实现一个简单的场景:
APK中有两个Activity,第一个Activity利用LocalBroadcastManager注册广播接收器,点击界面按键后启动第二个Activity。
进入第二个Activity后,点击按键就会通过LocalBroadcastManager发送广播,然后结束该Activity。
如果第一个Activity注册的广播接收器收到广播,就弹出一个Toast进行提示。
整个APK的功能极其简单,但基本囊括了LocalBroadcastManager的主要接口。

第一个Activity的代码如下:

public class FirstActivity extends AppCompatActivity {
   
   
    private LocalBroadcastReceiver mReceiver;

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

        //创建一个BroadcastReceiver,与常规广播一样,自己实现子类即可
        mReceiver = new LocalBroadcastReceiver();

        //调用LocalBroadcastManager的接口进行注册,参数与常规Broadcast一致
        LocalBroadcastManager.getInstance(this)
                .registerReceiver(mReceiver, new IntentFilter("ZJTest"));

        Button button = (Button)findViewById(R.id.first_button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //点击按键后,启动第二个Activity
                Intent i = new Intent();
                i.setClass(getApplicationContext(), SecondActivity.class);
                startActivity(i);
            }
        });
    }

    private class LocalBroadcastReceiver extends BroadcastReceiver {
   
   
        @Override
        public void onReceive(Context context, Intent intent) {
            //收到广播后,用Toast提示
            Toast.makeText(context, "Receive Local Broadcast", Toast.LENGTH_LONG).show();
        }
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        //利用LocalBroadcastManager的接口,进行反注册
        LocalBroadcastManager.getInstance(this)
                .unregisterReceiver(mReceiver);
    }
}

我们再来看看SecondActivity的代码:

public class SecondActivity extends AppCompatActivity {
   
   
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);

        Button button = (Button) findViewById(R.id.second_button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //点击按键后,利用LocalBroadcastManager的接口发送本地广播
                LocalBroadcastManager.getInstance(getApplicationContext())
                        .sendBroadcast(new Intent("ZJTest"));
                finish();
            }
        });
    }
}

从上面的代码可以看出,LocalBroadcastManager的使用极其简单。
与常规Broadcast相比,就是将Context对象替换为LocalBroadcastManager即可。


2、源码分析

现在我们来看看LocalBroadcastManager相关的源码。

2.1 构造函数

我们首先看一下LocalBroadcast构造函数相关的代码:

.................
    static final int MSG_EXEC_PENDING_BROADCASTS = 1;

    private final Handler mHandler;

    private static final Object mLock = new Object();

    //静态变量
    private static LocalBroadcastManager mInstance;

    //获取LocalBroadcastManager的接口
    public static LocalBroadcastManager getInstance(Context context) {
        //很明显,这是单例模式的写法
        synchronized (mLock) {
            if (mInstance == null) {
                mInstance = new LocalBroadcastManager(context.getApplicationContext());
        
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值