標籤:簽名 分享 com 資料 intent blog xml檔案 ble tco
研究代碼從:AndroidManifest.xml、自訂的Application.java開始。
Android系統啟動時,系統需要一個Home應用程式來負責將這些應用程式展示出來;也就是該應用的目的在於:Android系統啟動後,第一個啟動的應用程式。在Android系統中,這個預設的Home應用程式就是Launcher。
要把某個應用程式作為Home,只需要在Android.xml檔案中添加一個category:
<intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.HOME" /> <category android:name="com.aliyun.ushell.action.detailpage" /></intent-filter>
對於AndroidManifest.xml檔案中的幾個屬性說明:
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.aliyun.ushell" coreApp="true" android:sharedUserId="android.uid.system" android:versionCode="2" android:versionName="1.2.3" >
其中android:sharedUserId決定是否需要系統簽名;android:theme決定整個應用的theme和style;andrid:debuggable決定應用是否處於偵錯模式。
疑問:
1. Launcher是如何被啟動的?Android系統為什麼在啟動時會預設啟動Launcher?
2. Launcher主要做什麼工作?
Android系統開機會啟動Launcher,Launcher是由ActivityManager啟動的,而ActivityManager是由SystemServer啟動。
此處就用到了在AndroidManifest.xml檔案中添加的intent-filter屬性值:category_home。一般綁定使用上述的三個category,也就是關鍵詞:main/default/home。
Launcher的主要工作是:監聽應用的安裝、更新、刪除等導致Launcher資料庫變化的操作。Launcher資料都是使用ContentProvider來提供資料,也就是需要自訂ContentResolver監聽指定Uri資料的變化。
private final ContentObserver mObserver = new ContentObserver(new Handler()) { @Override public void onChange(boolean selfChange, Uri uri) { final int nightSwitch = Global.getInt(UShellApplication.this.getContentResolver(), SWITCH_KEY, -1); final int nightOn = Global.getInt(UShellApplication.this.getContentResolver(), ON_KEY, -1); final boolean wallpaperOn = (Global.getInt(UShellApplication.this.getContentResolver(), WALLPAPER_KEY, DEFAULT_WALLPAPER) == 1); mWallpaperOn = wallpaperOn; if (readTime() || nightSwitch != mNightSwitch || nightOn != mNightOn) { mNightSwitch = nightSwitch; mNightOn = nightOn; if (!Utilities.IS_ZHONGHONG) { onTimeChanged(); } else { onZHChanged(null); } } }};
Launcher啟動的過程主要就是載入介面資料然後顯示出來,介面資料都是系統App有關的資料(可能包含Launcher資料庫)。
Android的Launcher啟動流程 “Launcher部分啟動流程”