Android 占位式插件化原理实现(三) 如何在插件APP中使用动态广播

写在前面

       前面实现了插件APP的Activity和Service的启动,今天咱来说一下动态广播的使用。还是老套路:使用宿主环境注册和发送,基于宿主Activity注入到插件Activity的Context。

一、项目目录

新增文件

  1. 宿主APP新增广播接收代理类
    在这里插入图片描述
  2. 插件APP新增广播接收类
    在这里插入图片描述
  3. 接口标准新增广播标准
    在这里插入图片描述

二、撸码

1. 接口标准制定
public interface IBroadcastReceiver {
	// 提供一个接收广播通知的方法
    void onReceive(Context context, Intent intent);
}
2. 插件APP
  1. 实现接口标准
public class BroadcastReceivers extends BroadcastReceiver implements IBroadcastReceiver {

    @Override// 为了不省事儿把接口里方法定义成父类一样的了
    public void onReceive(Context context, Intent intent) {
    	// 收到广播后的相应提示
        Toast.makeText(context, "BroadcastReceivers: 收到动态广播", Toast.LENGTH_SHORT).show();
        System.out.println("BroadcastReceivers: 收到动态广播");
    }
}
  1. 在插件APP内提供注册和发送方法
public class PluginActivity extends BaseActivity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_plugin);// 父类重写了此方法

        // 不能在插件Activity的xml里使用onClick直接设置点击事件,需要用id的方式
      
        findViewById(R.id.btn_plugin_register_broadcast).setOnClickListener( v -> registerBroadcast());

        findViewById(R.id.btn_plugin_send_broadcast).setOnClickListener( v -> sendBroadcast());
    }

    /**
     * 插件内注册Broadcast
     */
    private void registerBroadcast() {
        IntentFilter intentFilter = new IntentFilter();
        intentFilter.addAction(Constant.BROADCAST_INTENT_FILTER);

        // 父类重写此方法,调用到宿主环境
        registerReceiver(new BroadcastReceivers(), intentFilter);
    }

    /**
     * 插件内发送Broadcast
     */
    private void sendBroadcast() {
        Intent intent = new Intent();
        intent.setAction(Constant.BROADCAST_INTENT_FILTER);

		// 父类重写此方法,调用到宿主环境
        sendBroadcast(intent);
    }
}
  1. BaseActivity重写注册和发送方法,使用宿主环境
public class BaseActivity extends implements IActivity{
   @Override
    public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter) {
        // 调用到宿主环境去
        return appActivity.registerReceiver(receiver, filter);
    }

    @Override
    public void sendBroadcast(Intent intent) {
        // 调用到宿主的发送方法
        appActivity.sendBroadcast(intent);
    }
}
3. 宿主APP
  1. 创建广播接收代理类
public class ProxyBroadcastReceiver extends BroadcastReceiver {

    private String broadcastReceiverName;
    public ProxyBroadcastReceiver(String broadcastReceiverName) {
        this.broadcastReceiverName = broadcastReceiverName;
    }

    @Override
    public void onReceive(Context context, Intent intent) {
        try {
            // 反射创建插件内BroadcastReceiver类实例
            Class clazz = PluginManager.getInstance(context).getClassLoader().loadClass(broadcastReceiverName);
            Object instance    = clazz.newInstance();

            IBroadcastReceiver iReceiver = (IBroadcastReceiver) instance;

            // 调用方法
            iReceiver.onReceive(context,intent);

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
  1. 代理Activity拦截插件APP的注册和发送意图
public class ProxyActivity extends Activity {
 @Override
    public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter) {
        // 拦截插件APP传来的receiver
        String broadcastReceiverName = receiver.getClass().getName();

        // 最终广播在宿主环境的代理类里注册
        return super.registerReceiver(new ProxyBroadcastReceiver(broadcastReceiverName), filter);
    }

    @Override
    public void sendBroadcast(Intent intent) {
        super.sendBroadcast(intent);
    }
}

在这里插入图片描述

三、结束

至此,插件APP内使用动态广播就完成了。有任何问题欢迎评论区交流。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

柯基爱蹦跶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值