前言
最近在處理Dock相關的問題,開始接觸 Android DreamService 相關問題。搜了下網路上資料不多,於是自己整理下方便以後查閱。
什麼是DreamService
在 Android 中類原生的系統在設定中會有屏保這一選項(國內定製的OS很多去掉了這一功能)。
AOSP中的預設設定為 Clock,While docked啟用。點選後,會開啟啟動 DeskClock.apk的這裡啟動的是 DeskClock 的 Screensaver,繼承自DreamService。 這裡的預設啟動時間配置在 frameowrks/base/core/res/res/values/config.xml
呼叫程式碼位於frameworks/base/packages/SettingsLib/src/com/android/settingslib/dream/DreamBackEnd.java這裡連結是對DreamService的介紹
developer.android.com/reference/a…
這是原始碼
androidxref.com/8.1.0_r33/x…
可以根據以上實現定製的屏保。如何實現不做介紹,這裡有篇部落格可以看下blog.csdn.net/a2700419/ar…
DreamService和Dock
這裡主要想記錄下 DreamService 和 Dock 相關的問題。
Android 是有設計 Dock 狀態的。
developer.android.com/training/mo…
developer.android.com/reference/a…
在接收到 Intent.ACTION_DOCK_EVENT 廣播後,PowerManagerService中有註冊針對該廣播的監聽,根據DOCK狀態和圖一的屏保啟動時間,判斷是否啟動屏保。 精簡後的程式碼裡流程如下:
PowerManagerService.java
->systemReady()
-->mContext.registerReceiver(new DockReceiver(), filter, null, mHandler)
--->DockReceiver.onReceive()
---->updatePowerStateLocked()
----->updateDreamLocked(dirtyPhase2, displayBecameReady)
------>scheduleSandmanLocked()
------->handleSandman()
-------->mDreamManager.startDream(wakefulness == WAKEFULNESS_DOZING)
DreamManagerService.java
->LocalService.startDream(boolean doze)
-->startDreamInternal(doze)
--->startDreamLocked(dream, false /*isTest*/, doze, userId)
---->mController.startDream(newToken, name, isTest, canDoze, userId, wakeLock)
DreamController.java
->startDream()
-->mContext.bindServiceAsUser(intent, mCurrentDream,Context.BIND_AUTO_CREATE | Context.BIND_FOREGROUND_SERVICE,new UserHandle(userId))
複製程式碼