APK安裝流程詳解1——有關(guān)"安裝ing"的實(shí)體類概述

APK安裝流程系列文章整體內(nèi)容如下:

本片文章主要內(nèi)容如下:

  • 1、AndroidManifest的另一種理解
  • 2、PackageInfo類簡介
  • 3、PackageItemInfo類簡介類
  • 4、ApplicationInfo類簡介
  • 5、ComponentInfo類簡介
  • 6、ActivityInfo類簡介
  • 7、ServiceInfo類簡介
  • 8、ProviderInfo類簡介
  • 9、ResolveInfo類簡介
  • 10、PermissionInfo類簡介
  • 11、PermissionGroupInfo類簡介
  • 12、上述這些類的關(guān)系
  • 13、Android中的UID、GID與GIDS的簡介
  • 14、@GuardBy、@SystemApi、@hide Android注解簡介

一、AndroidManifest的另一種理解

為了讓后面大家更好的理解安裝流程,本片文章先預(yù)熱下,說到安裝就不能不說下AndroidManifest.xml文件,因?yàn)樵蹅傾PK的的核心東西都在里面,但是它是一個"xml"文件,在安裝的時候,必然會把它序列化掉,那序列化后對應(yīng)的都是什么對象?為了便于理解,我從網(wǎng)站"借"了一張AndroidManifest.xml文件節(jié)點(diǎn)的說明圖:

AndroidManifest文件節(jié)點(diǎn).png

下面我們根據(jù)上面的那張圖來依次把涉及到的類都詳細(xì)說明下:

二、PackageInfo類簡介

該類包含了從AndroidManifest.xml文件中收集的所有信息。
PackageInfo.java源碼地址
通過源碼我們知道PackageInfo是實(shí)現(xiàn)Parcelable接口,所以它可以在進(jìn)程間傳遞

1、重要成員變量簡介

  • public String packageName:包名
  • public String versionName:版本名
  • public String versionCode:版本號
  • public String sharedUserId:共享用戶ID,簽名相同的情況下程序之間數(shù)據(jù)共享
  • public long firstInstallTime:第一次安裝時間,忽略之前安裝后卸載的情況單位ms
  • public long lastUpdateTime:最后更新時間,相同版本號的APK覆蓋安裝,該值也會發(fā)生變化,單位ms
  • public String[] requestedPermissions:請求的權(quán)限
  • public ApplicationInfo applicationInfo:Applicationinfo對象,下面會講解
  • public ActivityInfo[] activities:注冊的Activity
  • public ActivityInfo[] receivers:注冊的Receiver,PS:注意這里是ActivityInfo[]
  • public ServiceInfo[] services:注冊的服務(wù)
  • public ProviderInfo[] providers:注冊的Providers

2、重要方法簡介

  • public PackageInfo():構(gòu)造函數(shù)
  • private PackageInfo(Parcel source):構(gòu)造函數(shù),反序列時用到的,注意這個方法是private,所以這個方法只是給反序列時用的,所以PackageInfo對外就提供一個構(gòu)造函數(shù)
  • private void propagateApplicationInfo(ApplicationInfo appInfo, ComponentInfo[] components):主要是給入?yún)⒌腸omponents中的每一項ComponentInfo的applicationInfo變量指向第一個入?yún)ppInfo。

三、PackageItemInfo類簡介

PackageItemInfo類源碼位置

PackageItemInfo類:它是AndroidManifest.xml文件中所有節(jié)點(diǎn)的基類,代表一個應(yīng)用包內(nèi)所有組件和通用信息的基類。該類提供最基本的屬性集合,如:label、icon、meta等。一般不會直接用這個類,設(shè)計它的目的就是為包內(nèi)其他基本組件提供統(tǒng)一的基礎(chǔ)定義。它沒有實(shí)現(xiàn)接口Parcelable,但它提供了傳Parcel型的構(gòu)造函數(shù),以及writeToParcel()方法給它的子類來實(shí)現(xiàn)PackageItemInfo內(nèi)部的成員Parcel化。

