日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > Android >内容正文

Android

【Android】恢复出厂后静态壁纸加载流程

發(fā)布時(shí)間:2023/12/14 Android 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【Android】恢复出厂后静态壁纸加载流程 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Android靜態(tài)壁紙功能實(shí)現(xiàn)參與的類

/frameworks/base/core/java/android/app/WallpaperManager.java
給開發(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沒指定,則使用image_wallpaper_component指定的ImageWallpaper

開機(jī)壁紙加載流程

1.SystemServer.java -> startOtherServices()內(nèi)通過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)開頭包括了wallpaper_info文件的創(chuàng)建(JounrnaledFile類)、壁紙文件wallpaper(WallpaperData)的生成、wallpaper_info文件的解析(XmlPullParser)。

loadSettingsLocked(){```if (!success) {wallpaper.width = -1;wallpaper.height = -1;wallpaper.cropHint.set(0, 0, 0, 0);wallpaper.padding.set(0, 0, 0, 0);wallpaper.name = "";// wallpaper.name = "res:com.desaysv.dsvsettings:drawable/wallpaper_bg_dark_normal_1";mLockWallpaperMap.remove(userId);} else {if (wallpaper.wallpaperId <= 0) {wallpaper.wallpaperId = makeWallpaperIdLocked();if (DEBUG) {Slog.w(TAG, "Didn't set wallpaper id in loadSettingsLocked(" + userId+ "); now " + wallpaper.wallpaperId);}}}ensureSaneWallpaperData(wallpaper);``` }

由于首次啟動(dòng)時(shí)不存在wallpaper_info.xml,所以success為false,開始初始化wallpaperData屬性,并調(diào)用ensureSaneWallpaperData()方法通過WindowManager.getDefaultDisplay.getMaximumSizeDimension()獲取屏幕最大尺寸作為壁紙寬高。

4.WallpaperManagerService.java->switchUser()
開啟WallpaperObserver和ThemeSettingsObserver監(jiān)聽,觀測切換壁紙和主題操作

5.WallpaperManagerService.java->bindWallpaperComponentLocked()
拉起壁紙服務(wù),默認(rèn)為ImageWallpaper。并向WMS申請用于添加壁紙窗口的窗口令牌。后續(xù)這一部分主要由WallpaperConnection.onServiceConnected()回調(diào)中處理。

6.WallpaperManagerService.java->attachServiceLocked()
在方法內(nèi)調(diào)用IWallpaperServiceWrapper的attach方法,將創(chuàng)建壁紙窗體需要的信息給到WallpaperService。

void attachServiceLocked(WallpaperConnection conn, WallpaperData wallpaper) {try {conn.mService.attach(conn, conn.mToken,TYPE_WALLPAPER, false,wallpaper.width, wallpaper.height, wallpaper.padding);} catch (RemoteException e) {Slog.w(TAG, "Failed attaching wallpaper; clearing", e);if (!wallpaper.wallpaperUpdating) {bindWallpaperComponentLocked(null, false, false, wallpaper, null);}}}

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í)例,無需擔(dān)心被回收,而且WallpaperManagerService還可以通過它與實(shí)際Engine進(jìn)行通信。之后再創(chuàng)建Engine對象,Engine是真正的壁紙實(shí)現(xiàn)。
engine.attach()方法內(nèi)也進(jìn)行壁紙繪制。

9.updataSurfaceSize()->loadWallpaper()->mWallpaperManager.getBitmap()
通過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 下提供壁紙資源,通過context.gerResource().openRawResource()返回,在getDefaultWallpaper()中轉(zhuǎn)成bitmap交由ImageWallpaper的drawFrame()進(jìn)行繪制

總結(jié)

以上是生活随笔為你收集整理的【Android】恢复出厂后静态壁纸加载流程的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。