Android获取程序信息

我们知道程序信息存储在Androidmanifest.xml文件中

SDK提供了PackageInfo类,该类包含了从Androidmanifest.xml文件中收集的所有信息。

查看PackageInfo源码

//PackageInfo进行了序列化,可在进程间传递
public class PackageInfo implements Parcelable {

    //程序包名
    public String packageName;

    //版本名
    public String versionName;

    //版本号
    public int versionCode;

    //共享用户ID,签名相同的情况下程序之间数据共享
    public String sharedUserId;

    //安装时间,忽略之前安装后卸载情况,单位ms
    public long firstInstallTime

    //最后更新时间,单位ms,经验证版本号相同的APK覆盖安装,该值也是会发生变化的
    public long lastUpdateTime

    //请求的权限
    public String[] requestedPermissions;

    //<Application .../>中的信息,程序名,icon等
    public ApplicationInfo applicationInfo;

    //注册的Activity
    public ActivityInfo[] activities;

    //注册的广播
    public ActivityInfo[] receivers;

    //注册的服务
    public ServiceInfo[] services;

    //注册的Contentprovider
    public ProviderInfo[] providers;

}

PackageInfo的子类ApplicationInfo中封装了:
程序名称
程序图标等信息
如何获取这些信息的呢?
查看ApplicationInfo源码

//ApplicationInfo类的继承关系,进行了序列化,可在进程间传递
public class ApplicationInfo extends PackageItemInfo implements Parcelable {
    //ApplicationInfo类中的属性
    public int flags = 0;

    //判断是否是系统程序用到的常量,这里为什么用<<(逻辑左移)没搞明白,计算后的值十进制还是1
    public static final int FLAG_SYSTEM = 1<<0;
    /**判断是否是系统程序计算方法,
    (flags & ApplicationInfo.FLAG_SYSTEM) != 0表示是系统程序*/
}

ApplicationInfo继承PackageItemInfo类。
查看PackageItemInfo源码

//具体实现方法封装在父类PackageItemInfo类中
public class PackageItemInfo {

    //获取程序名称
    public CharSequence loadLabel(PackageManager pm);

    //获取程序图标
    public Drawable loadIcon(PackageManager pm);

}

知道了程序信息封装在PackageInfo类中。如何获取PackageInfo对象?
SDK提供了包管理类PackageManager,负责获取PackageInfo对象的。
查看PackageManager源码

public abstract class PackageManager {//是一个抽象类

    /**以下都是抽象方法*/
    //第一个参数:包名 ;第二个参数:为附加条件选项(如:GET_CONFIGURATIONS获取配置)
    PackageInfo getPackageInfo(String packageName, int flags);

    //获取已安装程序信息对象的列表
    List<PackageInfo> getInstalledPackages(int flags);

    //根据程序申请的权限过滤,申请某些特定权限的程序
    List<PackageInfo> getPackagesHoldingPermissions(String[] permissions,
     int flags);

    List<PackageInfo> getPreferredPackages(int flags);

    //获取程序大小,遗憾是@hide方法,只能通过反射机制调用
    void getPackageSizeInfo(String packageName, IPackageStatsObserver observer);

}

获取程序大小请移步到另一篇文章,详细讲解获取程序大小

具体实现,这篇文章不去详细讲解。
我们需要追踪到哪个类中可获取该对象实例即可,查看源码,
ContextWrapper类中提供获取PackageManager对象的函数

//ContextWrapper类中getPackageManager函数可获取到PackageManager对象
public class ContextWrapper extends Context {

    public PackageManager getPackageManager()  {   
          return mBase.getPackageManager();
    }
}

ContextWrapper类的子类

//从以下继承关系可以知道这些对象都可直接调用getPackageManager方法得到PackageManager对象

class Application extends ContextWrapper;

class ContextThemeWrapper extends ContextWrapper;

class Activity extends ContextThemeWrapper;

//Service为抽象类,需要实现Service调用getPackageManager方法获取PackageManager对象

public abstract class Service extends ContextWrapper;

开发中常遇到以下两种情形:

  • 1知道包名,获取该程序的信息
  • 2获取已安装的程序信息

获取包管理类PackageManager

// Application Activity Service中都可直接调用getPackageManager()方法获取PackageManager
PackageManager pm ;

 pm= Application.getPackageManager();

 pm = Activity.getPackageManager();

 pm = Service.getPackageManager();

包管理对象获取程序信息

// 知道包名,获取该程序信息
PackageInfo pi = pm.getPackageInfo(packageName,PackageManager.GET_CONFIGURATIONS);

//获取设备上安装的程序信息
//PackageManager.GET_UNINSTALLED_PACKAGES常量代表已经卸载的也会收集到
List<PackageInfo> apps;
apps = pm.getInstalledPackages(PackageManager.GET_UNINSTALLED_PACKAGES);

获取到PackageInfo对象,任务完成,获取你想要的数据吧。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,293评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,604评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,958评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,729评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,719评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,630评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,000评论 3 397
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,665评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,909评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,646评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,726评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,400评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,986评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,959评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,996评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,481评论 2 342

推荐阅读更多精彩内容