撸一个本地广播 (LocalBroadcastManager) 的工具类

先说一下LocalBroadcastManager相比较BroadcastReceiver的区别:

BroadcastReceiver的设计初衷是全局性,可接收来自本应用和其他应用发
过来的intent广播。这也同时给app带来了一定的安全风险。为了解决这个问题,LocalBroadcastManager横空出世。LocalBroadcastManager 只会将广播限定在当前应用程序中。LocalBroadcastManager 发送的广播不会离开你的应用程序,同样也不会接收来自其它应用程序的广播,因此你可以放心的在 LocalBroadcastManager 中传播敏感信息。同时由于LocalBroadcastManager不需要用到跨进程机制,因此相对 BroadcastReceiver 而言要更为高效。LocalBroadcastManager只在动态广播时使用,静态广播不能使用LocalBroadcastManager。

下面就看一下工具类 AppLocalReceiver.java:

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;

import androidx.localbroadcastmanager.content.LocalBroadcastManager;

public class AppLocalReceiver extends BroadcastReceiver {

    private static final String RECEIVER_TAG = "LOCAL_RECEIVER_KEY";

    private Context context;
    private String mActivityName;
    private OnReceiverListener mOnReceiverListener;
    private LocalBroadcastManager mLocalBroadcastManager;

    public AppLocalReceiver() {
    }

    public AppLocalReceiver(Context context, String mActivityName) {
        this.context = context;
        this.mActivityName = mActivityName;
        //注册广播
        regActivity();
    }

    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        Bundle bundle = intent.getBundleExtra(RECEIVER_TAG);
        if (mOnReceiverListener != null) {
            mOnReceiverListener.receiver(action, bundle);
        }
    }

    /**
     * 注册广播
     */
    private void regActivity() {
        IntentFilter filter = new IntentFilter();
        filter.addAction(mActivityName);
        mLocalBroadcastManager = getLocalBroadcastManager(context);
        mLocalBroadcastManager.registerReceiver(AppLocalReceiver.this, filter);
    }

    private LocalBroadcastManager getLocalBroadcastManager(Context context) {
        if (context != null && mLocalBroadcastManager == null) {
            mLocalBroadcastManager = LocalBroadcastManager.getInstance(context);
        }
        return mLocalBroadcastManager;
    }

    /**
     * 设置监听
     *
     * @param listener
     */
    public void setOnReceiverListener(OnReceiverListener listener) {
        this.mOnReceiverListener = listener;
    }

    /**
     * 发送广播
     *
     * @param ctx
     * @param sendToActivityName
     * @param bundle
     */
    public void sendToBroadcast(Context ctx, String sendToActivityName, Bundle bundle) {
        Intent intent = new Intent();
        intent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES);
        intent.putExtra(RECEIVER_TAG, bundle);
        intent.setAction(sendToActivityName);
        mLocalBroadcastManager = getLocalBroadcastManager(ctx);
        mLocalBroadcastManager.sendBroadcast(intent);
    }

    /**
     * 注销广播
     */
    public void onDestroy() {
        mLocalBroadcastManager.unregisterReceiver(AppLocalReceiver.this);
    }

    public interface OnReceiverListener {
        void receiver(String action, Bundle bundle);
    }
}

下面是activity中的用法
初始化:

mAppReceiver = new AppLocalReceiver(MainActivity.this, MainActivity.class.getName());

接收广播:

//接收广播
        mAppReceiver.setOnReceiverListener(new AppLocalReceiver.OnReceiverListener() {
            @Override
            public void receiver(String action, Bundle bundle) {
                int code = bundle.getInt("code");
                String result = bundle.getString(RECEIVER_BUNDLE_KEY);

                String printMessage = "action=" + action + ",   result=" + result;
                Toast.makeText(MainActivity.this, printMessage, Toast.LENGTH_SHORT).show();

            }
        });

发送广播:

 Bundle bundle = new Bundle();
                bundle.putInt("code", 0);
                bundle.putString(RECEIVER_BUNDLE_KEY, "这是广播的消息");
                //第一个参数为context,第二个为要发送到的activity,第三个为消息内容
                mAppReceiver.sendToBroadcast(MainActivity.this,
                        MainActivity.class.getName(), bundle);

警告: 记得在activity结束时销毁:

@Override
    protected void onDestroy() {
        super.onDestroy();
        mAppReceiver.onDestroy();
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值