文档章节

案例:PackageManager

当空皓月
 当空皓月
发布于 2014/09/30 17:52
字数 1228
阅读 278
收藏 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
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
一个应用程序和另一个应用程序apk文件信息

应用场景:对于我们自己开发的两个应用程序,一个应用程序的包名为 aa.bb.cc,软件名叫a,它的入口Activity为 aaActivity(入口activity就是在AndroidManifest.xml中标签——<action android...

lxp198837
2012/06/27
0
0
仔仔手机安全卫士demo(一)

第一步:设计splash页面,即进入主页面前的一个欢迎页面 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tool......

Angels_安杰
2015/10/13
21
0

没有更多内容

加载失败,请刷新页面

加载更多

exportfs命令, vsftp搭建ftp服务

exportfs命令 当修改/etc/exports文件后,更改的内容是不会立即生效的。如果重启nfs服务,会导致客户端重启期间的请求是挂起等待的,可以把客户端的挂载umount进行卸载后,再重启nfs服务,但...

野雪球
5分钟前
0
0
编程价值观、原则、模式

读自《实现模式》 模式,即是针对特定问题的通用解决方案。 每个模式都承载这一点点理论,但实际编程中存在着一些更加深远的影响力,远不是孤立的模式所能概括的。 价值观是编程过程的统一支...

遥借东风
18分钟前
1
0
php分割二级域名做跳转处理方法

使用php中的全局变量 $_SERVER['HTTP_HOST'] ,可以获得用户当前访问的域名字符串,在这里面查询自己定义的各个子域名字符串,然后使用header函数重定向到不同的页面 代码如下 if( strpos($...

Mr_Azaz
20分钟前
1
0
容器之Zookeeper的使用

我们使用zookeeper时,都是在Linux上安装zookeeper,之后启动时要加入配置文件。 使用docker之后,我们可以直接使用镜像运行容器,镜像可以从docker.hub上下载,地址是https://hub.docker.co...

克虏伯
昨天
3
0
esxi 更换ssl证书

概述 就是想换一个证书而已,你可以通过下面的途径去申请一个泛解析域名的证书之后再esxi上安装上 使用阿里云域名api申请Let’s Encrypt泛域名免费ssl证书 申请完成证书之后进行下一步 操作 ...

bboysoulcn
昨天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部