Android组件模块间解耦及通信轻量级实现方案 安卓组件间通信

admin2024-05-30  14

学更好的别人,

做更好的自己。

——《微卡智享》

前言

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

Android组件模块间解耦及通信轻量级实现方案 安卓组件间通信,Android组件模块间解耦及通信轻量级实现方案 安卓组件间通信_移动开发,第1张

LiveEventBus



Android组件模块间解耦及通信轻量级实现方案 安卓组件间通信,Android组件模块间解耦及通信轻量级实现方案 安卓组件间通信_移动开发_02,第2张

微卡智享

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

Q1

为什么要用LiveEventBus?

生命周期感知

  •  消息随时订阅,自动取消订阅
  •  告别消息总线造成的内存泄漏
  •  告别生命周期造成的崩溃

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

  •  进程内消息发送
  •  App内,跨进程消息发送
  •  App之间的消息发送

更多特性支持

  •  免配置直接使用,懒人最爱
  •  支持Sticky粘性消息
  •  支持AndroidX
  •  支持延迟发送
  •  观察者的多种接收模式(全生命周期/激活状态可接受消息)

Android组件模块间解耦及通信轻量级实现方案 安卓组件间通信,Android组件模块间解耦及通信轻量级实现方案 安卓组件间通信_js_03,第3张

使用方法:

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

代码实现



Android组件模块间解耦及通信轻量级实现方案 安卓组件间通信,Android组件模块间解耦及通信轻量级实现方案 安卓组件间通信_移动开发_04,第4张

微卡智享

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

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

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

01

创建项目和组件

Android组件模块间解耦及通信轻量级实现方案 安卓组件间通信,Android组件模块间解耦及通信轻量级实现方案 安卓组件间通信_android_05,第5张

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

Android组件模块间解耦及通信轻量级实现方案 安卓组件间通信,Android组件模块间解耦及通信轻量级实现方案 安卓组件间通信_html_06,第6张

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

Android组件模块间解耦及通信轻量级实现方案 安卓组件间通信,Android组件模块间解耦及通信轻量级实现方案 安卓组件间通信_css_07,第7张

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

Android组件模块间解耦及通信轻量级实现方案 安卓组件间通信,Android组件模块间解耦及通信轻量级实现方案 安卓组件间通信_js_08,第8张

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()
        }
    }
}

实现效果

Android组件模块间解耦及通信轻量级实现方案 安卓组件间通信,Android组件模块间解耦及通信轻量级实现方案 安卓组件间通信_android_09,第9张

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

注意事项

Android组件模块间解耦及通信轻量级实现方案 安卓组件间通信,Android组件模块间解耦及通信轻量级实现方案 安卓组件间通信_移动开发_10,第10张

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

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

Android组件模块间解耦及通信轻量级实现方案 安卓组件间通信,Android组件模块间解耦及通信轻量级实现方案 安卓组件间通信_html_11,第11张

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明原文出处。如若内容造成侵权/违法违规/事实不符,请联系SD编程学习网:675289112@qq.com进行投诉反馈,一经查实,立即删除!