新聞中心
一、前言

武威ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場(chǎng)景,ssl證書未來市場(chǎng)廣闊!成為創(chuàng)新互聯(lián)公司的ssl證書銷售渠道,可以享受市場(chǎng)價(jià)格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:18982081108(備注:SSL證書合作)期待與您的合作!
開門見山,開篇明義。有些場(chǎng)景下,我們會(huì)需要獲取一些其它 app 的各項(xiàng)信息,例如:App 名稱,包名、Icon 等。這個(gè)時(shí)候就需要使用到 PackageManager 這個(gè)類了。
本篇就 PackageManager 的使用,做一個(gè)詳盡的講解,助你拿到各項(xiàng) App 的信息,當(dāng)然也包括一些未安裝的 App 的信息。
二、需要提前了解的一些類
當(dāng)你需要獲取到指定 App 的各項(xiàng)信息的時(shí)候,你需要操作一些 Android 為我們提供的對(duì)應(yīng)的 Api。
你首先需要獲取 PackageManager(以下簡(jiǎn)稱 PM) 對(duì)象,通過 PM 對(duì)象,你就可以獲取到你需要的各項(xiàng) App 的信息類。
這里涉及到的 App 信息類包括:PackageInfo、ApplicationInfo、ActivityInfo/ServiceInfo/ProviderInfo 等,還有一個(gè) ResolveInfo 類,它比較特殊一點(diǎn),不和前面的結(jié)構(gòu)為從屬關(guān)系。
這些類,都可以在根據(jù) AndroidManifest.xml 中定義的組件進(jìn)行劃分,大概的結(jié)構(gòu)如下。
可以看到,它們之間的關(guān)系還它挺復(fù)雜的。
一個(gè) PackageInfo 對(duì)應(yīng)一個(gè) ApplicationInfo,而其中又包含若干個(gè) ActivityInfo、ServiceInfo、ProviderInfo。
2.1 PackageManager
PackageManager 是一個(gè)抽象類,我們一般操作的 PackageManager ,實(shí)際上是它的實(shí)現(xiàn)類 ApplicationPackageManager 這個(gè)對(duì)象。
在 Context 中,就有獲取 PM 對(duì)象的方法,getPackageManager(),所以四大組件想要獲取它是非常簡(jiǎn)單的。
PM 中,提供了非常多的方法,供我們通過不同的條件,獲取到 PackageInfo 對(duì)象、ApplicationInfo 對(duì)象等,它是本文的基礎(chǔ)。
2.2 PackageInfo
PackageInfo 從名稱上也可以看出來,它主要用于存儲(chǔ)獲取到的 Package 的一些信息,包括:包名(packageName)、版本號(hào)(versionCode)、版本名(versionName)。
基本上拿到了 PackageInfo ,你就可以拿到大部分此 Apk 相關(guān)的信息了。
并且,PackageInfo 中有一個(gè) applicationInfo 的字段,是可以直接獲取到與它相關(guān)的 ApplicationInfo 對(duì)象的。
這里介紹幾個(gè) PackageInfo 中,比較常用的字段:
- packageName:包名。
- versionCode:版本號(hào)
- versionName:版本名。
- firstInstallTime:首次安裝時(shí)間。
- lastUpdateTime:最后一次覆蓋安裝時(shí)間。
2.3 ApplicationInfo
ApplicationInfo 相對(duì)于 PackageInfo 用的會(huì)比較少一些。它主要用于獲取 Apk 定義在 AndroidManifest.xml 中的一些信息。
這里介紹幾個(gè)比價(jià)常用的:
- packageName:包名
- targetSdkVersion:目標(biāo) SDK 版本。
- minSdkVersion:最小支持 SDK 版本,有 Api 限制,最低在 Api Level 24 及以上支持。
- sourceDir:App 的 Apk 源文件存放的目錄。
- dataDir:data 目錄的全路徑。
- metaData:Manifest 中定義的 meta 標(biāo)簽數(shù)據(jù)。
- uid:當(dāng)前 App 分配的 uid。
可以看到 ApplicationInfo 涵蓋的信息,基本上都是在 AndroidManifest.xml 中定義的信息,并且有一些屬性是有 Api Level 限制的,所以不確定的屬性,提前看一下文檔,確定是否全版本支持。
2.4 ActivityInfo
ActivityInfo、ServiceInfo、ProviderInfo 這三個(gè)是平級(jí)的,熟悉的一眼就能看出來,它們就是 Android 定義的四大組件中的幾個(gè)。各自涵蓋了一部分信息。一般在外部獲取其他 App 的信息的時(shí)候,不會(huì)獲取到這么細(xì)致的數(shù)據(jù),如果有,看看這幾個(gè)類準(zhǔn)沒錯(cuò)。
那么就不再費(fèi)時(shí)去介紹它們了。
三、基本操作
到現(xiàn)在基本上就已經(jīng)了解到在當(dāng)前設(shè)備上獲取到 Apk 信息的各項(xiàng)類了。
直接擺源碼說屬性有點(diǎn)枯燥。接下來我們就帶著實(shí)際問題,來看看具體如何使用 PM。
3.1 獲取所有安裝的 App
如果想要獲取當(dāng)前設(shè)備上已經(jīng)安裝的所有 App,可以使用 getInstalledPackages() 方法獲取到它所有的已安裝 App 的 PackageInfo 。
PackageManager 中,很多方法都會(huì)需要傳遞一個(gè) flags 的字段,它表示你當(dāng)前需要獲取到的 App 的信息。取值范圍有挺多的,獲取不同的信息使用不同的 Flags,通常如果沒有額外的要求,直接使用 GET_ACTIVITYS 即可。
3.2 判斷 App 是否安裝
這里主要說的是通過包名,判斷 App 是否安裝在當(dāng)前設(shè)備上。
最簡(jiǎn)單的邏輯就是去獲取 PackageInfo ,如果能拿回來數(shù)據(jù),就說明是有安裝的。
3.3 通過包名獲取PackageInfo
其實(shí)前面判斷 App 是否安裝的時(shí)候,就已經(jīng)獲取到了 PackageInfo 信息,這里只需要將它返回出去即可。
3.4 獲取版本號(hào)和版本名
這里只需要根據(jù) PackageInfo 中的字段,獲取到對(duì)應(yīng)的值就好了。
3.5 獲取 App 的名稱
獲取 App 的名稱,就需要用到 ApplicationInfo 這個(gè)對(duì)象了,其中 loadLabel() 方法返回的,就是 App 的名稱。
3.6 獲取 App 的 Icon
在 ApplicationInfo 中,還可以通過 loadIcon() 獲取到 App 的 Icon。它返回的是一個(gè) Drawable 對(duì)象,可以直接使用。
3.7 根據(jù)Apk 文件,獲取 PackageInfo
前面介紹的方法,都是基于一個(gè)已安裝的 App 的包名,來獲取額外的信息。
但是有時(shí)候,我們只有一個(gè)未安裝的 Apk 文件,想要解析出 Apk 文件中的額外信息,PM 中,也有對(duì)應(yīng)的 Api。非常的方便,直接使用 getPackageArchiveInfo() 即可。
只要拿到這個(gè) Apk 文件相關(guān)的 PackageInfo 信息,就有辦法拿到其他的名稱、icon 、版本號(hào)、版本名、包名等信息。和前面介紹的例子類似,這里就不再一一列舉了。
四、查缺補(bǔ)漏
整體來說,到這里已經(jīng)講解清楚如何使用 PM 獲取 App 的基本信息。
但是并不包含 App 在運(yùn)行時(shí)的一些內(nèi)存的情況,哪些數(shù)據(jù)你想獲取,單單依靠 PackageManager 是做不到的,就不再這里展開說了,有機(jī)會(huì)再詳細(xì)說明一下。
還有就是,PM 中,很多方法,都是有可能觸發(fā) 『Package manager has died』這個(gè) RuntimeException 的,其實(shí)就是很多個(gè)線程在頻繁調(diào)用。如果想要避免,加鎖加緩存即可。具體的情況,可以看看我之前的文章《PackageManager可以亂用嗎?》。
網(wǎng)頁名稱:通過PackageManager獲得你想要的App信息!
標(biāo)題網(wǎng)址:http://m.fisionsoft.com.cn/article/cddihhj.html


咨詢
建站咨詢
