文档章节

案例:PackageManager

当空皓月
 当空皓月
发布于 2014/09/30 17:52
字数 1228
阅读 277
收藏 8

1。http://blog.csdn.net/qinjuning/article/details/6867806    此人博客写的不错,有待研究啊

2。http://blog.csdn.net/liranke/article/details/17717571 简直就是超级大神!

3。下面来看咱们的案例

PackageManager pm = getPackageManager();

下面是获取当前应用的基本信息:

//图标

 Drawable app_icon =pm.getApplicationIcon(getApplicationInfo());

// 获取名称
  String app_name = (String) pm.getApplicationLabel(getApplicationInfo());

PackageInfopackageInfo = pm.getPackageInfo(getPackageName(), PackageManager.GET_UNINSTALLED_PACKAGES);

mAppInfo.setAppLabel((String) packageInfo.applicationInfo.loadLabel(pm));
   //mAppInfo.setAppIcon(packageInfo.applicationInfo.loadIcon(pm));
   mAppInfo.setVersionName(packageInfo.versionName);
   mAppInfo.setVersionCode(packageInfo.versionCode);
   mAppInfo.setPackageName(packageInfo.packageName);
   mAppInfo.setFirstInstallTime(packageInfo.firstInstallTime);
   mAppInfo.setLastUpdateTime(packageInfo.lastUpdateTime);

下面是获取手机中应用的基本信息:

List<PackageInfo> installedPackages = pm.getInstalledPackages(0);
  for (PackageInfo packageInfo : installedPackages) {
   AppInfo mAppInfo = new AppInfo();
   mAppInfo.setAppLabel((String) packageInfo.applicationInfo.loadLabel(pm));
   //mAppInfo.setAppIcon(packageInfo.applicationInfo.loadIcon(pm));
   mAppInfo.setVersionName(packageInfo.versionName);
   mAppInfo.setVersionCode(packageInfo.versionCode);
   mAppInfo.setPackageName(packageInfo.packageName);
   mAppInfo.setFirstInstallTime(packageInfo.firstInstallTime);
   mAppInfo.setLastUpdateTime(packageInfo.lastUpdateTime);
   
   // Only display the non-system app info
   if ((packageInfo.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) == 0) {
    // 如果非系统应用,则添加至appList
    mAppInfos.add(mAppInfo);
   }
  }

下面是获取手机桌面上应用的基本信息:

Intent intent = new Intent(Intent.ACTION_MAIN);
  intent.addCategory(Intent.CATEGORY_LAUNCHER);
        List<ResolveInfo> queryIntentActivities = pm.queryIntentActivities(intent, 0);
        for (ResolveInfo resolveInfo : queryIntentActivities) {

         AppInfo mAppInfo = new AppInfo();
   mAppInfo.setAppIcon(resolveInfo.loadIcon(pm));
   mAppInfo.setAppLabel((String)resolveInfo.loadLabel(pm));
   mAppInfo.setPackageName(resolveInfo.activityInfo.packageName);
   mAppInfos.add(mAppInfo);
  }

效果如图:

关于apk的安装路径和大小:

豌豆荚
10-04 03:38:02.178: I/System.out(2458): sourceDir:/data/app/com.wandoujia.phoenix2-1.apk
10-04 03:38:02.178: I/System.out(2458): dataDir:/data/data/com.wandoujia.phoenix2
10-04 03:38:02.178: I/System.out(2458): publicSourceDir:/data/app/com.wandoujia.phoenix2-1.apk
10-04 03:38:02.178: I/System.out(2458): 豌豆荚的apk大小:5.13MB

API Demos
10-04 03:38:02.002: I/System.out(2458): sourceDir:/data/app/com.example.android.apis-1.apk
10-04 03:38:02.006: I/System.out(2458): dataDir:/data/data/com.example.android.apis
10-04 03:38:02.006: I/System.out(2458): publicSourceDir:/data/app/com.example.android.apis-1.apk
10-04 03:38:02.026: I/System.out(2458): API Demos的apk大小:4.58MB

电话
10-04 03:38:01.802: I/System.out(2458): sourceDir:/system/app/VoiceDialer.apk
10-04 03:38:01.802: I/System.out(2458): dataDir:/data/data/com.android.voicedialer
10-04 03:38:01.802: I/System.out(2458): publicSourceDir:/system/app/VoiceDialer.apk
10-04 03:38:01.810: I/System.out(2458): Voice Dialerapk的大小:124KB

闹钟
10-04 03:38:02.202: I/System.out(2458): sourceDir:/system/app/DeskClock.apk
10-04 03:38:02.202: I/System.out(2458): dataDir:/data/data/com.android.deskclock
10-04 03:38:02.202: I/System.out(2458): publicSourceDir:/system/app/DeskClock.apk
10-04 03:38:02.202: I/System.out(2458): Clockapk大小:2.14MB

