前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Android使用LiveEventBus消息实现组件间通讯

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

作者头像
Vaccae
发布2021-08-25 10:22:44
1.7K0
发布2021-08-25 10:22:44
举报
文章被收录于专栏:微卡智享

本文长度为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
  • 支持延迟发送
  • 观察者的多种接收模式(全生命周期/激活状态可接受消息)

使用方法:

代码语言:javascript
复制
implementation 'io.github.jeremyliao:live-event-bus-x:1.8.0'

订阅消息

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

代码语言:javascript
复制
LiveEventBus
  .get("some_key", String.class)
  .observe(this, new Observer<String>() {
      @Override
      public void onChanged(@Nullable String s) {
      }
  });

以Forever模式订阅消息

代码语言:javascript
复制
LiveEventBus
  .get("some_key", String.class)
  .observeForever(observer);

发送消息

不定义消息直接发送

代码语言:javascript
复制
LiveEventBus
  .get("some_key")
  .post(some_value);

先定义消息,再发送消息

代码语言:javascript
复制
public class DemoEvent implements LiveEvent {
    public final String content;

    public DemoEvent(String content) {
        this.content = content;
    }
}
代码语言:javascript
复制
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的初始化工作,还有监听事件。

代码语言:javascript
复制
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的完整包名。

代码语言:javascript
复制
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。

代码语言:javascript
复制
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后会不停的创建,需要一个一个的关闭。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-08-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 微卡智享 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 订阅消息
  • 注意事项
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档