今天要讲的是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     @Override22     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 = pm40                 .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     @Override90     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的主要用法,呼呼~

android packageManager用法相关推荐

  1. 【转】 Android - LayoutInflate用法

    [转自]http://blog.csdn.net/scut1135/article/details/7055461 通俗的说,inflate就相当于将一个xml中定义的布局找出来. 因为在一个Acti ...

  2. MTK驱动(77)---Android getevent用法

    Android getevent用法 getevent命令用法如下: Usage: getevent [-t] [-n] [-s switchmask] [-S] [-v [mask]] [-d] [ ...

  3. Android inflater用法

    Android inflater用法 简介 具体作用 获取layoutInflater的三种方式 源码查看 返回值结果 注意 简介 在实际的开发中layoutInflater这个类的主要的主要的作用类 ...

  4. android plurals用法

    参考 android plurals用法 对一个给定的语言和数字来说,决定使用哪一个case的规则是很复杂的,所以android提供了方法getQuantityString(),它可以用来为你选择合适 ...

  5. android plurals用法(单复数)

    0.相关文章 android plurals用法 Android中的string资源占位符及Plurals string 1.使用 对一个给定的语言和数字来说,决定使用哪一个case的规则是很复杂的, ...

  6. Android.mk 用法介绍

    一个Android.mk file用来向编译系统描述你的源代码.具体来说:该文件是GNU Makefile的一小部分,会被编译系统解析一次或多次.你可以在每一个Android.mk file中定义一个 ...

  7. android五大布局的用法,android:stretchColumns用法

    TableLayout是一个使用复杂的布局,最简单的用法就仅仅是拖拉控件做出个界面,但实际上,会经常在代码里使用TableLayout,例如做出表格的效果.本文主要介绍TableLayout的基本使用 ...

  8. Android Scroller用法

    为什么80%的码农都做不了架构师?>>>    概述 Android里Scroller类是为了实现View平滑滚动的一个Helper类.通常在自定义的View时使用,在View中定义 ...

  9. android queue用法,GitHub - rygz146/TQueue: Android 可以任意切换线程的任务队列, TQueue

    TQueue 一个Android开发库, 可以任意切换线程的链式调用任务队列, 可添加定时, 延时任务, 统一异常处理(Ceased中断),但不影响整个任务链的运行. 具体用法如下: TQueue.q ...

  10. android组件用法说明,Android第三方控件PhotoView使用方法详解

    Android第三方控件PhotoView使用方法详解 发布时间:2020-10-21 15:06:09 来源:脚本之家 阅读:74 作者:zhaihaohao1 PhotoView的简介: 这是一个 ...

最新文章

  1. 学习笔记之06-点语法
  2. 【错误记录】Flutter 组件报错 ( No Directionality widget found. | RichText widgets require a Directionality )
  3. Feign-1 Feign的简介及基础使用
  4. CLR_via_C#.3rd 翻译[25.9 线程调度和优先权]
  5. dedeCms在首页显示要搜索的关键词
  6. 在M1 mac 使用Ps 2021上导出 PNG 格式发生未知错误如何解决?
  7. Percona Data Recovery Tool 单表恢复
  8. 2.10.PHP7.1 狐教程-【PHP 函数】
  9. matlab 实用快捷键
  10. 【故障诊断预测】基于matlab FFT与DBN轴承故障诊断预测【含Matlab源码 1741期】
  11. 支持javascript的ppt软件_把PPT放入浏览器中——12款用于演示的JS库
  12. Android测试驱动开发实践2
  13. b2b平台和b2b网站一样吗?B2B是什么意思?
  14. Unity3d学习日记 (1)为场景内物体添加基本逻辑和脚本代码
  15. Zabbix部署(参考官方文档)
  16. [翻译完成] 树莓派性能测试
  17. 认清影响因子引发的是是非非,善待逆境中顽强崛起的国产期刊
  18. V语言(Vlang) 操作mysql数据库返回map数组
  19. 阿里云服务器登陆宝塔
  20. idea-代码格式化快捷键设置

热门文章

  1. STM32H743IIT6+USB3300,USB_HS高速双向HID通讯开发
  2. 项目经理,你真的是资源不足吗?
  3. jenkins下载插件慢解决方式
  4. 普鸥知识产权|如何申请美国外观专利?申请费用、时间、流程?
  5. SNS光纤交换机命令及作用
  6. 微信小程序跳转至京东店铺首页
  7. vnr光学识别怎么打开_【VNR翻译器下载】Visual Novel Reader(VNR翻译器) v2.0 整合版-开心电玩...
  8. OpenCV4图像处理算子不完全手册-应用篇
  9. EyouCMS文章图片懒加载
  10. 自己编写的android汉字转拼音类(超全字库)