1、重要成員變量簡介:

  • public int icon:獲取該組件項在R文件中drawable的資源id值,對應(yīng)的是"android:icon"屬性,如果不設(shè)置為0。
  • public int labelRes:獲取該組件項在R文件中String型的資源idint值,對應(yīng)的是"android:label",如果不設(shè)置為0。
  • public String packageName:獲取該組件項的包名,對應(yīng)的是"android:packagename"屬性。
  • public String name:獲取該組件項的公共名稱,對應(yīng)的是"android:name"
  • public int banner:獲取該組件項在R文件中drawable的資源id值,對應(yīng)是"android:banner",不設(shè)置為0
  • public int logo:獲取該組件項在R文件中drawable的資源id值,比應(yīng)用圖標(biāo)要大,一般用在ToolBar上面,對應(yīng)是"android: logo",不設(shè)置為0
  • public Bundle metaData:對應(yīng)AndroidManifest中的<meta-data>標(biāo)簽。只有<activity>、<activity-alias>、<service>、<receiver>、<application>標(biāo)簽中可能包含<meta-data>子標(biāo)簽。
  • public int logo:獲取該組件項在R文件中drawable的資源id值,比應(yīng)用圖標(biāo)要大,一般用在ToolBar上面,對應(yīng)是"android: logo",不設(shè)置為0
  • public int showUserIcon:默認(rèn)值是serHandle.USER_NULL、也可能是
    UserHandle.USER_OWNER,只有實(shí)例的引用來訪問

2、重要方法簡介:

  • PackageItemInfo():構(gòu)造函數(shù)
  • public PackageItemInfo(PackageItemInfo orig):構(gòu)造函數(shù),傳入一個orig,進(jìn)行變量拷貝而已
  • protected PackageItemInfo(Parcel source):反序列化時用到的構(gòu)造函數(shù),注釋他是protected,說只要是PackageItemInfo的子類局均可以調(diào)用
  • public CharSequence loadLabel(PackageManager pm):返回該組件項的標(biāo)簽,優(yōu)先級為:nonLocalizedLabel>labelRes>name>packageName
  • public Drawable loadIcon(PackageManager pm):獲取當(dāng)前組件的圖標(biāo),其實(shí)是通過PackageManager的loadItemIcon()來獲取的。
  • public Drawable loadBanner(PackageManager pm):獲取當(dāng)前組件的的banner,內(nèi)部是通過PackageManager的getDrawable()來獲取的banner對應(yīng)的Drawable,如果banner為0,返回loadDefaultBanner()的結(jié)果。
  • public Drawable loadLogo(PackageManager pm):返回該組件項的大圖標(biāo),通過PackageManager的getDrawable()方法獲取logo對應(yīng)的Drawable,如果logo為0,返回loadDefaultLogo()的結(jié)果。
  • public Drawable loadDefaultIcon(PackageManager pm):返回該組件項的默認(rèn)圖標(biāo),通過PackageManager的getDefaultActivityIcon()方法,返回的是com.android.internal.R.drawable.sym_def_app_icon對應(yīng)的Drawable。
  • protected Drawable loadDefaultBanner(PackageManager pm):返回null
  • protected Drawable loadDefaultLogo(PackageManager pm):返回null
  • public XmlResourceParser loadXmlMetaData(PackageManager pm, String name):找到metaData對應(yīng)為name的資源id,通過PackageManager的getXml()方法返回id對應(yīng)的XmlResourceParser。
  • protected ApplicationInfo getApplicationInfo():返回null
  • public void writeToParcel(Parcel dest, int parcelableFlags):為PackageItemInfo的子類Parcel化提供基類部分成員的寫入。

四、ApplicationInfo類簡介

ApplicationInfo類源碼位置

ApplicationInfo類:它繼承自PackageItemInfo并實(shí)現(xiàn)了Parcelable 接口,它對應(yīng)manifest里面的<application>節(jié)點(diǎn)的信息

