前言
上篇我们对BroadcasReceiver做了一个全面的解析,在日常开发过程中,用得比较多的是手动注册方式的广播,为了方便广播的使用,我封装了一个手动注册的广播工具类——AppReceiver,这节就来讲讲它的使用吧。
今天涉及的内容:
- 手动注册广播一般使用流程
- 封装类 AppReceiver 的基本介绍
- AppReceiver 在MainActivity中的使用
- 效果图与项目结构图
- AppReceiver 源码
先来波效果图
一. 手动注册广播一般使用流程
手动注册广播一般使用会经历以下流程:
- 在activity中初始化的时候,用代码做广播相关注册
- 在需要发送的地方发送广播
- 在BroadcastReceiver的onReceive方法中接收广播并处理相关逻辑
- 注销广播
这个流程下来,代码量很大,特别当app中注册的广播又很多的时候,会让界面显得十分凌乱,为了解决这个场景,于是我封装了一个 AppReceiver,目的是方便手动注册时Broadcast的使用。
二. 封装类 AppReceiver 的基本介绍
2.1 基本方法介绍
AppReceiver作为 BroadcastReceiver的封装类,具备以下方法:
//构造方法1
AppReceiver()
//构造方法2
AppReceiver(Context context,String activityName)
//设置监听,广播接收在此处理
setOnReceiverListener(OnReceiverListener listener)
//发送广播
sendToBroadcast(Context ctx, String sendToActivityName, Bundle bundle)
//注销广播
onDestroy()
2.2 基本使用介绍
以MainActivity为例,当我们要在MainActivity中注册一个广播监听的时候,我们可以这样:
//声明广播对象
private AppReceiver mAppReceiver;
//初始化(含注册广播逻辑)mAppReceiver对象
mAppReceiver=new AppReceiver(MainActivity.this,MainActivity.class.getName());
//接收广播
mAppReceiver.setOnReceiverListener(new AppReceiver.OnReceiverListener() {
@Override
public void receiver(String action, Bundle b) {
//接收数据,并做相关逻辑处理
//......
}
});
//在MainActivity销毁时,注销广播
mAppReceiver.onDestroy();
若要在MainActivity中发起广播,你可以像下面这样:
//发送广播
Bundle bundle=new Bundle();
bundle.putInt("code",0);
bundle.putString("key","我是MainActivity自己发送的值");
mAppReceiver.sendToBroadcast(MainActivity.this,MainActivity.class.getName(),bundle);
若你要在其他界面,如 ActivityB 界面给 MainActivity 发送广播,你可以在ActivityB 中像下面这样给MainActivity发送广播:
//发送广播
AppReceiver receiver=new AppReceiver();
Bundle bundle=new Bundle();
bundle.putInt("code",1);
bundle.putString("key","我是B发过来的值");
receiver.sendToBroadcast(this,MainActivity.class.getName(),bundle);
三.AppReceiver 在MainActivity中的使用
下面一个场景是在MainActivity中注册一个广播,然后在MainActivity中发起广播,还有一个按钮跳到下一个界面B(B 也是一个 Activity),然后在B界面点击按钮给MainActivity发送广播的流程,下面贴出相关代码:
MainActivity代码:
/**
* Title:
*
* description:
* autor:pei
* created on ${DATE}
*/
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private TextView mTv;
private Button mBtn;
private Button mBtn2;
//声明广播对象
private AppReceiver mAppReceiver;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initData();
setListener();
}
private void initData() {
mTv = findViewById(R.id.tv);
mBtn = findViewById(R.id.btn);
mBtn2 = findViewById(R.id.btn2);
//初始化(含注册广播逻辑)mAppReceiver对象
mAppReceiver=new AppReceiver(MainActivity.this,MainActivity.class.getName());
}
private void setListener() {
mBtn.setOnClickListener(this);
mBtn2.setOnClickListener(this);
//接收广播
mAppReceiver.setOnReceiverListener(new AppReceiver.OnReceiverListener() {
@Override
public void receiver(String action, Bundle b) {
int code=b.getInt("code");
String message=b.getString("key");
LogUtil.i("activity_action="+action+", message="+message);
mTv.setText(message);
}
});
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn:
//发送广播
Bundle bundle=new Bundle();
bundle.putInt("code",0);
bundle.putString("key","我是MainActivity自己发送的值");
mAppReceiver.sendToBroadcast(MainActivity.this,MainActivity.class.getName(),bundle);
break;
case R.id.btn2:
//跳转B界面
Intent intent=new Intent();
intent.setClass(MainActivity.this,B.class);
startActivity(intent);
break;
default:
break;
}
}
@Override
protected void onDestroy() {
super.onDestroy();
//注销广播
mAppReceiver.onDestroy();
LogUtil.i("====MainActivity中广播注销=====");
}
}
B界面代码:
public class B extends AppCompatActivity implements View.OnClickListener {
private Button mBtn;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_b);
initData();
setListener();
}
private void initData() {
mBtn = findViewById(R.id.btn);
}
private void setListener() {
mBtn.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn:
//发送广播
AppReceiver receiver=new AppReceiver();
Bundle bundle=new Bundle();
bundle.putInt("code",1);
bundle.putString("key","我是B发过来的值");
receiver.sendToBroadcast(this,MainActivity.class.getName(),bundle);
//关闭当前界面
finish();
break;
default:
break;
}
}
}
四.效果图与项目结构图
效果图
项目结构图
五. AppReceiver 源码
AppReceiver 源码如下: