成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

通過PackageManager獲得你想要的App信息!

移動開發 Android
本篇就 PackageManager 的使用,做一個詳盡的講解,助你拿到各項 App 的信息,當然也包括一些未安裝的 App 的信息。

 [[207610]]

一、前言

開門見山,開篇明義。有些場景下,我們會需要獲取一些其它 App 的各項信息,例如:App 名稱,包名、Icon 等。這個時候就需要使用到 PackageManager 這個類了。

本篇就 PackageManager 的使用,做一個詳盡的講解,助你拿到各項 App 的信息,當然也包括一些未安裝的 App 的信息。

二、需要提前了解的一些類

當你需要獲取到指定 App 的各項信息的時候,你需要操作一些 Android 為我們提供的對應的 Api。

你首先需要獲取 PackageManager(以下簡稱 PM) 對象,通過 PM 對象,你就可以獲取到你需要的各項 App 的信息類。

這里涉及到的 App 信息類包括:PackageInfo、ApplicationInfo、ActivityInfo/ServiceInfo/ProviderInfo 等,還有一個 ResolveInfo 類,它比較特殊一點,不和前面的結構為從屬關系。

這些類,都可以在根據 AndroidManifest.xml 中定義的組件進行劃分,大概的結構如下。

可以看到,它們之間的關系還它挺復雜的。

一個 PackageInfo 對應一個 ApplicationInfo,而其中又包含若干個 ActivityInfo、ServiceInfo、ProviderInfo。

2.1 PackageManager

PackageManager 是一個抽象類,我們一般操作的 PackageManager ,實際上是它的實現類 ApplicationPackageManager 這個對象。

在 Context 中,就有獲取 PM 對象的方法,getPackageManager(),所以四大組件想要獲取它是非常簡單的。

PM 中,提供了非常多的方法,供我們通過不同的條件,獲取到 PackageInfo 對象、ApplicationInfo 對象等,它是本文的基礎。

2.2 PackageInfo

PackageInfo 從名稱上也可以看出來,它主要用于存儲獲取到的 Package 的一些信息,包括:包名(packageName)、版本號(versionCode)、版本名(versionName)。

基本上拿到了 PackageInfo ,你就可以拿到大部分此 Apk 相關的信息了。

并且,PackageInfo 中有一個 applicationInfo 的字段,是可以直接獲取到與它相關的 ApplicationInfo 對象的。

這里介紹幾個 PackageInfo 中,比較常用的字段:

  • packageName:包名。
  • versionCode:版本號
  • versionName:版本名。
  • firstInstallTime:首次安裝時間。
  • lastUpdateTime:最后一次覆蓋安裝時間。

2.3 ApplicationInfo

ApplicationInfo 相對于 PackageInfo 用的會比較少一些。它主要用于獲取 Apk 定義在 AndroidManifest.xml 中的一些信息。

這里介紹幾個比價常用的:

  • packageName:包名
  • targetSdkVersion:目標 SDK 版本。
  • minSdkVersion:最小支持 SDK 版本,有 Api 限制,最低在 Api Level 24 及以上支持。
  • sourceDir:App 的 Apk 源文件存放的目錄。
  • dataDir:data 目錄的全路徑。
  • metaData:Manifest 中定義的 meta 標簽數據。
  • uid:當前 App 分配的 uid。

可以看到 ApplicationInfo 涵蓋的信息,基本上都是在 AndroidManifest.xml 中定義的信息,并且有一些屬性是有 Api Level 限制的,所以不確定的屬性,提前看一下文檔,確定是否全版本支持。

2.4 ActivityInfo

ActivityInfo、ServiceInfo、ProviderInfo 這三個是平級的,熟悉的一眼就能看出來,它們就是 Android 定義的四大組件中的幾個。各自涵蓋了一部分信息。一般在外部獲取其他 App 的信息的時候,不會獲取到這么細致的數據,如果有,看看這幾個類準沒錯。

那么就不再費時去介紹它們了。

三、基本操作

到現在基本上就已經了解到在當前設備上獲取到 Apk 信息的各項類了。

直接擺源碼說屬性有點枯燥。接下來我們就帶著實際問題,來看看具體如何使用 PM。

3.1 獲取所有安裝的 App

如果想要獲取當前設備上已經安裝的所有 App,可以使用 getInstalledPackages() 方法獲取到它所有的已安裝 App 的 PackageInfo 。

PackageManager 中,很多方法都會需要傳遞一個 flags 的字段,它表示你當前需要獲取到的 App 的信息。取值范圍有挺多的,獲取不同的信息使用不同的 Flags,通常如果沒有額外的要求,直接使用 GET_ACTIVITYS 即可。