代码实现:
List<ApplicationInfo> installedApplications = pm.getInstalledApplications(PackageManager.GET_UNINSTALLED_PACKAGES);
  for (ApplicationInfo applicationInfo : installedApplications) {
   String sourceDir=applicationInfo.sourceDir;//安装路径
   String dataDir=applicationInfo.dataDir;
   String publicSourceDir=applicationInfo.publicSourceDir;
   System.out.println("sourceDir:"+sourceDir);
   System.out.println("dataDir:"+dataDir);
   System.out.println("publicSourceDir:"+publicSourceDir);
   int size = Integer.valueOf((int) new File(publicSourceDir).length());
   System.out.println(applicationInfo.loadLabel(pm)+"的apk大小:"+Formatter.formatFileSize(this, size));
  }

这个大小和茄子快传,快牙,闪传,豌豆荚上的软件管理中显示的是一致的

 

应用程序的大小:

豌豆荚
10-04 03:58:18.234: I/System.out(2538): cacheSize:28.00KB,codeSize:11.11MB,dataSize:8.96MB
10-04 03:58:18.238: I/System.out(2538): externalCacheSize:0.00B,externalCodeSize:0.00B,externalDataSize:0.00BexternalMediaSize:0.00B,externalObbSize:0.00B
10-04 03:58:18.238: I/System.out(2538): 豌豆荚的总大小:20.10MB

API Demos
10-04 03:58:18.122: I/System.out(2538): cacheSize:12.00KB,codeSize:6.43MB,dataSize:0.00B
10-04 03:58:18.122: I/System.out(2538): externalCacheSize:0.00B,externalCodeSize:0.00B,externalDataSize:0.00BexternalMediaSize:0.00B,externalObbSize:0.00B
10-04 03:58:18.122: I/System.out(2538): API Demos的总大小:6.44MB

电话
10-04 03:58:18.310: I/System.out(2538): cacheSize:12.00KB,codeSize:60.00KB,dataSize:12.00KB
10-04 03:58:18.310: I/System.out(2538): externalCacheSize:0.00B,externalCodeSize:0.00B,externalDataSize:0.00BexternalMediaSize:0.00B,externalObbSize:0.00B
10-04 03:58:18.310: I/System.out(2538): Voice Dialer的总大小:84.00KB

闹钟
10-04 03:58:17.818: I/System.out(2538): cacheSize:12.00KB,codeSize:392KB,dataSize:60.00KB
10-04 03:58:17.862: I/System.out(2538): externalCacheSize:0.00B,externalCodeSize:0.00B,externalDataSize:0.00BexternalMediaSize:0.00B,externalObbSize:0.00B
10-04 03:58:17.866: I/System.out(2538): Clock的总大小:464KB


目录结构如下:

介绍一篇aidl的文章:http://www.cnblogs.com/rookietong/archive/2013/03/16/2962623.html

android.content.pm,这个包及包下的所有东西都是死的,是系统的aidl文件,这些文件可以在github上下载。

IPackageDataObserver.aidl

package android.content.pm;

/**
 * API for package data change related callbacks from the Package Manager.
 * Some usage scenarios include deletion of cache directory, generate
 * statistics related to code, data, cache usage(TODO)
 * {@hide}
 */
oneway interface IPackageDataObserver {
    void onRemoveCompleted(in String packageName, boolean succeeded);
}

IPackageStatsObserver.aidl

package android.content.pm;

import android.content.pm.PackageStats;
/**
 * API for package data change related callbacks from the Package Manager.
 * Some usage scenarios include deletion of cache directory, generate
 * statistics related to code, data, cache usage(TODO)
 * {@hide}
 */
oneway interface IPackageStatsObserver {
   
    void onGetStatsCompleted(in PackageStats pStats, boolean succeeded);
}

PackageStats.aidl
package android.content.pm;

parcelable  PackageStats;

软件包的大小封装在PackageStats这个类中,要获取这个类不能用构造方法获取,这一点也不知道为什么。他是通过PackageManager的hide方法getPackageSizeInfo()来得到,但是要调用这个hide方法就要用java的反射机制,不然pm.不出来。应用aidl的代码如下:

List<ResolveInfo> queryIntentActivities = pm.queryIntentActivities(intent, 0);

