参考:http://www.cnblogs.com/xingfuzzhd/p/3374504.html

  今天要讲的是PackageManager。Android系统为我们提供了很多服务管理的类,包括ActivityManager、PowerManager(电源管理)、AudioManager(音频管理)等。除此之外,还提供了一个PackageManger管理类,它的主要职责是管理应用程序包。 通过PackageManager,我们就可以获取应用程序信息。

  提到PackageManager,就得提一下AndroidManifest.XML文件了。AndroidManifest.xml是Android应用程序中最重要的文件之一。它是Android程序的全局配置文件,是每个 android程序中必须的文件。它位于我们开发的应用程序的根目录下,描述了package中的全局数据,包括package中暴露的组件 (activities, services, 等等),以及他们各自的实现类,各种能被处理的数据和启动位置等重要信息。 
  因此,该文件提供了Android系统所需要的关于该应用程序的必要信息,即在该应用程序的任何代码运行之前系统所必须拥有的信息。

  PackageManager获取的信息即来自AndroidManifest.XML。为了便于理解,从网上找了一张AnroidManifest.xml文件节点说明图:

一、PackageManager的功能:

1、安装,卸载应用 
2、查询permission相关信息 
3、查询Application相关信息(application,activity,receiver,service,provider及相应属性等) 
4、查询已安装应用 
5、增加,删除permission 
6、清除用户数据、缓存,代码段等

二、PackageManager相关类和方法介绍:

1、PackageManager类

说明: 获得已安装的应用程序信息 。可以通过getPackageManager()方法获得。 常用方法:
public abstract PackageManager getPackageManager()
功能:获得一个PackageManger对象  public abstract Drawable getApplicationIcon(String packageName)
参数: packageName 包名
功能:返回给定包名的图标,否则返回nullpublic abstract ApplicationInfo getApplicationInfo(String packageName, int flags)
参数:packagename 包名flags 该ApplicationInfo是此flags标记,通常可以直接赋予常数0即可
功能:返回该ApplicationInfo对象public abstract List<ApplicationInfo> getInstalledApplications(int flags)
参数:flag为一般为GET_UNINSTALLED_PACKAGES,那么此时会返回所有ApplicationInfo。我们可以对ApplicationInfo的flags过滤,得到我们需要的。
功能:返回给定条件的所有PackageInfopublic abstract List<PackageInfo> getInstalledPackages(int flags)
参数如上
功能:返回给定条件的所有PackageInfopublic abstract ResolveInfo resolveActivity(Intent intent, int flags)
参数:  intent 查寻条件,Activity所配置的action和categoryflags: MATCH_DEFAULT_ONLY     :Category必须带有CATEGORY_DEFAULT的Activity,才匹配GET_INTENT_FILTERS     :匹配Intent条件即可GET_RESOLVED_FILTER    :匹配Intent条件即可
功能 :返回给定条件的ResolveInfo对象(本质上是Activity)public abstract List<ResolveInfo> queryIntentActivities(Intent intent, int flags)
参数同上
功能 :返回给定条件的所有ResolveInfo对象(本质上是Activity),集合对象public abstract ResolveInfo resolveService(Intent intent, int flags)
参数同上
功能 :返回给定条件的ResolveInfo对象(本质上是Service)public abstract List<ResolveInfo> queryIntentServices(Intent intent, int flags)
参数同上
功能 :返回给定条件的所有ResolveInfo对象(本质上是Service),集合对象

2、PackageItemInfo类

说明: AndroidManifest.xml文件中所有节点的基类,提供了这些节点的基本信息:label、icon、 meta-data。它并不直接使用,而是由子类继承然后调用相应方法。

3、ApplicationInfo类 继承自 PackageItemInfo类

说明:获取一个特定引用程序中<application>节点的信息。字段说明:flags字段: FLAG_SYSTEM 系统应用程序FLAG_EXTERNAL_STORAGE 表示该应用安装在sdcard中常用方法继承至PackageItemInfo类中的loadIcon()和loadLabel()

4、ActivityInfo类 继承自 PackageItemInfo类

