安卓屏保调试 - Wesley’s Blog
先看一下在设置点击屏保预览后的调用链(Android 14)
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 起来后退出屏保
<!-- Whether to dismiss the active dream when an activity is started. Doesn't apply toassistant activities (ACTIVITY_TYPE_ASSISTANT) --><bool name="config_dismissDreamOnActivityStart">false</bool>
3、跨进程调用DreamManagerService 的awaken(需要系统签名)
import android.os.IBinder
import androidx.annotation.RequiresPermissionclass DreamManager {private val TAG = "DreamManager"//private var mDreamManager: Any? = context.getSystemService("dream")private var mDreamManager: Any? = nullinit {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