1、特殊成員變量flags如下:

  • int flags:代表Application的類型,它是進(jìn)行"位與"操作的選項,大家可以看下面的每一個只占用"1位":
    • FLAG_SYSTEM:系統(tǒng)應(yīng)用程序
    • FLAG_DEBUGGABLE:應(yīng)用程序允許debug,對應(yīng)manifest里面的android:debuggable屬性。
    • FLAG_HAS_CODE:應(yīng)用程序是否含有代碼,平時比較少用,如果,對應(yīng)manifest里面的android:hasCode,為true表明有代碼,為false表明代碼,如果沒有代碼則加載組件時系統(tǒng)不會嘗試加載任何應(yīng)用程序的代碼。應(yīng)用程序一般沒有它自己的任何代碼,除非它僅僅是由組件類的構(gòu)建而成的。
    • FLAG_PERSISTENT:應(yīng)用程序是否永久駐留,對應(yīng)manifest文件中的android:persistent="true",理論上意思是應(yīng)用程序所在進(jìn)程不會被LMK殺死。但是這里有個前提,就是應(yīng)用程序必須是系統(tǒng)應(yīng)用。也就是說普通的應(yīng)用程序設(shè)置這個屬性其實(shí)是沒有用的。如果你的應(yīng)用程序的apk直接放到/system/app目錄下。而且必須重啟系統(tǒng)才能生效
    • FLAG_FACTORY_TEST:應(yīng)用程序支持Factory Test,關(guān)于Factory Test 這里就不詳細(xì)展開了,有興趣的可以閱讀這篇文章Android FactoryTest框架
    • FLAG_ALLOW_TASK_REPARENTING:設(shè)置activity從一個task遷移到另一個task的標(biāo)簽,這塊后面在activity啟動流程中會詳細(xì)講解,對應(yīng)的manifest文件是android:allowTaskReparenting。
    • FLAG_ALLOW_CLEAR_USER_DATA:設(shè)置用戶自動清除數(shù)據(jù),對應(yīng)manifest中為android:allowClearUserData,該值設(shè)為true時,用戶可以自己自己清除用戶數(shù)據(jù),反之則用戶不能清除。
    • FLAG_UPDATED_SYSTEM_APP: 表明系統(tǒng)應(yīng)用程序被用戶升級后,也算用戶的應(yīng)用程序
    • FLAG_TEST_ONLY:表示該應(yīng)用僅僅用于測試,對應(yīng)manifest里面的android:testOnly,如果設(shè)置為true,則表明僅僅用于測試
    • FLAG_SUPPORTS_SMALL_SCREENS: 設(shè)置應(yīng)用程序的window可以縮小到較小屏幕的大小,對應(yīng)的manifest里面的android:smallScreens,值為true,則表明可以縮小。
    • FLAG_SUPPORTS_NORMAL_SCREENS: 設(shè)置應(yīng)用程序的window可以在正常的屏幕上顯示,對應(yīng)的manifest里面的android:normalScreens,值為true,則表明可以顯示。
    • FLAG_SUPPORTS_LARGE_SCREENS: 設(shè)置應(yīng)用的window可以放大到較大屏幕的大小,對應(yīng)的manifest里面的android:largeScreens,值為true,則表明可以放大。
    • FLAG_RESIZEABLE_FOR_SCREENS: 設(shè)置應(yīng)用程序自己知道如何去適應(yīng)不同的屏幕密度,對應(yīng)manifest里面是android:anyDensity,值為true,則應(yīng)用程序自己調(diào)整。
    • FLAG_VM_SAFE_MODE: 設(shè)置應(yīng)用程序在安全模式下運(yùn)行VM,即不運(yùn)行JIT,對應(yīng)manifest里面的 android:vmSafeMode,值為true則設(shè)置為安全模式
    • FLAG_ALLOW_BACKUP: 設(shè)置允許操作系統(tǒng)備份數(shù)據(jù),對應(yīng)的manifest里面的android:allowBackup,設(shè)置true則允許備份
    • FLAG_KILL_AFTER_RESTORE: 這塊我也是不很清楚,設(shè)置在未來的某個事件點(diǎn)并且版本versionCode要大于當(dāng)前版本的versionCode,則可以處理還原數(shù)據(jù)。對應(yīng)的是manifest里面的android:restoreAnyVersion,值為true則設(shè)置。
    • FLAG_EXTERNAL_STORAGE:表明應(yīng)用程序安裝在SD卡上
    • FLAG_SUPPORTS_XLARGE_SCREENS:表明應(yīng)用程序的window可以增加尺寸適用于超大屏幕。在manifest里面對應(yīng)的android:xlargeScreens
    • FLAG_LARGE_HEAP:表明應(yīng)用程序?yàn)槠溥M(jìn)程要求申請更大的內(nèi)存堆。manifest里面對應(yīng)的是android:largeHeap
    • FLAG_STOPPED:表明這個應(yīng)用程序處于停止?fàn)顟B(tài)
    • FLAG_SUPPORTS_RTL: 表明應(yīng)用程序支持從右到左,所有Activity將變更為從右到左。
    • FLAG_INSTALLED:表明該當(dāng)前應(yīng)用程序是被當(dāng)前用戶安裝的。
    • FLAG_IS_DATA_ONLY:表明當(dāng)該應(yīng)用程序僅僅安裝其數(shù)據(jù),應(yīng)用程序包本身并不存在設(shè)備上。
    • FLAG_IS_GAME:表明當(dāng)該應(yīng)用程序是一個程序
    • FLAG_FULL_BACKUP_ONLY:表明定義一個android.app.backup.BackupAgent,通過這個BackupAgent對象來負(fù)責(zé)進(jìn)行應(yīng)用程序的全數(shù)據(jù)備份。
    • FLAG_USES_CLEARTEXT_TRAFFIC:表明該應(yīng)用程序的網(wǎng)絡(luò)請求是明文,對WebView無用,如果是在Android N上配置網(wǎng)絡(luò)配置,也無用。對應(yīng)manifest里面的android:usesCleartextTraffic
    • FLAG_EXTRACT_NATIVE_LIBS:表明從.apk中提取native庫
    • FLAG_HARDWARE_ACCELERATED:表明當(dāng)該應(yīng)用程序開啟硬件加速渲染
    • FLAG_SUSPENDED:表明當(dāng)該應(yīng)用程序當(dāng)前處于掛起狀態(tài)
    • FLAG_MULTIARCH:表明當(dāng)前應(yīng)用程序的代碼需要加載到其他應(yīng)用程序的進(jìn)程中。