说明: 获得应用程序中<activity/>或者 <receiver/>节点的信息 。我们可以通过它来获取我们设置的任何属性,包括theme 、launchMode、launchmode等常用方法继承至PackageItemInfo类中的loadIcon()和loadLabel()

5、ServiceInfo类 继承自 PackageItemInfo类

说明:与ActivityInfo类似,代表<service>节点信息

6、ResolveInfo类

说明:根据<intent>节点来获取其上一层目录的信息,通常是<activity>、<receiver>、<service>节点信息。
常用方法有loadIcon(PackageManager pm)和loadLabel(PackageManager pm)

三、实例讲解:

1、通过PackageManager的queryIntentActivities方法,查询系统中所有满足ACTION_MAIN和CATEGORY_LAUNCHER的应用程序,获取他们的程序名、包名、入口类名。(水平有限,ListView没学好,不能做一个简易启动器,不过启动应用的原理在之前的文章中有提到,有兴趣的可以去看看:Android随笔之——Activity中启动另一应用)

MainActivity.java

 1 package com.example.packagemanager;
 2
 3 import java.util.Collections;
 4 import java.util.List;
 5
 6 import android.app.Activity;
 7 import android.content.Intent;
 8 import android.content.pm.PackageManager;
 9 import android.content.pm.ResolveInfo;
10 import android.os.Bundle;
11
12 public class MainActivity extends Activity {
13
14     @Override
15     protected void onCreate(Bundle savedInstanceState) {
16         super.onCreate(savedInstanceState);
17         setContentView(R.layout.activity_main);
18         getAppInfo();
19     }
20
21     private void getAppInfo() {
22         // 获取PackageManager对象
23         PackageManager pm = this.getPackageManager();
24         // 设置<intent-filter>标签内需要满足的条件
25         Intent intent = new Intent(Intent.ACTION_MAIN, null);
26         intent.addCategory(Intent.CATEGORY_DEFAULT);
27
28         // 通过queryIntentActivities获取ResolveInfo对象
29         List<ResolveInfo> resolveInfos = pm.queryIntentActivities(intent,
30                 PackageManager.MATCH_DEFAULT_ONLY);
31
32         // 调用系统排序,根据name排序
33         // 该排序很重要,否则只能显示系统应用,不能显示第三方应用
34         // 其实我测试发现有没有其实是一样的,就是输出的顺序是乱的
35         Collections.sort(resolveInfos,
36                 new ResolveInfo.DisplayNameComparator(pm));
37
38         for (ResolveInfo resolveInfo : resolveInfos) {
39             String appName = resolveInfo.loadLabel(pm).toString();// 获取应用名称
40             String packageName = resolveInfo.activityInfo.packageName;// 包名
41             String className = resolveInfo.activityInfo.name;// 入口类名
42             System.out.println("程序名:" + appName + " 包名:" + packageName
43                     + " 入口类名:" + className);
44         }
45     }
46
47 }

输出结果:

2、通过PackageManager的queryInstalledApplications方法,过滤掉出系统应用、第三方应用、安装在SDCard上的应用。

