# live_event_bus_ohos **Repository Path**: ethan-osc/live_event_bus_ohos ## Basic Information - **Project Name**: live_event_bus_ohos - **Description**: 移植自著名的Live_event_bus安卓版本,由于系统的差异,和安卓的版本功能有点不同,99%的功能移植过来了 - **Primary Language**: Java - **License**: Not specified - **Default Branch**: develop - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2021-09-27 - **Last Updated**: 2025-03-13 ## Categories & Tags **Categories**: Uncategorized **Tags**: HarmonyOS组件 ## README # live_event_bus_ohos #### 介绍 移植自著名的Live_event_bus安卓版本,由于系统的差异,和Android的版本功能有点不同,99%的功能移植过来了 #### 安装教程 ``` implementation 'io.gitee.ethan-osc_admin:live_event_bus_ohos:1.8.0' ``` #### 使用说明 基本保持和Android版本的LiveEventBus的相同用法和功能,可以参照其用法:https://github.com/JeremyLiao/LiveEventBus.git 由于系统的差异,存在一些不同的地方,重点说下: 1. 默认值修改,这是Android版本中的默认值 lifecycleObserverAlwaysActive 配置LifecycleObserver(如Activity)接收消息的模式(默认值true): ``` true:整个生命周期(从onCreate到onDestroy)都可以实时收到消息 false:激活状态(Started)可以实时收到消息,非激活状态(Stoped)无法实时收到消息,需等到Activity重新变成激活状态,方可收到消息 ``` autoClear 配置在没有Observer关联的时候是否自动清除LiveEvent以释放内存(默认值false) 鸿蒙版本,因为基于实际的经验,默认值和安卓完全相反,即 lifecycleObserverAlwaysActive默认false,autoClear默认是true 原因是如下: 1.lifecycleObserverAlwaysActive为true的话,如果页面处于onInactive (对应安卓的onPuase和onStop状态)也能收到消息,这时候更新数据大部分情况下不是我们愿意看到的 2.autoClear默认是true的话,leakCadance安卓里多次检测到内存泄露 如果喜欢原来的默认值,可以在初始化的时候,设置一下: ``` LiveEventBus .config() .autoClear(false) .lifecycleObserverAlwaysActive(true); ``` 2. 跨app通讯,Android版本里面,用的是广播的方式broadcast进行通讯的,而鸿蒙的里面叫公共事件方法,Android版本通过application为周期注册广播,application销毁后,广播就不存在了,而鸿蒙的公共事件方法,是以key值为连接的,需要手动的注册和和注销,否则会内存泄露,即页面销毁后,依然可以收到公共事件,基于此加了几个接口 ``` 手动注册函数方法:LiveEventBus.get().enableAcrossApp() 手动注销方法:LiveEventBus.get().disableAcrossApp() 当前跨进程通讯功能是否已经使能:LiveEventBus.get().isAcrossAppEnable() ``` 如果不使能该功能,可以发送公共事件,但是收不到,使能和注销本质就是注册接收公共事件,注销接收公共事件 #### 移植修改点 1. ExternalLifecycleBoundObserver里做了修改shouldBeActive这个函数,因为和安卓有所区别,安卓是Event和State分开的,而鸿蒙是放一起的,本意是判断,页面是否是判断页面是否已经将要显示,或者已经显示,对应的安卓状态是started和resume,这个如果lifecycleObserverAlwaysActive是ture的话,即使所有状态都可以收到,否则只有创建和显示状态可以收到,和LiveData类似,这个可以参考笔者之前移植的ViewModel和LiveData:[鸿蒙版本ViewModel和LiveData](https://gitee.com/ethan-osc_admin/viewmodel_for_ohos) 2. 去除了 Apputlis里面 ActivityManager相关的逻辑,使用了IAbilityManager,其实没太看懂Android这块用这个的目的,感觉是为了避免内存泄露,根据顶层Activity的状态做相应操作 3. LiveEventBus跨App通讯的时候,上面也说了,Android是用的广播,与Android广播不同的是,鸿蒙用的是公共事件是全局事件,而广播的生命周期根据Context来顶的,鸿蒙的公共事件仅仅是根据key值,所以笔者改了,记得按需要使能和注销,避免不必要的内存泄露 4. getApplicationByReflect,愿意通过发射拿到application的实例,暂时定义一个BaseApplication给外面继承即可,初始化的时候,不要传空就行,就不会调用到反射那块,本意是为了注册每个Activity的生命周期回调,不用的话,不调用就行。 5.getTopActivityByReflect,愿意是反射拿到顶部的Ability,找不到反射方式,一般情况下用不到,因为当Ability进入和退出的时候,已经自己维护了一列表