2、重要成員變量簡介:

  • public String taskAffinity:和當(dāng)前應(yīng)用所有Activity的默認(rèn)task有密切關(guān)系,可以參考下面ActivityInfo的taskAffinity,可以通過AndroidManifest的"android:taskAffinity"屬性得到,具體taskAffinity是怎么影響到Activity在task的啟動,后面會在Activity啟動模式中細(xì)講
  • public String permission:訪問當(dāng)前應(yīng)用的所有組件需要聲明的權(quán)限,在AndroidManifest的"android:permission"屬性得到
  • public String processName:應(yīng)用運(yùn)行的進(jìn)程名,可以在AndroidManifest的"android:process"得到,如果沒有設(shè)置則默認(rèn)為應(yīng)用包名。
  • public String className:Application類的類名,可以在AndroidManifest的"android:class"屬性得到。
  • public int descriptionRes:對Application組件的描述,可以在AndroidManifest的"android:description"屬性得到,不設(shè)置則為0
  • public int theme:應(yīng)用的主題,可以在AndroidManifest的"android:theme"屬性得到,若不設(shè)置則為0。
  • public String manageSpaceActivityName:用于指定一個Activity來管理數(shù)據(jù),它最終會出現(xiàn)在"設(shè)置->應(yīng)用程序管理"中,默認(rèn)按鈕為"清楚數(shù)據(jù)",可以在AndroidManifest的屬性"android:manageSpaceActivity"中設(shè)置值,如果設(shè)定后,該按鈕可點(diǎn)擊跳轉(zhuǎn)到該Activity,讓用戶選擇性清除哪些數(shù)據(jù),若不設(shè)置則為null。
  • public String backupAgentName:Android原生的備份引擎BackupManagerService在應(yīng)用端的實(shí)現(xiàn)類,是backupAgent的子類。默認(rèn)不會由系統(tǒng)備份,可以在AndroidManifest屬性"android:backupAgent"得到,如果設(shè)置"android:allowBackup"為false,則該屬性設(shè)置無效。
  • public int fullBackupContent = 0:表明應(yīng)用是否支持自動備份
  • public int uiOptions = 0:為應(yīng)用內(nèi)所有的Activity設(shè)置默認(rèn)的UI選項,可選值為"none"、"splitActionBarWhenNarrow"。
  • *public String sourceDir:應(yīng)用APK的全路徑
  • public String publicSourceDir:sourceDir公開可訪問的部分,被forward lock鎖定的應(yīng)用該值可能與sourceDir不一樣
  • public String[] resourceDirs:如果當(dāng)前應(yīng)用有額外資源包時,表示全路徑。通常為null。
  • public String seinfo:來自Linux策略中seiInfo標(biāo)簽,這個值一般在設(shè)置應(yīng)用進(jìn)程的SELinux安全上下文時有用。
  • public String dataDir:應(yīng)用數(shù)據(jù)目錄
  • public String dataDir:應(yīng)用JNI本地庫路徑
  • public int uid:Linux Kernel的user ID,目前對每個引用還不是唯一的,存在幾個應(yīng)用共享一個UID的情況。
  • public int targetSdkVersion:應(yīng)用最低目標(biāo)SDK版本號
  • public int versionCode:應(yīng)用的版本號
  • public boolean enabled = true:表明當(dāng)前應(yīng)用所有組件是否可用。

3、重要方法簡介:

  • public ApplicationInfo():構(gòu)造函數(shù)
  • public ApplicationInfo(ApplicationInfo orig):構(gòu)造函數(shù),傳入一個ApplicationInfo,進(jìn)行拷貝。
  • private ApplicationInfo(Parcel source):私有的構(gòu)造函數(shù),序列化專用
  • protected ApplicationInfo getApplicationInfo():返回當(dāng)前ApplicationInfo對象
  • public boolean isSystemApp():判斷當(dāng)前應(yīng)用是否為系統(tǒng)應(yīng)用。flags與ApplicationInfo.FLAG_SYSTEM按位與不等于0則返回true。
  • public boolean isForwardLocked():判斷當(dāng)前應(yīng)用是否被鎖定。flags與ApplicationInfo.PRIVATE_FLAG_FORWARD_LOCK按位與不等于0則返回true。

五、ComponentInfo類簡介

ComponentInfo.java

