【Android】恢复出厂后静态壁纸加载流程
Android靜態(tài)壁紙功能實(shí)現(xiàn)參與的類
/frameworks/base/core/java/android/app/WallpaperManager.java
給開(kāi)發(fā)者提供方法調(diào)用。例:setBitmap()/getBitmap()
/frameworks/base/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java
系統(tǒng)服務(wù),管理壁紙的運(yùn)行和切換,由SystemServer啟動(dòng)
/frameworks/base/core/java/android/service/wallpaper/WallpaperService.java
Android壁紙服務(wù),ImageWallpaper的父類
/frameworks/base/packages/SystemUI/src/com/android/systemui/ImageWallpaper.java
Android設(shè)定的壁紙服務(wù),如果default_wallpaper_component沒(méi)指定,則使用image_wallpaper_component指定的ImageWallpaper
開(kāi)機(jī)壁紙加載流程
1.SystemServer.java -> startOtherServices()內(nèi)通過(guò)config_enableWallpaperService該布爾值判斷是否啟動(dòng)壁紙服務(wù):
if (context.getResources().getBoolean(R.bool.config_enableWallpaperService)) {traceBeginAndSlog("StartWallpaperManagerService");mSystemServiceManager.startService(WALLPAPER_SERVICE_CLASS);traceEnd(); }服務(wù)準(zhǔn)備就緒后進(jìn)行初始化操作,WallpaperManagerService.java->initialize()
void initialize() {mMonitor.register(mContext, null, UserHandle.ALL, true);getWallpaperDir(UserHandle.USER_SYSTEM).mkdirs();// Initialize state from the persistent store, then guarantee that the// WallpaperData for the system imagery is instantiated & active, creating// it from defaults if necessary.loadSettingsLocked(UserHandle.USER_SYSTEM, false);getWallpaperSafeLocked(UserHandle.USER_SYSTEM, FLAG_SYSTEM);}2.WallpaperManagerService.java->getWallpaperDir()
getWallpaperDir(UserHandle.USER_SYSTEM).mkdirs();創(chuàng)建系統(tǒng)用戶目錄/data/system/users/0/,其目錄下在壁紙顯示后會(huì)生成wallpaper_info.xml文件,用于存放壁紙的寬度、高度、壁紙存放位置等信息。
3.WallpaperManagerService.java->loadSettingsLocked()
該方法內(nèi)開(kāi)頭包括了wallpaper_info文件的創(chuàng)建(JounrnaledFile類)、壁紙文件wallpaper(WallpaperData)的生成、wallpaper_info文件的解析(XmlPullParser)。
由于首次啟動(dòng)時(shí)不存在wallpaper_info.xml,所以success為false,開(kāi)始初始化wallpaperData屬性,并調(diào)用ensureSaneWallpaperData()方法通過(guò)WindowManager.getDefaultDisplay.getMaximumSizeDimension()獲取屏幕最大尺寸作為壁紙寬高。
4.WallpaperManagerService.java->switchUser()
開(kāi)啟WallpaperObserver和ThemeSettingsObserver監(jiān)聽(tīng),觀測(cè)切換壁紙和主題操作
5.WallpaperManagerService.java->bindWallpaperComponentLocked()
拉起壁紙服務(wù),默認(rèn)為ImageWallpaper。并向WMS申請(qǐng)用于添加壁紙窗口的窗口令牌。后續(xù)這一部分主要由WallpaperConnection.onServiceConnected()回調(diào)中處理。
6.WallpaperManagerService.java->attachServiceLocked()
在方法內(nèi)調(diào)用IWallpaperServiceWrapper的attach方法,將創(chuàng)建壁紙窗體需要的信息給到WallpaperService。
7.WallpaperService-IWallpaperServiceWrapper.attach()
構(gòu)造IWallpaperEngineWrapperService實(shí)例,并在方法內(nèi)發(fā)送DO_ATTACH信息。
8.WallpaperService.java->executeMessage()
public void executeMessage(Message message) {switch (message.what) {case DO_ATTACH: {try {mConnection.attachEngine(this);} catch (RemoteException e) {Log.w(TAG, "Wallpaper host disappeared", e);return;}Engine engine = onCreateEngine();mEngine = engine;mActiveEngines.add(engine);engine.attach(this);return;}....WallpaperConnection保存IWallpaperEngineWrapper實(shí)例,無(wú)需擔(dān)心被回收,而且WallpaperManagerService還可以通過(guò)它與實(shí)際Engine進(jìn)行通信。之后再創(chuàng)建Engine對(duì)象,Engine是真正的壁紙實(shí)現(xiàn)。
engine.attach()方法內(nèi)也進(jìn)行壁紙繪制。
9.updataSurfaceSize()->loadWallpaper()->mWallpaperManager.getBitmap()
通過(guò)getBitmap()方法獲取。
10.WallpaperManager.java->openDefaultWallpaper()
public static InputStream openDefaultWallpaper(Context context, @SetWallpaperFlags int which) {final String whichProp;final int defaultResId;if (which == FLAG_LOCK) {/* Factory-default lock wallpapers are not yet supportedwhichProp = PROP_LOCK_WALLPAPER;defaultResId = com.android.internal.R.drawable.default_lock_wallpaper;*/return null;} else {whichProp = PROP_WALLPAPER;defaultResId = com.android.internal.R.drawable.default_wallpaper;}//不走buildinfo.sh文件讀取默認(rèn)屬性值,且該文件的ro.config.wallpaper屬性已經(jīng)丟失final String path = SystemProperties.get(whichProp);if (!TextUtils.isEmpty(path)) {final File file = new File(path);if (file.exists()) {try {return new FileInputStream(file);} catch (IOException e) {//Ignored, fall back to platform default below}}}try {return context.getResources().openRawResource(defaultResId);} catch (NotFoundException e) {// no default defined for this device; this is not a failure}return null;}在此有frameworks/base/core/res/res/drawable 下提供壁紙資源,通過(guò)context.gerResource().openRawResource()返回,在getDefaultWallpaper()中轉(zhuǎn)成bitmap交由ImageWallpaper的drawFrame()進(jìn)行繪制
總結(jié)
以上是生活随笔為你收集整理的【Android】恢复出厂后静态壁纸加载流程的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: java局域网发送文件_Java如何实现
- 下一篇: 基于STM32设计的掌上游戏机(运行NE