文档章节

案例:PackageManager

当空皓月
 当空皓月
发布于 2014/09/30 17:52
字数 1228
阅读 659
收藏 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);  

            }  

        });  


当空皓月
粉丝 14
博文 179
码字总数 67070
作品 0
郑州
私信 提问
加载中
请先登录后再评论。
rabbitmq的发布确认和事务

confirm的工作机制 Confirms是增加的一个确认机制的类,继承自标准的AMQP。这个类只包含了两个方法:confirm.select和confirm.select-ok。另外,basic.ack方法被发送到客户端。 confirm.sele...

你我他有个梦
2016/05/06
2.2W
6
互联网时代下的合作治理机制及其应用:以开源软件项目为例

互联网时代下的合作治理机制及其应用:以开源软件项目为例 陈晓红 伴随着国家战略层面的推动,互联网在2015年成为了全国瞩目的焦点。“互联网+”开放数据、分享经济、大众创业万众创新,所...

杨尚川
2016/03/23
816
2
一篇专题让你秒懂GCD死锁问题!

故事背景: GCD的死锁问题,一直是在使用多线程的时候,一个比较绕也必须要注意的问题,今天在工作中我们几个同事又讨论到了这个话题,通过和大伙的交流,发现不少的同事还是有绕不明白的地方, 我就...

DXSmile_大熊
2016/02/21
4.1K
14
地图应用开发(android)使用百度地图sdk详解+案例附源码

一、申请密钥 百度地图api 的key:http://lbsyun.baidu.com/apiconsole/key ----------输入sh1和包名即可生成key。 注意:关于安全码 ( 数字签名;包名 ) 的获取 1、eclipse下获取(这个最简单...

茗香墨语
2016/06/15
4.9K
0
jQuery实现百度地图api选择城市地图效果

由于项目需要jQuery实现百度地图api选择城市地图效果,就去百度API看了一下,里面有PHP的demo,Java的demo,最终没有找到我们大前端需要的东西,后来网上搜了好多案例,感觉这个还真的是不错...

2当家的
2017/03/02
2.1K
0

没有更多内容

加载失败,请刷新页面

加载更多

Azure Application Gateway(一)对后端 Web App 进行负载均衡

一,引言   今天,我们学习一个新的知识点-----Azure Application Gateway,通过Azure 应用程序网关为我么后端的服务提供负载均衡的功能。我们再文章头中大概先了解一下什么是应用程序网关...

osc_lc4icfkt
49分钟前
10
0
WoLai(我来) 注册码 ——国内版 notion 【笔记】

注册码: SQGYG23 ❤ W4T9PKP JLTHNJP KMTXK7P JDHKJEM KRJXX5P 6M7PPAP DEGLMG3 N3BZMRI 87BR22I GSIWGWP GNGBNTI QA8URIM UDUV9VM IHKJA7P MD9ZA3M 3XR67ZI TBUP9JX TI4TYMM 注册完了可以把......

osc_c05lkk3u
51分钟前
21
0
2020hdu多校第二场比赛及补题

这一场我们队只A了一题 1010 Lead of Wisdom 直接爆搜,但是T了好几发,剪了下枝 如果一个物品的a,b,c,d都比不上另外一个同种物品的a,b,c,d,那这个物品就可以直接淘汰掉了 #include<iostrea...

osc_usgpahnw
52分钟前
21
0
为什么Java有瞬态字段? - Why does Java have transient fields?

问题: 为什么Java有瞬态字段? 解决方案: 参考一: https://stackoom.com/question/3opS/为什么Java有瞬态字段 参考二: https://oldbug.net/q/3opS/Why-does-Java-have-transient-fields...

富含淀粉
52分钟前
16
0
轻松搭建CAS 5.x系列(6)-在CAS Server上增加OAuth2.0协议

概述说明 CAS Server默认搭建出来,客户端程序只能按照CAS自身的协议接入。CAS的强大在于,有官方的插件,可以支持其他的协议。本章节就让CAS Server怎么增加OAuth2.0的登录协议。 安装步骤 ...

osc_inj0cicw
54分钟前
24
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部