ComponentInfo,它代表一個應(yīng)用內(nèi)部的組件(如ActivityInfo、ServiceInfo、ProviderInfo),一般不會直接使用這個類,它被設(shè)計出來是為了不同應(yīng)用的組件共享統(tǒng)一的定義。它繼承與PackageItemInfo,但它不像ApplicationInfo一樣實(shí)現(xiàn)了Parcelable接口。它是沒有實(shí)現(xiàn)Parcelable接口,但是它提供了入?yún)⑹荘arcel的構(gòu)造函數(shù),以及writeToParcel()方法給它的子類來實(shí)現(xiàn)ComponentInfo內(nèi)部這部分的成員的Parcel化。

1、重要成員變量簡介:

  • public ApplicationInfo applicationInfo:組件所在的application/package信息,從<application>標(biāo)簽得到。
  • public String processName:組件所運(yùn)行的進(jìn)程名稱,String類型,從"android:process"屬性得到
  • public int descriptionRes:組件的描述,string型的資源id,從"android:description",如果不設(shè)置則為0。
  • public boolean enabled:當(dāng)前組件是否被實(shí)例化,boolean類型,從"android:enabled"屬性得到,如果它所在的Application中的enable為false,則這處的設(shè)置無效。
  • public boolean exported:當(dāng)前組件能否被其他Application的組件啟動,boolean類型,可以從"android:exported"屬性得到。
    • 如果當(dāng)前組件沒有一個<intent-filter>則它默認(rèn)為false(沒有任何<intent-filter>表明要組件的準(zhǔn)確名稱來啟動),exported=false表明當(dāng)前組件只能被當(dāng)前應(yīng)用內(nèi)組件啟動,或者有相同的UID的應(yīng)用。
    • 當(dāng)然也可以使用permission來限制外部應(yīng)用對組件的訪問,如果該組件有"android:permission"屬性,則訪問這必須聲明該權(quán)限。當(dāng)該組件無permission屬性而<application>標(biāo)簽有聲明時,則訪問者必須有<application>簽名的permisson。

2、重要方法簡介:

  • public ComponentInfo():構(gòu)造函數(shù)
  • public ComponentInfo(ComponentInfo orig):構(gòu)造函數(shù),傳入一個ComponentInfo,其實(shí)就是拷貝
  • protected ComponentInfo(Parcel source):構(gòu)造函數(shù),傳入一個source,然后從source里面取出相應(yīng)的值來完成字段的初始化
  • public CharSequence loadLabel(PackageManager pm):返回該組件的標(biāo)簽,CharSequence類型,優(yōu)先級次序?yàn)椋簄onLocalizedLabel>labelRes>applicationInfo.nonLocalizedLabel>applicationInfo.labelRes
  • public boolean isEnable():該組件是否啟動該組件及包含的應(yīng)用程序,有且只有當(dāng)enabled和applicationInfo.enable同時為true時,返回true。
  • public final int getIconResource():返回該組件的icon的資源id,類型是int,如果是0,則返回applicationInfo對應(yīng)的資源id
  • public final int getLogoResource():返回該組件的logo對應(yīng)的資源id,如果沒有,則返回applicationInfo對應(yīng)的資源id。
  • public final int getBannerResource():返回該組件banner對應(yīng)的資源id,如果沒有,則返回applicationInfo對應(yīng)的資源id。
  • @hide public Drawable loadDefaultIcon(PackageManager pm):返回組件默認(rèn)的icon,類型是Drawable,返回的是applicationInfo的loadIcon()
  • @hide protected Drawable loadDefaultBanner(PackageManager pm):返回組件默認(rèn)的banner,類型是Drawable,返回的是applicationInfo的loadBanner()
  • @hide protected Drawable loadDefaultLogo(PackageManager pm):返回組件默認(rèn)的logo,類型是Drawable,返回的是applicationInfo的loadLogo()
  • @hide protected ApplicationInfo getApplicationInfo():返回該組件的applicationInfo
  • public void writeToParcel(Parcel dest, int parcelableFlags):先調(diào)用父類PackageItemInfo的writeToParcel()方法,再完成自己的成員Parcel化

六、ActivityInfo類簡介

ActivityInfo.java

ActivityInfol類
ApplicationInfo類:它繼承自ComponentInfo并實(shí)現(xiàn)了Parcelable 接口,它對應(yīng)manifest里面的<activity>或者<receiver>節(jié)點(diǎn)的信息。我們可以通過它來設(shè)置我們的任何屬性,包括theme、launchMode等,常用方法繼承至PackageItemInfo類中的loadIcon()和loadLabel()

