美文网首页四大组件
二.封装一个广播工具类 —— AppReceiver

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

作者: 奔跑的佩恩 | 来源:发表于2019-10-28 22:19 被阅读0次

    前言

    上篇我们对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

        本文链接:https://www.haomeiwen.com/subject/ylnamctx.html