for (final ResolveInfo resolveInfo : queryIntentActivities) {
   try {
    Method getPackageSizeInfo = pm.getClass().getMethod("getPackageSizeInfo", String.class, IPackageStatsObserver.class);
    getPackageSizeInfo.invoke(pm, resolveInfo.activityInfo.packageName, new IPackageStatsObserver.Stub() {
     @Override
     public void onGetStatsCompleted(PackageStats packageStats, boolean succeeded) throws RemoteException {
      // TODO Auto-generated method stub
      Long cacheSize=packageStats.cacheSize;
      Long codeSize=packageStats.codeSize;
      Long dataSize=packageStats.dataSize;
      Long externalCacheSize=packageStats.externalCacheSize;
      Long externalCodeSize=packageStats.externalCodeSize;
      Long externalDataSize=packageStats.externalDataSize;
      Long externalMediaSize=packageStats.externalMediaSize;
      Long externalObbSize=packageStats.externalObbSize;
      System.out.println("cacheSize:" + Formatter.formatFileSize(getApplication(), cacheSize) + ",codeSize:" + Formatter.formatFileSize(getApplication(), codeSize) + ",dataSize:" + Formatter.formatFileSize(getApplication(), dataSize));
      System.out.println("externalCacheSize:" + Formatter.formatFileSize(getApplication(), externalCacheSize) + ",externalCodeSize:" + Formatter.formatFileSize(getApplication(), externalCodeSize) + ",externalDataSize:" + Formatter.formatFileSize(getApplication(), externalDataSize)+
        "externalMediaSize:"+Formatter.formatFileSize(getApplication(), externalMediaSize) + ",externalObbSize:" + Formatter.formatFileSize(getApplication(), externalObbSize) );
     String totalSize=Formatter.formatFileSize(getApplication(), (packageStats.cacheSize + packageStats.codeSize +packageStats.dataSize)/*/(1024*1024)*/);
     System.out.println((String) resolveInfo.loadLabel(pm)+"的总大小:" + totalSize /*+"M"*/);
     }
    });
   } catch (Exception e) {
    // TODO: handle exception
    e.printStackTrace();
   }

这个大小是和猎豹清理大师软件管理中的大小是一致的


点击item启动应用程序:

启动另外的一个应用程序的Activity:

http://www.apkbus.com/android-43480-1-1.html

http://gundumw100.iteye.com/blog/1138158  (其中这个比较好)

代码实现:

lv.setAdapter(adapter);  

       lv.setOnItemClickListener(new OnItemClickListener() {  

            @Override  

            public void onItemClick(AdapterView<?> parent, View view,  int position, long id) {  

                String packageName = (String) items.get(position).get( "packageName");  

                //取到点击的包名  

                Intent i = pm.getLaunchIntentForPackage(packageName);  

                //如果该程序不可启动(像系统自带的包,有很多是没有入口的)会返回NULL  

                if (i != null)  

                    startActivity(i);  

            }  

        });  


© 著作权归作者所有

共有 人打赏支持
当空皓月
粉丝 13
博文 179
码字总数 67070
作品 0
郑州
Android 应用跳转到拨打电话界面或qq进行聊天(qq咨询)

拨打电话: /** * 调用拨号界面 * @param phone 电话号码 */public void callPhone(String phone) { } /** * 调用拨号功能 * @param phone 电话号码 */ private void call(String phone) { I......

先进青年
2016/11/08
88
0
获取应用的当前版本号&获取当前android系统的版本号

获取当前应用的版本号: private String getVersionName() throws Exception { // 获取packagemanager的实例 PackageManager packageManager = getPackageManager(); // getPackageName()是你......

伽罗kapple
2014/10/18
1K
0
Android 获取应用程序版本号

功能:获取版本号 思路:版本号位置在AndroidManifest.xml文件中,需要找到一个类可以获取该位置的信息 需要使用到getPackageInfo和 PackageManager 这两个类。 一、getPackageInfo介绍和用法...

FergusJ
2015/09/04
0
0
【Android】获取手机中已安装apk文件信息(PackageInfo、ResolveInfo)(应用图片、应用名、包名等)

众所周知,通过PackageManager可以获取手机端已安装的apk文件的信息,具体代码如下 PackageManager packageManager = this.getPackageManager();List packageInfoList = packageManager.get...

晨曦之光
2012/03/01
1K
1
Android7.0 MTK方案 静默安装和卸载

一、android安装apk介绍 安装apk有两种方法 1、调用系统PackageInstaller.apk进行安装 这个系统apk所在目录为:android/packages/apps/PackageInstaller 2、串口命令安装”pm install –r h...

DaSunWarman
2017/12/02
0
0

没有更多内容

加载失败,请刷新页面

加载更多

如何通过 J2Cache 实现分布式 session 存储

做 Java Web 开发的人多数都会需要使用到 session (会话),我们使用 session 来保存一些需要在两个不同的请求之间共享数据。一般 Java 的 Web 容器像 Tomcat、Resin、Jetty 等等,它们会在...

红薯
今天
1
0
C++ std::thread

C++11提供了std::thread类来表示一个多线程对象。 1,首先介绍一下std::this_thread命名空间: (1)std::this_thread::get_id():返回当前线程id (2)std::this_thread::yield():用户接口...

yepanl
今天
2
0
Nignx缓存文件与动态文件自动均衡的配置

下面这段nginx的配置脚本的作用是,自动判断是否存在缓存文件,如果有优先输出缓存文件,不经过php,如果没有,则回到php去处理,同时生成缓存文件。 PHP框架是ThinkPHP,最后一个rewrite有关...

swingcoder
今天
1
0
20180920 usermod命令与用户密码管理

命令 usermod usermod 命令的选项和 useradd 差不多。 一个用户可以属于多个组,但是gid只有一个;除了gid,其他的组(groups)叫做扩展组。 usermod -u 1010 username # 更改用户idusermod ...

野雪球
今天
1
0
Java网络编程基础

1. 简单了解网络通信协议TCP/IP网络模型相关名词 应用层(HTTP,FTP,DNS等) 传输层(TCP,UDP) 网络层(IP,ICMP等) 链路层(驱动程序,接口等) 链路层:用于定义物理传输通道,通常是对...

江左煤郎
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部