MainActivity.java

  1 package com.example.packagemanager;
  2
  3 import java.util.Collections;
  4 import java.util.List;
  5
  6 import android.app.Activity;
  7 import android.content.pm.ApplicationInfo;
  8 import android.content.pm.PackageManager;
  9 import android.os.Bundle;
 10 import android.view.View;
 11 import android.view.View.OnClickListener;
 12
 13 public class MainActivity extends Activity implements OnClickListener {
 14
 15     public static final int FILTER_ALL_APP = 0; // 所有应用程序
 16     public static final int FILTER_SYSTEM_APP = 1; // 系统程序
 17     public static final int FILTER_THIRD_APP = 2; // 第三方应用程序
 18     public static final int FILTER_SDCARD_APP = 3; // 安装在SDCard的应用程序
 19     private PackageManager pm;
 20
 21     @Override
 22     protected void onCreate(Bundle savedInstanceState) {
 23         super.onCreate(savedInstanceState);
 24         setContentView(R.layout.activity_main);
 25
 26         findViewById(R.id.btn_all).setOnClickListener(this);
 27         findViewById(R.id.btn_system).setOnClickListener(this);
 28         findViewById(R.id.btn_third).setOnClickListener(this);
 29         findViewById(R.id.btn_sdcard).setOnClickListener(this);
 30     }
 31
 32     /**
 33      * 过滤,选择是系统应用、第三方应用或者SDCard应用
 34      */
 35     private void filterApp(int type) {
 36         // 获取PackageManager对象
 37         pm = getPackageManager();
 38         // 查询已经安装的应用程序
 39         List<ApplicationInfo> applicationInfos = pm
 40                 .getInstalledApplications(PackageManager.GET_UNINSTALLED_PACKAGES);
 41         // 排序
 42         Collections.sort(applicationInfos,
 43                 new ApplicationInfo.DisplayNameComparator(pm));
 44
 45         switch (type) {
 46         case FILTER_ALL_APP:// 所有应用
 47             for (ApplicationInfo applicationInfo : applicationInfos) {
 48                 getAppInfo(applicationInfo);
 49             }
 50             break;
 51         case FILTER_SYSTEM_APP:// 系统应用
 52             for (ApplicationInfo applicationInfo : applicationInfos) {
 53                 if ((applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0) {
 54                     getAppInfo(applicationInfo);
 55                 }
 56             }
 57         case FILTER_THIRD_APP:// 第三方应用
 58
 59             for (ApplicationInfo applicationInfo : applicationInfos) {
 60                 // 非系统应用
 61                 if ((applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) <= 0) {
 62                     getAppInfo(applicationInfo);
 63                 }
 64                 // 系统应用,但更新后变成不是系统应用了
 65                 else if ((applicationInfo.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) != 0) {
 66                     getAppInfo(applicationInfo);
 67                 }
 68             }
 69         case FILTER_SDCARD_APP:// SDCard应用
 70             for (ApplicationInfo applicationInfo : applicationInfos) {
 71                 if (applicationInfo.flags == ApplicationInfo.FLAG_SYSTEM) {
 72                     getAppInfo(applicationInfo);
 73                 }
 74             }
 75         default:
 76             break;
 77         }
 78     }
 79
 80     /**
 81      * 获取应用信息
 82      */
 83     private void getAppInfo(ApplicationInfo applicationInfo) {
 84         String appName = applicationInfo.loadLabel(pm).toString();// 应用名
 85         String packageName = applicationInfo.packageName;// 包名
 86         System.out.println("应用名:" + appName + " 包名:" + packageName);
 87     }
 88
 89     @Override
 90     public void onClick(View arg0) {
 91         switch (arg0.getId()) {
 92         case R.id.btn_all:
 93             System.out.println("输出所有应用信息:\n");
 94             filterApp(FILTER_ALL_APP);
 95             break;
 96         case R.id.btn_system:
 97             System.out.println("输出系统应用信息:\n");
 98             filterApp(FILTER_SYSTEM_APP);
 99             break;
100         case R.id.btn_third:
101             System.out.println("输出第三方应用信息:\n");
102             filterApp(FILTER_THIRD_APP);
103             break;
104         case R.id.btn_sdcard:
105             System.out.println("输出SDCard应用信息:\n");
106             filterApp(FILTER_SDCARD_APP);
107             break;
108
109         default:
110             break;
111         }
112     }
113
114 }

activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical" ><Buttonandroid:id="@+id/btn_all"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="所有应用" /><Buttonandroid:id="@+id/btn_system"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="系统应用" /><Buttonandroid:id="@+id/btn_third"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="第三方应用" /><Buttonandroid:id="@+id/btn_sdcard"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="SDCard应用" /></LinearLayout>

  OK,以上就是关于PackageManager的主要用法,呼呼~

作者:登天路

转载请说明出处:http://www.cnblogs.com/travellife/

作者:登天路

Android随笔之——PackageManager详解相关推荐

  1. android Camera2 API使用详解

    原文:android Camera2 API使用详解 由于最近需要使用相机拍照等功能,鉴于老旧的相机API问题多多,而且新的设备都是基于安卓5.0以上的,于是本人决定研究一下安卓5.0新引入的Came ...

  2. Android 蓝牙BLE开发详解

    Android 蓝牙BLE开发详解 由于年初接手了个有关蓝牙BLE的项目,开始了对蓝牙ble的学习,经过长时间的慢慢学习(学得太慢,太拖了),终于了解了该怎么写蓝牙BLE,现在就给大家分享一下. 一. ...

  3. android jar 包 意见反馈功能,android重点jar包详解.docx

    android重点jar包详解 深入理解View(一):从setContentView谈起 我们都知道?MVC,在Android中,这个?V?即指View,那我们今天就来探探View的究竟.在onCr ...

  4. Android应用坐标系统全面详解

    Android应用坐标系统全面详解 原文链接:CSDN@工匠若水,http://blog.csdn.net/yanbober/article/details/50419117 1. 背景 去年有很多人 ...

  5. Android NFC开发实战详解

    Android NFC开发实战详解 Android开发实战详解NFC国内第一本AndroidNFC开发书籍带你开启AndroidNFC开发的神秘之旅大综合案例帮助读者快速进入实战角色:WiFi快速连接 ...

  6. Android Gradle 自定义Task详解二:进阶

    转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/78523958 本文出自[赵彦军的博客] 系列目录 Android Gradle使用 ...

  7. Android Gradle 自定义Task 详解

    转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/76408024 本文出自[赵彦军的博客] 系列目录 Android Gradle使用 ...

  8. android ------- 开发者的 RxJava 详解

    在正文开始之前的最后,放上 GitHub 链接和引入依赖的 gradle 代码: Github:  https://github.com/ReactiveX/RxJava  https://githu ...

  9. Android自定义属性,format详解

    1. reference:参考某一资源ID. (1)属性定义: <declare-styleable name="名称"><attr name="bac ...

  10. android layout_width 属性,android:layout_weight属性详解

    在android开发中LinearLayout很常用,LinearLayout的内控件的android:layout_weight在某些场景显得非常重要,比如我们需要按比例显示.android并没用提 ...

最新文章

  1. 【转载】插件自动升级
  2. 反恐精英代码_反恐精英20周年,为什么沙漠2(dust2)地图玩家们一直玩不腻?...
  3. html 中写样式,在html文档中如何定义内部样式表
  4. bi可视化工具_适用于您的BI解决方案的最佳数据可视化和Web报告工具
  5. 哪种人是软件设计中的稀缺型人才?
  6. Java线程面试题TOP50
  7. 一统江湖的大前端(4)shell.js——穿上马甲我照样认识你
  8. 《编码规范和测试方法——C/C++版》作业 ·008——编写一个符合依赖倒置原则的简单学生管理系统
  9. NYOJ 部分和问题
  10. android 自动答录机源码,自动答录机下载_自动答录机 2.4.6.0 安卓版_零度软件园...
  11. lua安装教程 linux,Linux 安装 luarocks(lua的模块管理工具)
  12. 8086/8088寻址方式
  13. 惠普台式计算机系统系统修复,一键恢复系统,详细教您怎么一键恢复惠普笔记本系统...
  14. CSP 2018-9-4 再卖菜 搜索 + 剪枝
  15. Linux目录以及文件权限理解
  16. centos7 如何编译ffmpeg 带x265和nvenc
  17. Rasa原文-编写对话数据
  18. 【21天python打卡】第2天 python预备知识(2)
  19. android 动态进度条,Android实用view系列------炫酷的进度条
  20. LightBox -灯箱效果插件(非常漂亮)

热门文章

  1. 台式计算机网卡型号怎么查找,怎么确定台式机无线网卡驱动版本 台式机无线网卡驱动版本查看方法...
  2. lda新闻主题提取_LDA主题模型 | 原理详解与代码实战
  3. (翻译)机器学习:E.coli数据集的不平衡多类分类
  4. S7-200SMART PLC与V20变频器MODBUS通讯示例程序
  5. spc 统计过程控制(Statistical Process Control)分析软件
  6. Java excel添加水印
  7. 自适应求积算法 MatLab版
  8. 【Excel2019(六):数据透视表】【创建数据透视表+更改数据透视表汇总方式+数据透视表中的组合+汇总多列数据+创建计算字段+生成多张工作表】
  9. 有道词典的本地/扩展/离线词库
  10. 小米手机怎么截屏?小米手机区域截屏