本系列获得应用程序信息文章:

android基础知识15:获得android应用程序(包)信息01—info类

android基础知识15:获得android应用程序(包)信息02—大小

android基础知识15:获得android应用程序(包)信息03—PackageManager

android基础知识15:获得android应用程序(包)信息04—ActivityManager


通过第一部分<<android基础知识15:获得android应用程序(包)信息01—info类>>的介绍,对PackageManager以及AndroidManife.xml定义的节点信息类XXXInfo类都有了一定的认识。

本部分的内容是如何获取安装包得大小,包括缓存大小(cachesize)、数据大小(datasize)、应用程序大小(codesize)。本部分的知识点涉及到AIDL、Java反射机制。理解起来也不是很难。

关于安装包得大小信息封装在PackageStats类中,该类很简单,只有几个字段:
PackageStats类:
常用字段:
public long cachesize 缓存大小
public long codesize 应用程序大小
public long datasize 数据大小
public String packageName 包名

PS:应用程序的总大小 = cachesize + codesize + datasize
也就是说只要获得了安装包所对应的PackageStats对象,就可以获得信息了。但是在AndroidSDK中并没有显示提供方法来获得该对象,是不是很苦恼呢?但是,我们可以通过放射机制来调用系统中隐藏的函数(@hide)来获得每个安装包得信息。具体方法如下:

第一步、 通过放射机制调用getPackageSizeInfo() 方法原型为:

内部调用流程如下,这个知识点较为复杂,知道即可,
getPackageSizeInfo方法内部调用getPackageSizeInfoLI(packageName, pStats)方法来完成包状态获取。
getPackageSizeInfoLI方法内部调用Installer.getSizeInfo(String pkgName, String apkPath,String fwdLockApkPath, PackageStats
pStats),继而将包状态信息返回给参数pStats。getSizeInfo这个方法内部是以本机Socket方式连接到Server,
然后向server发送一个文本字符串命令,格式:getsize apkPath fwdLockApkPath 给server。Server将结果返回,并解析到pStats
中。掌握这个调用知识链即可。
第二步、 由于需要获得系统级的服务或类,我们必须加入Android系统形成的AIDL文件,共两个:
IPackageStatsObserver.aidl 和 PackageStats.aidl文件。并将其放置在android.pm.content包路径下。
IPackageStatsObserver.aidl 文件

PackageStats.aidl文件

第三步、 创建一个类继承至IPackageStatsObserver.Stub (桩,)它本质上实现了Binder机制。当我们把该类的一个实例通过getPackageSizeInfo()调用时,并该函数继而启动了启动中间流程去获取相关包得信息大小,当扫描完成后,最后将查询信息回调至该类的onGetStatsCompleted(in PackageStats pStats, boolean succeeded)方法,信息大小封装在此实例上。例如:

第四步、 最后我们可以获取 pStats的属性,获得它们的属性值,通过调用系统函数Formatter.formateFileSize(long size)转换
为对应的以kb/mb为计量单位的字符串。
很重要的一点:为了能够通过反射获取应用程序大小,我们必须加入以下权限,否则,会出现警告并且得不到实际值。

流程图如下:


Demo说明:
在第一部分应用得基础上,我们添加了一个新功能,点击任何一个应用后后,弹出显示该应用的包信息大小的对话框。
截图如下:
工程图: 程序效果图:


1、dialg_app_size.xml 文件

2、另外的资源文件或自定义适配器复用了第一部分,请知悉。
3、添加AIDL文件,如上。
4、主文件MainActivity.java如下:

获取应用程序信息大小就是这么来的,整个过程相对而言还是挺简单的,比较难理解的是AIDL文件的使用和回调函数的处理。
仔细研究后,才有所理解。
关于PackageManager的使用的源代码已上传,下载地址:http://download.csdn.net/detail/qinjuning/3775856

更多相关文章

  1. Android中RemoteViews的实现
  2. Android中RemoteViews的实现
  3. Android窗口机制(五)最终章:WindowManager.LayoutParams和Token以及
  4. android api 完整翻译之Application Fundamentals (学习android必
  5. 我对学习delphiTeacher的《delphi调用及封装Android原生控件》的
  6. 【Android(安卓)Api 翻译3】android api 完整翻译之Application
  7. android 朗读tts_如何设置Android以大声朗读您的文本
  8. EditText焦点问题
  9. android manifest.xml

随机推荐

  1. tabhost置底
  2. Android(安卓)周报
  3. Android(安卓)ConstraintLayout Toolbar
  4. Android练习之BitmapFactory.decodeFile
  5. android 游戏 让人物动起来
  6. Android加载大量文字时关键字变色
  7. 友盟统计配置
  8. Android(安卓)弹框没有背景色及背景边框
  9. BLE CoC in Android
  10. Android获取SD卡大小