1、重要成員變量簡介:

  • public int launchMode:Activity的啟動模式,對應(yīng)Manifest的"launchMode"屬性,可能是以下幾種模式:
    • public static final int LAUNCH_MULTIPLE = 0:普通模式
    • public static final int LAUNCH_SINGLE_TOP = 1:同一個task如果是頂部,復(fù)用
    • public static final int LAUNCH_SINGLE_TASK = 2:同一個task,無論是不是在頂部都復(fù)用
    • public static final int LAUNCH_SINGLE_INSTANCE = 3:新開一個task
  • public int documentLaunchMode:總覽畫面--overview screenActivity的啟動模式,關(guān)于總覽畫面可以參考 Android 5.0 Overview Screen--總覽畫面,對應(yīng)AndroidManifest里面的"documentLaunchMode"屬性,如果一個Activity添加了這個屬性,則該Activity被啟動時永遠(yuǎn)會創(chuàng)建一個新的task。該屬性有4個值,用戶在應(yīng)用中打開的一個document會有不同的效果如下:
    • public static final int DOCUMENT_LAUNCH_NONE = 0:
      Activity不會為document創(chuàng)建新的task,App設(shè)置為single task模式。它會重新調(diào)用用戶喚醒的所有activity中的最近的一個。
    • public static final int DOCUMENT_LAUNCH_INTO_EXISTING = 1:
      activity 會為該document請求一個已經(jīng)存在的task
    • public static final int DOCUMENT_LAUNCH_ALWAYS = 2:
      即使docutment已經(jīng)開打了,activity也會為document創(chuàng)建一個新的task。
    • public static final int DOCUMENT_LAUNCH_NEVER = 3:
      activity不會為document創(chuàng)建一個新的task。
  • public int persistableMode:activity持久化的模式,對應(yīng)著AndroidManifest的"android:persistableMode"屬性,它有三個模式如下:
    • public static final int PERSIST_ROOT_ONLY = 0:
      默認(rèn)值,僅僅會作用在跟activity活著task中。
    • public static final int PERSIST_NEVER = 1:
      不起作用,不用兩個持久化頁面數(shù)據(jù)或狀態(tài)
    • public static final int PERSIST_ACROSS_REBOOTS = 2:
      重啟設(shè)備或持久化頁面的數(shù)據(jù)或者狀態(tài),如果在這個界面上的界面也設(shè)置這個值,上面的頁面也會被持久化,最后系統(tǒng)會將你保存的數(shù)據(jù),在重新打開這個頁面的時候,會調(diào)用onCreate()具有兩個參數(shù)的方法。你只要在你第二個參數(shù)PersistableBundle中取出你保存的數(shù)據(jù)就可以了
  • public String requestedVrComponent;:跑在Activity上面的VrListenerService的組件名稱。
  • public int screenOrientation:表示Activity運(yùn)行的屏幕的方向。對應(yīng)AndroidManifest里面的"android:screenOrientation"屬性,具體屬性值如下:
    • public static final int SCREEN_ORIENTATION_UNSPECIFIED:未指定,它是默認(rèn)值,由Android系統(tǒng)自己選擇適當(dāng)?shù)姆较?,選擇策略是具體設(shè)備的配置情況而定,因此不同的設(shè)備會有不同的方向選擇。
    • public static final int SCREEN_ORIENTATION_LANDSCAPE:表示橫屏,顯示時寬度大于高度
    • public static final int SCREEN_ORIENTATION_PORTRAIT:表示書評,顯示時高度大于寬度
    • public static final int SCREEN_ORIENTATION_USER:表示用戶當(dāng)前的首選方向。
    • public static final int SCREEN_ORIENTATION_BEHIND:表示用戶繼續(xù)Activity堆棧中當(dāng)前Activity下面的那個Activity的方向。
    • public static final int SCREEN_ORIENTATION_SENSOR:表示由物理感應(yīng)器決定顯示方向,它取決于用戶如何持有設(shè)備,當(dāng)設(shè)備被旋轉(zhuǎn)時方向會隨之變化——在橫屏和豎屏之間切換
    • public static final int SCREEN_ORIENTATION_NOSENSOR:忽略物理感應(yīng)器——即顯示方向和物理感應(yīng)器無關(guān),不管用戶如何旋轉(zhuǎn)設(shè)備,顯示方向都不會發(fā)生改變。
    • public static final int SCREEN_ORIENTATION_SENSOR_LANDSCAPE:表示Activity在橫向屏幕上顯示,但是可以根據(jù)方向傳感器的指示來進(jìn)行改變
    • public static final int SCREEN_ORIENTATION_SENSOR_PORTRAIT:表示Activity在縱向屏幕上顯示,可以根據(jù)方向傳感器指示的方向來進(jìn)行改變。
    • public static final int SCREEN_ORIENTATION_REVERSE_LANDSCAPE:表示Activity橫屏顯示,當(dāng)時與正常的橫屏方向相反(比如原來很平方向是向左的,這時候也是橫屏但是方向向右)
    • public static final int SCREEN_ORIENTATION_REVERSE_PORTRAIT:表示Activity豎屏顯示,但是與正常的縱向方向的屏幕方向相反
    • public static final int SCREEN_ORIENTATION_FULL_SENSOR:表示Activity的方向由方向傳感器決定,會根據(jù)用戶設(shè)備的移動情況來旋轉(zhuǎn)

