IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> Android使用Startup和Lifecycle打造一个单独的测试module -> 正文阅读

[移动开发]Android使用Startup和Lifecycle打造一个单独的测试module

前言
有时我们在项目中会不可避免的写一些测试代码(如环境切换,测试页面等等),这些代码可能会存在不同的地方,不方便管理和修改,上线时又不需要把这些代码打进生产包。那么我们能不能以一种非侵入的方式来写这些测试代码呢?组件化开发,我们可以新建一个单独的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是Application
        ProcessLifecycleOwner.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"/>

        <provider
            android:name="androidx.startup.InitializationProvider"
            android:authorities="${applicationId}.androidx-startup"
            android:exported="false"
            tools:node="merge">
            <meta-data
                android:name="com.cbim.test.TestInitializer"
                android:value="androidx.startup" />
        </provider>
    </application>

</manifest>

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

package com.cbim.test

import 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那样使用悬浮按钮进行测试相关功能的使用了

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2022-09-04 01:23:00  更:2022-09-04 01:24:02 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 4:35:46-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码