二.封装一个广播工具类 —— AppReceiver

前言

上篇我们对BroadcasReceiver做了一个全面的解析,在日常开发过程中,用得比较多的是手动注册方式的广播,为了方便广播的使用,我封装了一个手动注册的广播工具类——AppReceiver,这节就来讲讲它的使用吧。

今天涉及的内容:

  1. 手动注册广播一般使用流程
  2. 封装类 AppReceiver 的基本介绍
  3. AppReceiver 在MainActivity中的使用
  4. 效果图与项目结构图
  5. AppReceiver 源码

先来波效果图


1.gif

一. 手动注册广播一般使用流程

手动注册广播一般使用会经历以下流程:

  1. 在activity中初始化的时候,用代码做广播相关注册
  2. 在需要发送的地方发送广播
  3. 在BroadcastReceiver的onReceive方法中接收广播并处理相关逻辑
  4. 注销广播

这个流程下来,代码量很大,特别当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;
        }

    }

}

四.效果图与项目结构图

效果图


1.gif

项目结构图


image.png

五. AppReceiver 源码

AppReceiver 源码如下:

你可能感兴趣的:(二.封装一个广播工具类 —— AppReceiver)