本文长度为3768字,预计阅读8分钟
前言
最近OpenCV的相关文章基本都是转载的,主要是在开发新的版本产品,所以C#和Android用的多,今天就讲一下Android里的LiveDataBus消息框架。
LiveEventBus
LiveEventBus是一款Android消息总线,基于LiveData,具有生命周期感知能力,支持Sticky,支持AndroidX,支持跨进程,支持跨APP。
Q1
为什么要用LiveEventBus?
源码地址:https://github.com/JeremyLiao/LiveEventBus.git
生命周期感知
范围全覆盖的消息总线解决方案
更多特性支持
使用方法:
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后会不停的创建,需要一个一个的关闭。