Android使用LiveEventBus消息实现组件间通讯

学更好的别人,

做更好的自己。

——《微卡智享》

本文长度为3768,预计阅读8分钟

前言

最近OpenCV的相关文章基本都是转载的,主要是在开发新的版本产品,所以C#和Android用的多,今天就讲一下Android里的LiveDataBus消息框架。

LiveEventBus

微卡智享

LiveEventBus是一款Android消息总线,基于LiveData,具有生命周期感知能力,支持Sticky,支持AndroidX,支持跨进程,支持跨APP。

Q1

为什么要用LiveEventBus?

源码地址:https://github.com/JeremyLiao/LiveEventBus.git


生命周期感知

  •  消息随时订阅,自动取消订阅

  •  告别消息总线造成的内存泄漏

  •  告别生命周期造成的崩溃

范围全覆盖的消息总线解决方案

  •  进程内消息发送

  •  App内,跨进程消息发送

  •  App之间的消息发送

更多特性支持

  •  免配置直接使用,懒人最爱

  •  支持Sticky粘性消息

  •  支持AndroidX

  •  支持延迟发送

  •  观察者的多种接收模式(全生命周期/激活状态可接受消息)


使用方法:

implementation 'io.github.jeremyliao:live-event-bus-x:1.8.0'

订阅消息

以生命周期感知模式订阅消息

LiveEventBus
  .get("some_key", String.class)
  .observe(this, new Observer<String>() {
      @Override
      public void onChanged(@Nullable String s) {
      }
  });

以Forever模式订阅消息

LiveEventBus
  .get("some_key", String.class)
  .observeForever(observer);

发送消息

不定义消息直接发送

LiveEventBus
  .get("some_key")
  .post(some_value);

先定义消息,再发送消息

public class DemoEvent implements LiveEvent {
    public final String content;


    public DemoEvent(String content) {
        this.content = content;
    }
}
LiveEventBus
        .get(DemoEvent.class)
        .post(new DemoEvent("Hello world"));

简单用法就介绍到这里,详细的可以看源码的地址,里面有详细文档。

https://github.com/JeremyLiao/LiveEventBus.git

代码实现

微卡智享

其实用LiveEventBus使用的地方挺多,可以替代回调方法,广播等,这些用起来也比较简单,自己测试下就可以了,今天来试一下组件点的通讯,主要是两个并不依赖的module可以打开对方的activity。

在Android中由于module间不可以双向依赖,所以如果你想调用某个没有依赖关系的组件的服务往往是做到的,而组件间通信正好可以解决这样的问题。组件间通信在组件化和插件化中扮演了重要角色。

其实现成的框架里面App做为宿主,很多都已经写好了组件间的通讯,不过对我来说有点太重了,所以就考虑用LiveEventBus消息做个简单的处理,毕竟组件间的通信并不是常态,废话不再多说,正篇开始。

01

创建项目和组件

新建了一个工程,里面又添加了两个组件,分别是module1和module2。其中App将Module1和Module2都依赖了,而两个Module之间并无依赖。

App中没有Activity,只是创建了一个App继承自Application,就是用来做LiveEventBus的初始化工作,还有监听事件。

package ryb.medicine.modulecommun


import android.annotation.SuppressLint
import android.app.Application
import android.content.Context
import android.content.Intent
import android.widget.Toast
import com.jeremyliao.liveeventbus.LiveEventBus
import java.lang.Exception
/**
 * 作者:Vaccae
 * 邮箱:3657447@qq.com
 * 创建时间:16:02
 * 功能模块说明:
 */
class App : Application() {


    override fun onCreate() {
        super.onCreate()
        context = this


        InitLiveEventBus()
    }






    companion object {
        @SuppressLint("StaticFieldLeak")
        lateinit var context: Context
    }


    /**
     * 初始化LiveEventBus
     * 1、配置LifecycleObserver(如Activity)接收消息的模式(默认值true):
     * true:整个生命周期(从onCreate到onDestroy)都可以实时收到消息
     * false:激活状态(Started)可以实时收到消息,非激活状态(Stoped)无法实时收到消息,需等到Activity重新变成激活状
     * 态,方可收到消息
     * 2、autoClear
     * 配置在没有Observer关联的时候是否自动清除LiveEvent以释放内存(默认值false)
     * */
    fun InitLiveEventBus(){
        LiveEventBus.config()
            .lifecycleObserverAlwaysActive(true)
            .autoClear(false);


        LiveEventBus.get("module",String::class.java)
            .observeForever{
                try {
                    val clazz = Class.forName(it)
                    var intent = Intent(this, clazz)
                    startActivity(intent)
                }
                catch (e:Exception){
                    Toast.makeText(this,e.message.toString(),Toast.LENGTH_SHORT).show()
                }
            }


    }


}

Module1

Module1组件中只有一个Activity,界面上加了一个按钮,我们直接看这个按钮的事件,通过点击后在LiveActivity中发送消息打开Module2的Activity的完整包名。

package ryb.medicine.module1


import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.Button
import android.widget.Toast
import com.jeremyliao.liveeventbus.LiveEventBus


class Module1Activity : AppCompatActivity() {


    private val btn: Button by lazy { findViewById<Button>(R.id.button) }


    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_module1)




        btn.setOnClickListener {
            LiveEventBus.get("module",String::class.java)
                .post("ryb.medicine.module2.Module2Activity")
        }
    }
}

Module2

Module2的布局中加入了两个Button,两个功能分别是关闭当前页面,和发送消息打开Module1的Activity。

package ryb.medicine.module2


import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.Button
import com.jeremyliao.liveeventbus.LiveEventBus


class Module2Activity : AppCompatActivity() {


    val btn2: Button by lazy { findViewById(R.id.button2) }
    val btn3:Button by lazy { findViewById(R.id.button3) }


    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_module2)


        btn2.setOnClickListener {
            LiveEventBus.get("module",String::class.java)
                .post("ryb.medicine.module1.Module1Activity")
        }


        btn3.setOnClickListener {
            finish()
        }
    }
}

实现效果

很少的代码直接实现了两个不同Module里的Activity之间相互跳转了。

注意事项

两个Module里的mainfests文件里,要把对应的activity:launchMode设置为singleInstance

如果不改这个的话,相互打开Activity后会不停的创建,需要一个一个的关闭。

扫描二维码

获取更多精彩

微卡智享

「 往期文章 」

Android制作AAR包并混淆后加载调用

Android使用Flow检测版本升级自动下载安装

.Net5中WebApi使用MEF2框架的使用

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Vaccae

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

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

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

打赏作者

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

抵扣说明:

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

余额充值