先说一下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();
}