安卓屏保调试

安卓屏保调试 - Wesley's Blog

先看一下在设置点击屏保预览后的调用链(Android 14)

sequenceDiagram participant User participant MaterialButton participant View participant DreamSettings participant DreamBackend User->>MaterialButton: 点击按钮( performClick()) MaterialButton->>View: performClick() View->>DreamSettings: 触发 onClick() (lambda 表达式) DreamSettings->>DreamBackend: 调用 preview()

DreamController的打印信息

Starting dream: name=ComponentInfo{com.google.android.apps.tv.dreamx/com.google.android.apps.tv.dreamx.service.Backdrop}, isPreviewMode=true, canDoze=false, userId=0, reason='test dream'

DreamActivity是一个不需要注册的Activity,运行在各个屏保进程。

屏保应用实现DreamService即可。

屏保状态时,后台起应用会进入 onStop 状态(该例子 onStop 里面调用了 finish)

退出屏保的方法

1、有触摸或者按键输入

2、配置config_dismissDreamOnActivityStart 为 true 则会在新 activity 起来后退出屏保

xml 复制代码
 <!-- Whether to dismiss the active dream when an activity is started. Doesn't apply to
​
          assistant activities (ACTIVITY_TYPE_ASSISTANT) -->
​
<bool name="config_dismissDreamOnActivityStart">false</bool>

3、跨进程调用DreamManagerService 的awaken(需要系统签名)

kotlin 复制代码
import android.os.IBinder
import androidx.annotation.RequiresPermission
​
class DreamManager {
    private val TAG = "DreamManager"
    //private var mDreamManager: Any? = context.getSystemService("dream")
    private var mDreamManager: Any? = null
​
    init {
        mDreamManager = try {
            val dream = Reflector.on("android.os.ServiceManager").method("getService", String::class.java).call<Any>("dreams")
            Reflector.on("android.service.dreams.IDreamManager$Stub").method("asInterface", IBinder::class.java).call<Any>(dream)
        } catch (e: Exception) {
            null
        }
    }
​
    @RequiresPermission("android.permission.READ_DREAM_STATE")
    fun isDreaming(): Boolean {
        if (mDreamManager == null) {
            return false
        }
        return try {
            Reflector.with(mDreamManager!!).method("isDreaming").call()
        } catch (e: Exception) {
            false
        }
    }
​
    @RequiresPermission("android.permission.WRITE_DREAM_STATE")
    fun stopDream() {
        mDreamManager?.let {
            try {
                Reflector.with(it).method("awaken").call<Unit>()
            } catch (e: Exception) {
            }
        }
    }
}

屏保调试命令:cmd dreams

roc_rk3588s_pc:/ # cmd dreams -h

Dream manager (dreams) commands:

help

Print this help text.

start-dreaming

Start the currently configured dream.

stop-dreaming

Stops any active dream

cmd dreams start-dreaming

cmd dreams stop-dreaming

相关推荐
事圆则缓1 小时前
Android 开启线程的几种方式:Thread、线程池、HandlerThread 与协程
android
半摆烂日常16 小时前
低代码平台API对接实践:接口鉴权与数据同步的完整实现
android·低代码·rxjava
事圆则缓16 小时前
volatile 使用场景全解析:它能保证什么,又解决不了什么
android
蒲公英内测分发17 小时前
智能投影仪参加海外展会,未上架的 Android 配套 App 怎么让客户限时试用?
android
ii_best17 小时前
按键精灵手机端开发安卓版实战:手写一个可最小化、可拖动的「运行日志悬浮窗」(附完整 源码 + 踩坑记录)
android·ios·智能手机·自动化·ai编程·按键精灵
终端安全笔记17 小时前
安卓做 MDM 管控,先分清三种注册入口
android·安全·智能手机
乌萨达18 小时前
手机模拟器安卓怎么用?电脑安装应用、玩手游与账号同步指南
android·智能手机·电脑·雷电模拟器
美狐美颜SDK开放平台19 小时前
Android与iOS直播APP美颜有什么区别?视频美颜SDK开发详解
android·ios·音视频·视频美颜sdk
春猿火20 小时前
某市-2026【网安·论道】misc-afterimage_note-wp
android
恋猫de小郭1 天前
Shopify 回应为什么从 RN 回到原生,为什么不用 KMP ?
android·前端·flutter