前言
有时我们在项目中会不可避免的写一些测试代码(如环境切换,测试页面等等),这些代码可能会存在不同的地方,不方便管理和修改,上线时又不需要把这些代码打进生产包。那么我们能不能以一种非侵入的方式来写这些测试代码呢?组件化开发,我们可以新建一个单独的module,单独用于存放这些测试代码。app模块依赖test module时采用以下方式
debugImplementation project(':module_test')
其中,test module 依赖base,base 中有管理activity的工具类。
问题来了,这个test module,如何监听app 的启动并进行一些初始化呢?

方法一
首先肯定是可以使用EventBus或者广播的。我们可以在app启动时发一个通知。
方法二
我们亦可以让test module暴露一个接口或者方法,在application 启动时初始化调用这个方法。
方法三
也可以使用Jetpack 的StartUp组件。

App Startup 库提供了一种在应用程序启动时初始化组件的简单、高效的方法。

使用StartUp实践如下:
在test module中新建以下类:

class TestInitializer : Initializer<Unit> {override fun create(context: Context) {//这里拿到context是ApplicationProcessLifecycleOwner.get().lifecycle.addObserver(ApplicationObserver()) //可以结合Lifecycle监听应用生命周期以获取activity信息}override fun dependencies(): MutableList<Class<out Initializer<*>>> = mutableListOf()}

然后test module的清单文件

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"package="com.cbim.test"><uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" /><application><activity android:name=".TestActivity"/><providerandroid:name="androidx.startup.InitializationProvider"android:authorities="${applicationId}.androidx-startup"android:exported="false"tools:node="merge"><meta-dataandroid:name="com.cbim.test.TestInitializer"android:value="androidx.startup" /></provider></application></manifest>

可以结合Lifecycle监听应用生命周期以获取栈顶的activity信息,因为在Initializer 的 create()时,activity还没创建添加。这里要使用activity进行权限检查和权限申请。

package com.cbim.testimport android.os.Handler
import android.os.Looper
import android.widget.Toast
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.LifecycleObserver
import androidx.lifecycle.OnLifecycleEvent
import com.alibaba.android.arouter.launcher.ARouter
import com.cbim.guangxi.building.utils.AppManager
import com.cbim.lib_common.router.RouteConstants
import com.lzf.easyfloat.EasyFloat
import com.lzf.easyfloat.enums.ShowPattern
import com.lzf.easyfloat.interfaces.OnPermissionResult
import com.lzf.easyfloat.permission.PermissionUtils/*** @Desc:* @Author:  leiertao* @Date:  2022/8/26*/
class ApplicationObserver : LifecycleObserver {@OnLifecycleEvent(Lifecycle.Event.ON_RESUME)fun onResume() {if (PermissionUtils.checkPermission(AppManager.currentActivity())) {showFloat()} else {Toast.makeText(AppManager.currentActivity(),"请开启悬浮窗权限,方便测试使用",Toast.LENGTH_SHORT).show()Handler(Looper.getMainLooper()).postDelayed({PermissionUtils.requestPermission(AppManager.currentActivity(),object : OnPermissionResult {override fun permissionResult(isOpen: Boolean) {// if (isOpen)  showFloat()}})}, 3000)}}private fun showFloat() {EasyFloat.with(AppManager.currentActivity()).setLayout(R.layout.float_layout).setShowPattern(ShowPattern.FOREGROUND).setDragEnable(true).registerCallback {createResult { _, _, view ->view?.setOnClickListener {ARouter.getInstance().build(RouteConstants.TEST_ACTIVITY).navigation()}}}.show()}
}

我在ApplicationObserver中,开启了一个悬浮按钮。注意,开启悬浮窗需要 <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
最终效果如下所示。


这样我们就可以像使用vconsole那样使用悬浮按钮进行测试相关功能的使用了

Android使用Startup和Lifecycle打造一个单独的测试module相关推荐

  1. 单独组件_阿里P8年薪百万大牛-教你打造一个Android组件化开发框架

    作者简介 本篇来自 lucky_billy 的投稿,分享了他的开源组件化框架,详细地讲解框架形成的思路,希望对大家有所帮助. lucky_billy 的博客地址: http://blog.csdn.n ...

  2. 打造一个高逼格的android开源项目——小白攻略

    小引子 在平时的开发过程中,我们经常会查阅很多的资料,最常参考的是 github 的开源项目.通常在项目的主页面能看到项目的简介和基本使用,并且时不时能看到页面汇中有好多的彩色标签,看起来很酷,很专业 ...

  3. android组件化开发视频教程,教你打造一个Android组件化开发框架

    作者简介 本篇来自 lucky_billy 的投稿,分享了他的开源组件化框架,详细地讲解框架形成的思路,希望对大家有所帮助. lucky_billy 的博客地址: 解读开源框架设计思想 B站学习视频 ...

  4. 教你打造一个Android组件化开发框架

    *本篇文章已授权微信公众号 guolin_blog (郭霖)独家发布 CC:Component Caller,一个android组件化开发框架, 已开源,github地址:https://github ...

  5. 从零开始打造一个Android 3D立体旋转容器

    本文地址,转载请注明 http://blog.csdn.net/mr_immortalz/article/details/51918560  github 代码下载地址 :https://github ...

  6. Android Jetpack 组件之 Lifecycle源码

    1.前言 最近简单看了下google推出的框架Jetpack,感觉此框架的内容可以对平时的开发有很大的帮助,也可以解决很多开发中的问题,对代码的逻辑和UI界面实现深层解耦,打造数据驱动型UI界面. A ...

  7. Android Jetpack 组件之 Lifecycle使用

    1.前言 最近简单看了下google推出的框架Jetpack,感觉此框架的内容可以对平时的开发有很大的帮助,也可以解决很多开发中的问题,对代码的逻辑和UI界面实现深层解耦,打造数据驱动型UI界面. A ...

  8. vue.js+socket.io打造一个好玩的新闻社区

    title: Socket.io+vue打造新闻社区 date: 2017-06-12 20:19:05 tags: [vue.js,javascript,socket.io] vue2.0 + so ...

  9. 用RecyclerView打造一个轮播图

    通常Android的轮播图(俗名:Banner)都是用ViewPager实现的,但是我在实际项目运用中碰到了一些小问题,于是决定另寻思路,采用RecyclerView这个更优雅更强大的控件来实现轮播的 ...

最新文章

  1. 用Python分析你是否已经实现荔枝自由了?
  2. 没想到租房也要会编程?
  3. 转贴 DISCUZ7.0 恢复被删除的会员的UID
  4. Spring事务与自定义多线程陷阱
  5. 全球及中国生物降解塑料行业应用需求前景及竞争态势研究报告2021版
  6. SQL Server 查询处理中的各个阶段(SQL执行顺序)
  7. linux系统安全详解
  8. qt按钮禁用和激活禁用_为什么试探法只是经验法则:禁用按钮的情况
  9. 用VSCode开发一个asp.net core2.0+angular5项目(5): Angular5+asp.net core 2.0 web api文件上传...
  10. (转载)JavaScript中的原型和对象机制
  11. Spring源码下载地址
  12. handler机制及使用场景
  13. C++ opencv显示fps帧率
  14. 2009 SD 2.0大会北京温都水城盛大召开(10月22日)
  15. 搭建一个个人网站需要多少钱预算?
  16. 华为nova手机打开开发者模式
  17. 巴菲特经典演讲《价值投资为什么能够持续战胜市场》
  18. Android 9.0 (P)
  19. UE-摄像机视角的切换
  20. 操作文件操作符的工作模式:LT(电平触发)ET(边缘触发)实验对比

热门文章

  1. 企业服务总线Enterprise service bus介绍
  2. c语言中char类型转int类型
  3. java几个注解的作用及比较(@RestController、@Controller、@ResponseBody、@RequestBody等)
  4. 高通平台开发系列讲解(系统篇)系统关机流程
  5. linux查找表空间使用情况,表空间的使用情况查询及管理
  6. 股指期货、股指期权与股票有何不同?
  7. 项目经理的软技能、硬技能
  8. 2019C语言课程设计
  9. 怎么样手机里面的计算机发出音乐,周三手机课︱怎样把U盘、电脑、微信的音乐存在手机里?...
  10. Linux内核的删除