七、ServiceInfo類簡介

ServiceInfo.java源碼地址

ServiceInfo類,它繼承自ComponentInfo并實(shí)現(xiàn)了Parcelable接口,它對應(yīng)manifest里面的<service>節(jié)點(diǎn)的信息。

1、重要成員變量簡介:

  • public String permission:這個Service的訪問權(quán)限
  • public int flags:表示service在AndroidManifest設(shè)置的選項
    • public static final int FLAG_STOP_WITH_TASK:如果用戶刪除了預(yù)計應(yīng)程序的Activitiest,系統(tǒng)將自動停止這個Service
    • public static final int FLAG_ISOLATED_PROCESS:Service在其獨(dú)立的進(jìn)程中運(yùn)行
    • public static final int FLAG_EXTERNAL_SERVICE:這個?Service可以被外部包調(diào)用
    • public static final int FLAG_SINGLE_USER:表示Service就是一個單例。

方法很少且很簡單,這里就不講解了

八、ProviderInfo類簡介

ProviderInfo.java源碼地址

ProviderInfo類,它繼承自ComponentInfo并實(shí)現(xiàn)了Parcelable接口,它對應(yīng)manifest里面的<provider>節(jié)點(diǎn)的信息。

1、重要成員變量簡介:

  • public String authority:提供者的名字
  • public String readPermission:只讀的provider的訪問權(quán)限
  • public String writePermission:讀寫的provider的訪問權(quán)限
  • public boolean grantUriPermissions:是否授予provider提供特定的Uris訪問權(quán)限
  • public PatternMatcher[] uriPermissionPatterns:provider的PatternMatcher數(shù)組
  • public PathPermission[] pathPermissions:provider的PathPermission數(shù)組
  • public boolean multiprocess = false:是否允許多進(jìn)程多實(shí)例
  • public int initOrder = 0:同一個進(jìn)程運(yùn)行的的provider的初始順序,數(shù)字越高,優(yōu)先級越高
  • public int flags:provider的選項
    • public static final int FLAG_SINGLE_USER = 0x40000000:設(shè)置為provider為單例模式。

方法很少且很簡單,這里就不講解了

九、ResolveInfo類簡介

ResolveInfo.java源碼地址

ResolveInfo就是解析 intent過程返回的信息,也是通過解析一個IntentFilter相對應(yīng)的intent得到的信息。它部分的對應(yīng)位于AndroidManifest.xml的<intent>標(biāo)簽收集到的信息,ResolveInfo實(shí)現(xiàn)了Parcelable接口。

1、重要成員變量簡介:

  • public ActivityInfo activityInfo:和Intent相匹配的ActivityInfo(可能是Activity或者Receiver)
  • public ServiceInfo serviceInfo:和Intent相匹配的serviceInfo
  • public ProviderInfo providerInfo:和Intent相匹配的providerInfo
  • public IntentFilter filter:匹配的IntentFilter
  • public int priority:匹配優(yōu)先級,數(shù)字越高,優(yōu)先級約高,默認(rèn)是0
  • public int preferredOrder:用戶配置的優(yōu)先級,默認(rèn)是0,數(shù)值越大,優(yōu)先級越高
  • public int match:系統(tǒng)評估Activity與Intent的匹配程度,是一個數(shù)字。
  • public int specificIndex = -1:如果設(shè)置了queryIntentActivityOptions,這個specificIndex表示返回列表的下標(biāo),0 是列表的第一個。<0則表示它來自通用的Intent查詢。
  • public boolean isDefault:是否在過濾器中制定了Intent.CATEGORY_DEFAULT,意味著它被用戶可以對數(shù)據(jù)進(jìn)行默認(rèn)的操作