3.2 判斷 App 是否安裝

這里主要說的是通過包名,判斷 App 是否安裝在當前設備上。

最簡單的邏輯就是去獲取 PackageInfo ,如果能拿回來數據,就說明是有安裝的。

3.3 通過包名獲取PackageInfo

其實前面判斷 App 是否安裝的時候,就已經獲取到了 PackageInfo 信息,這里只需要將它返回出去即可。

3.4 獲取版本號和版本名

這里只需要根據 PackageInfo 中的字段,獲取到對應的值就好了。

3.5 獲取 App 的名稱

獲取 App 的名稱,就需要用到 ApplicationInfo 這個對象了,其中 loadLabel() 方法返回的,就是 App 的名稱。

3.6 獲取 App 的 Icon

在 ApplicationInfo 中,還可以通過 loadIcon() 獲取到 App 的 Icon。它返回的是一個 Drawable 對象,可以直接使用。

3.7 根據Apk 文件,獲取 PackageInfo

前面介紹的方法,都是基于一個已安裝的 App 的包名,來獲取額外的信息。

但是有時候,我們只有一個未安裝的 Apk 文件,想要解析出 Apk 文件中的額外信息,PM 中,也有對應的 Api。非常的方便,直接使用 getPackageArchiveInfo() 即可。

只要拿到這個 Apk 文件相關的 PackageInfo 信息,就有辦法拿到其他的名稱、icon 、版本號、版本名、包名等信息。和前面介紹的例子類似,這里就不再一一列舉了。

四、查缺補漏

整體來說,到這里已經講解清楚如何使用 PM 獲取 App 的基本信息。

但是并不包含 App 在運行時的一些內存的情況,哪些數據你想獲取,單單依靠 PackageManager 是做不到的,就不再這里展開說了,有機會再詳細說明一下。

還有就是,PM 中,很多方法,都是有可能觸發 『Package manager has died』這個 RuntimeException 的,其實就是很多個線程在頻繁調用。如果想要避免,加鎖加緩存即可。具體的情況,可以看看我之前的文章《PackageManager可以亂用嗎?》。

【本文為51CTO專欄作者“張旸”的原創稿件,轉載請通過微信公眾號聯系作者獲取授權】

戳這里,看該作者更多好文

 

責任編輯:武曉燕 來源: 51CTO專欄
相關推薦

2021-10-28 18:58:57

動態規劃數據結構算法

2015-12-02 11:38:48

物聯網智慧時代

2010-08-26 13:56:15

服務器購買

2018-11-21 14:52:35

2020-06-02 09:45:07

微前端組件代碼

2022-02-28 19:32:27

I/O磁盤

2018-07-27 11:15:14

AI

2010-01-13 16:52:03

VB.NET導出數據

2015-08-27 16:55:21

2020-09-09 08:45:27

IOC容器高并發

2011-09-02 17:40:11

iPhone應用SoundHound歌曲

2019-01-16 10:55:08

Python 開發編程語言

2015-07-03 10:04:03

2013-08-07 15:03:26

2015-11-11 10:01:42

編程語言選擇

2019-06-03 11:24:51

2015-11-12 10:25:48

編程語言

2018-06-04 10:58:46

機器學習預測應用API

2015-07-29 13:52:12

Windows 10升級鏡像

2019-04-25 10:20:22

H5軟鍵盤前端
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产色 | 九九九久久国产免费 | 久久国产精品久久久久久 | 一区二区三区四区电影视频在线观看 | 国内精品久久久久久 | 波多野结衣在线观看一区二区三区 | 成年人免费网站 | 小早川怜子xxxxaⅴ在线 | 亚洲午夜小视频 | 欧美日韩在线视频一区二区 | 热久久久| 精品一区视频 | 正在播放国产精品 | 在线观看中文字幕 | 亚洲免费在线观看 | 欧美精品久久久久久久久久 | 久久久精品| 久草免费在线视频 | 在线视频一区二区 | 亚洲精品综合 | 97伦理电影 | 羞羞视频在线网站观看 | 羞羞网站免费观看 | 亚洲国产精品久久久 | 在线一区视频 | 精品一区二区在线观看 | 国产一区二区久久 | 午夜天堂精品久久久久 | 亚洲一区二区国产 | 亚洲第一在线视频 | 天天碰夜夜操 | 黄色一级免费 | 婷婷精品| 欧美专区在线 | 日日干日日射 | 日韩黄a | 中文二区 | 精品日韩欧美一区二区 | 国产传媒在线观看 | 国产成人精品一区二区三区四区 | 国产免费一区二区三区 |