【原始碼解析】Launcher 8.0原始碼(8)---Launcher的原始碼啟動過程第三步之建立統一Launcher輔助物件
Launcher8.0的Launcher的原始碼啟動過程第三步是建立一系列的Launcher輔助物件,包括UI圖示資料的處理類,具體拖拽操作的輔助類,以及為後臺執行做準備。
具體的原始碼部分是這樣寫的:
1. mOrientation = getResources().getConfiguration().orientation; 2. mSharedPrefs = Utilities.getPrefs(this); 3. mIsSafeModeEnabled = getPackageManager().isSafeMode(); 4. mModel = app.setLauncher(this); 5. mModelWriter = mModel.getWriter(mDeviceProfile.isVerticalBarLayout()); 6. mIconCache = app.getIconCache(); 7. mAccessibilityDelegate = new LauncherAccessibilityDelegate(this); 8. mDragController = new DragController(this); 9. mAllAppsController = new AllAppsTransitionController(this); 10. mStateTransitionAnimation = new LauncherStateTransitionAnimation(this, mAllAppsController); 11. mAppWidgetManager = AppWidgetManagerCompat.getInstance(this); 12. mAppWidgetHost = new LauncherAppWidgetHost(this); 13. if (Utilities.ATLEAST_MARSHMALLOW) { mAppWidgetHost.addProviderChangeListener(this); } 14. mAppWidgetHost.startListening(); // If we are getting an onCreate, we can actually preempt onResume and unset mPaused here, // this also ensures that any synchronous binding below doesn't re-trigger another // LauncherModel load. 15. mPaused = false; 16. mLauncherView = LayoutInflater.from(this).inflate(R.layout.launcher, null);
每一步都標上序號,我們來一一進行分析:
第一個物件是mOrientation 獲取當前手機處於橫屏還是豎屏
橫豎屏狀態下包括佈局,操作等都有不同。
第二個物件是SharedPreferences
這裡建立的sp物件在Launcher中起著重量級的作用,除了儲存桌面佈局的行為在在LauncherProvider完成,剩下的資訊基本都在SharedPreferences中儲存,比如預設螢幕是哪一屏。特別是長按桌面空白的home Settings的選項都是使用SharedPreferences。
第三個物件是獲取當前時候處於安全模式下。
裝置在日常使用過程中,不可避免的會新增安裝第三方應用。但並不是每一個應用都是安全的,對系統無傷害的。由於第三方應用程式,可能會存在一定的相容性問題,所以在安裝軟體後可能會出現系統檔案報錯,甚至手機無法正常開機或者開機後系統程式不停報錯的現象。遇到這種情況,若進行恢復出廠設定,手機中的資料是無法進行備份的,但是Android系統中添加了"安全模式"這項功能,有效的避免上述情況同時來排除故障。安全模式下,只能啟動系統應用,第三方應用都不會開啟或者啟動。
第四個物件是LauncherModel
繼承BroadcastReceiver,是一個廣播接收器,用來接收廣播,主要作用是載入資料,處理資料,儲存桌面狀態,內部類LoaderTask用來初始化桌面。LauncherModel是非常重要的一個類,在啟動流程中佔據了半壁江山
第五個物件是 ModelWriter
LauncherModel的輔助類,修改儲存在資料庫裡面的資料。
第六個物件是IconCache
此類主要儲存圖示資訊,圖示的圖片實際都是有各個APK自主提供,而Launcher通過系統介面從手機中讀取所有應用的圖示將其存在快取中,避免每次重新整理都從手機讀取。如果一個應用未能讀取到圖示,則採用預設圖示,也就是安卓小機器人。
第七個物件是LauncherAccessibilityDelegate
拖拽的輔助類,裡面的事件有新增,拖動等。
第八個物件DragController
DragController是處理拖拽的重要類,Launcher的頂級佈局是DragLayer,所有的拖拽都是在這個佈局中完成的,DragController就是DragLayer實現拖拽的輔助類。
第九個物件AllAppsTransitionController
AllAppsController服務於AllAppsContainerView,幫助處理allapp的拖拽等事件。(這個介面是裝載所有App的介面)
第十個物件LauncherStateTransitionAnimation
Launcher各個模組之前的切換。比如,從普通模式到拖拽模式,從普通模式到overview模式,從普通模式到allapp模式等等。 LauncherStateTransitionAnimation則是負責完成從一個模式到另一個模式切換的類。
第十一個物件AppWidgetManagerCompat
是輔助AppWidgetManager的一個類,Launcher會從AppWidgetManager中獲取一些資料,並且進行一個簡單處理後再使用。在實際使用過程中,Launcher發現好多地方都會用到AppWidgetManager的資料,且進行相同的處理。 寫好程式碼的規則有一條,是“程式碼重構”的相關知識點,其中有種“壞味道”叫做“重複程式碼”。 簡單說,如果同樣程式碼在整個應用中多次出現,則應該把這些程式碼統一放到一個方法裡面。這樣程式碼只出現一次。後面處理方式發生變化,只需在一處修改即可。像對AppWidgetManager處理方式有好幾種,每種都好多處用到。則單獨建立一個類來存放。
第十二個物件 LauncherAppWidgetHost
建立一個Widget元件。確保Widget可以拖拽。
第十三步新增CallBack
判斷當前版本,給Weight新增變化的監聽器。
第十四步mAppWidgetHost.startListening()
startListening意味著桌面的widget收到對應app的控制。
第十五步mPaused = false
此引數是用於判斷當前Launcher是否處於mPause狀態。因為Launcher而有很多後臺被動操作,也就是說很有可能Launcher在後臺的時候被其他應用呼叫,這個時候有些行為就需要知道是否處於mPaused