2、重要方法簡介:

  • public ResolveInfo():構(gòu)造函數(shù)
  • public ResolveInfo(ResolveInfo orig):帶有ResolveInfo的構(gòu)造函數(shù),進(jìn)行數(shù)據(jù)拷貝
  • private ResolveInfo(Parcel source):私有的構(gòu)造函數(shù)主要是給反序列化的時候。
  • **public CharSequence loadLabel(PackageManager pm) **:獲取標(biāo)簽,獲取優(yōu)先級順序如下:nonLocalizedLabel>labelRes(resolvePackageName)>labelRes(ci.packageName)> ci.loadLabel(pm)
  • **public Drawable loadIcon(PackageManager pm) *:獲取Drawable類型的圖標(biāo)。
  • final int getIconResourceInternal():注意這個方法的作用域是"包內(nèi)",返回匹配的圖標(biāo)資源標(biāo)識符,如果匹配了直接使用,沒有匹配使用應(yīng)用程序圖標(biāo)
  • public final int getIconResource():返回匹配的圖標(biāo)資源標(biāo)識符,如果沒有匹配就使用應(yīng)用程序圖標(biāo)。

十、PermissionInfo類簡介

PermissionInfo.java

PermissionInfo,它代表一個應(yīng)用的權(quán)限描述,它既是權(quán)限信息的記錄,也是權(quán)限的級別保護(hù),在Android系統(tǒng)中,做任何操作都要申請權(quán)限,但是如果你的級別不夠,有些權(quán)限不是你在代碼中寫了申請就能獲取的。在使用PermissionInfo來指定一個權(quán)限的基本信息時,需要指定protectedLevel,并指定所屬的group信息。PermissionInfo繼承自PackageItemInfo,并實(shí)現(xiàn)了Parcelable接口。

1、重要成員變量簡介:

  • public int protectionLevel:保護(hù)權(quán)限的級別,可以是如下級別
    • public static final int PROTECTION_NORMAL:表示只要是申請了就可以使用的級別。
    • public static final int PROTECTION_DANGEROUS:表示在安裝時需要用戶確認(rèn)才可以使用
    • public static final int PROTECTION_SIGNATURE:表示使用者的APP和系統(tǒng)使用同一個證書,即系統(tǒng)權(quán)限級別
  • public String group:權(quán)限組
  • public int flags:附加權(quán)限的標(biāo)志位,可能是以下幾個值:
    • FLAG_COSTS_MONEY:付費(fèi)標(biāo)志
    • FLAG_REMOVED:刪除標(biāo)志
    • FLAG_INSTALLED:安裝標(biāo)志
  • public int descriptionRes:資源中的表示權(quán)限的描述

2、重要方法簡介:

  • public PermissionInfo():構(gòu)造函數(shù)
  • public PermissionInfo(PermissionInfo orig):帶有PermissionInfo的構(gòu)造函數(shù),進(jìn)行數(shù)據(jù)拷貝
  • private PermissionInfo(Parcel source):私有的構(gòu)造函數(shù)主要是給反序列化的時候。

十一、PermissionGroupInfo簡介

PermissionGroupInfo.java

PermissionGroupInfo類,它表示一個權(quán)限組的概念,Android系統(tǒng)內(nèi)部定了很多權(quán)限組,比如android.permission-group.CONTACTS表示聯(lián)系人相關(guān)權(quán)限組。PermissionGroupInfo繼承自PackageItemInfo,并實(shí)現(xiàn)了Parcelable接口。

1、已知的權(quán)限組如下:

  • android.permission-group.CONTACTS:聯(lián)系人相關(guān)權(quán)限組
  • android.permission-group.PHONE:電話相關(guān)權(quán)限組
  • android.permission-group.APPSTORE_CLOUD:應(yīng)用商店云服務(wù)相關(guān)權(quán)限組
  • android.permission-group.CALENDAR:日歷相關(guān)權(quán)限組
  • android.permission-group.CAMERA:相機(jī)相關(guān)權(quán)限組
  • android.permission-group.SENSORS:傳感器相關(guān)權(quán)限組
  • android.permission-group.LOCATION:位置服務(wù)相關(guān)權(quán)限組
  • android.permission-group.STORAGE:存儲相關(guān)權(quán)限組
  • android.permission-group.MICROPHONE:話筒相關(guān)權(quán)限組
  • android.permission-group.SMS:短消息相關(guān)權(quán)限組

2、重要成員變量簡介:

  • public String nonLocalizedDescription:如果這個權(quán)限組的名字字符串直接定義在AndroidManifest.xml中,那么通過這個值可以得到他的名字(String類型),如果是空,則是調(diào)用的資源使用descriptionRes
  • public int descriptionRes:資源中的表示權(quán)限組的描述
  • public int flags:權(quán)限組的標(biāo)志位
  • public int priority:權(quán)限組的優(yōu)先級:

十二、上述這些類的關(guān)系

關(guān)于主要成員就介紹到這里,看下他們對應(yīng)的關(guān)系,如下圖:

對應(yīng)關(guān)系1.png
對應(yīng)關(guān)系2.png

上一篇文章APK安裝流程詳解0——前言
下一篇文章APK安裝流程詳解2——PackageManager簡介

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容