当前位置: 首页 > news >正文

重庆网站推广服务广告公司女员工深夜兼职

重庆网站推广服务,广告公司女员工深夜兼职,做网站价格多少,刷赞网站推广qq免费http://blog.csdn.net/qinjuning/article/details/6892054 通过第一部分Android中获取应用程序(包)的信息-----PackageManager的使用(一) 的介绍#xff0c;对PackageManager以及 AndroidManife.xml定义的节点信息类XXXInfo类都有了一定的认识。 本部分的内…http://blog.csdn.net/qinjuning/article/details/6892054 通过第一部分Android中获取应用程序(包)的信息-----PackageManager的使用(一) 的介绍对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()  方法原型为               /*param packageName 应用程序包名 *param observer 当查询包得信息大小操作完成后将回调给IPackageStatsObserver类中的onGetStatsCompleted()方法 * ,并且我们需要的PackageStats对象也封装在其参数里. * hide //隐藏函数的标记 */ public abstract void getPackageSizeInfo(String packageName,IPackageStatsObserver observer);{ // } 内部调用流程如下这个知识点较为复杂知道即可 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 文件 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; 第三步、  创建一个类继承至IPackageStatsObserver.Stub (桩)它本质上实现了Binder机制。当我们把该类的一个实例通过getPackageSizeInfo()调用时并该函数继而启动了启动中间流程去获取相关包得信息大小当扫描完成后最后将查询信息回调至该类的onGetStatsCompleted(in PackageStats pStats, boolean succeeded)方法信息大小封装在此实例上。例如 //aidl文件形成的Bindler机制服务类 public class PkgSizeObserver extends IPackageStatsObserver.Stub{ /*** 回调函数 * param pStatus ,返回数据封装在PackageStats对象中 * param succeeded 代表回调成功 */ Override public void onGetStatsCompleted(PackageStats pStats, boolean succeeded) throws RemoteException { // TODO Auto-generated method stub cachesize pStats.cacheSize ; //缓存大小 datasize pStats.codeSize ; //数据大小 codesize pStats.codeSize ; //应用程序大小 } } 第四步、  最后我们可以获取 pStats的属性获得它们的属性值通过调用系统函数Formatter.formateFileSize(long size)转换 为对应的以kb/mb为计量单位的字符串。 很重要的一点为了能够通过反射获取应用程序大小我们必须加入以下权限否则会出现警告并且得不到实际值。 uses-permission android:nameandroid.permission.GET_PACKAGE_SIZE/uses-permission 流程图如下 Demo说明 在第一部分应用得基础上我们添加了一个新功能点击任何一个应用后后弹出显示该应用的包信息大小的对话框。 截图如下 1、dialg_app_size.xml 文件 ?xml version1.0 encodingutf-8? LinearLayout xmlns:androidhttp://schemas.android.com/apk/res/android android:orientationvertical android:layout_widthwrap_content android:layout_heightwrap_content LinearLayout android:layout_widthwrap_content android:layout_heightwrap_content android:orientationhorizontal TextView android:layout_width100dip android:layout_heightwrap_content android:text缓存大小:/TextView TextView android:layout_width100dip android:idid/tvcachesize android:layout_heightwrap_content/TextView /LinearLayout LinearLayout android:layout_widthwrap_content android:layout_heightwrap_content android:orientationhorizontal TextView android:layout_width100dip android:layout_heightwrap_content android:text数据大小:/TextView TextView android:layout_width100dip android:idid/tvdatasize android:layout_heightwrap_content/TextView /LinearLayout LinearLayout android:layout_widthwrap_content android:layout_heightwrap_content android:orientationhorizontal TextView android:layout_width100dip android:layout_heightwrap_content android:text应用程序大小:/TextView TextView android:layout_width100dip android:idid/tvcodesize android:layout_heightwrap_content/TextView /LinearLayout LinearLayout android:layout_widthwrap_content android:layout_heightwrap_content android:orientationhorizontal TextView android:layout_width100dip android:layout_heightwrap_content android:text总大小:/TextView TextView android:layout_width100dip android:idid/tvtotalsize android:layout_heightwrap_content/TextView /LinearLayout /LinearLayout 2、另外的资源文件或自定义适配器复用了第一部分请知悉。 3、添加AIDL文件如上。 4、主文件MainActivity.java如下 package com.qin.appsize; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.Collections; import java.util.List; import com.qin.appsize.AppInfo; import android.app.Activity; import android.app.AlertDialog; import android.content.ComponentName; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.content.pm.IPackageStatsObserver; import android.content.pm.PackageManager; import android.content.pm.PackageStats; import android.content.pm.ResolveInfo; import android.graphics.drawable.Drawable; import android.os.Bundle; import android.os.RemoteException; import android.text.format.Formatter; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.widget.AdapterView; import android.widget.ListView; import android.widget.TextView; import android.widget.AdapterView.OnItemClickListener; public class MainActivity extends Activity implements OnItemClickListener{ private static String TAG APP_SIZE; private ListView listview null; private ListAppInfo mlistAppInfo null; LayoutInflater infater null ; //全局变量保存当前查询包得信息 private long cachesize ; //缓存大小 private long datasize ; //数据大小 private long codesize ; //应用程序大小 private long totalsize ; //总大小 Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.browse_app_list); listview (ListView) findViewById(R.id.listviewApp); mlistAppInfo new ArrayListAppInfo(); queryAppInfo(); // 查询所有应用程序信息 BrowseApplicationInfoAdapter browseAppAdapter new BrowseApplicationInfoAdapter( this, mlistAppInfo); listview.setAdapter(browseAppAdapter); listview.setOnItemClickListener(this); } // 点击弹出对话框显示该包得大小 public void onItemClick(AdapterView? arg0, View view, int position,long arg3) { //更新显示当前包得大小信息 queryPacakgeSize(mlistAppInfo.get(position).getPkgName()); infater (LayoutInflater) MainActivity.this.getSystemService(Context.LAYOUT_INFLATER_SERVICE); View dialog infater.inflate(R.layout.dialog_app_size, null) ; TextView tvcachesize (TextView) dialog.findViewById(R.id.tvcachesize) ; //缓存大小 TextView tvdatasize (TextView) dialog.findViewById(R.id.tvdatasize) ; //数据大小 TextView tvcodesize (TextView) dialog.findViewById(R.id.tvcodesize) ; // 应用程序大小 TextView tvtotalsize (TextView) dialog.findViewById(R.id.tvtotalsize) ; //总大小 //类型转换并赋值 tvcachesize.setText(formateFileSize(cachesize)); tvdatasize.setText(formateFileSize(datasize)) ; tvcodesize.setText(formateFileSize(codesize)) ; tvtotalsize.setText(formateFileSize(totalsize)) ; //显示自定义对话框 AlertDialog.Builder builder new AlertDialog.Builder(MainActivity.this) ; builder.setView(dialog) ; builder.setTitle(mlistAppInfo.get(position).getAppLabel()的大小信息为) ; builder.setPositiveButton(确定, new DialogInterface.OnClickListener() { Override public void onClick(DialogInterface dialog, int which) { // TODO Auto-generated method stub dialog.cancel() ; // 取消显示对话框 } }); builder.create().show() ; } public void queryPacakgeSize(String pkgName) throws Exception{ if ( pkgName ! null){ //使用放射机制得到PackageManager类的隐藏函数getPackageSizeInfo PackageManager pm getPackageManager(); //得到pm对象 try { //通过反射机制获得该隐藏函数 Method getPackageSizeInfo pm.getClass().getDeclaredMethod(getPackageSizeInfo, String.class,IPackageStatsObserver.class); //调用该函数并且给其分配参数 待调用流程完成后会回调PkgSizeObserver类的函数 getPackageSizeInfo.invoke(pm, pkgName,new PkgSizeObserver()); } catch(Exception ex){ Log.e(TAG, NoSuchMethodException) ; ex.printStackTrace() ; throw ex ; // 抛出异常 } } } //aidl文件形成的Bindler机制服务类 public class PkgSizeObserver extends IPackageStatsObserver.Stub{ /*** 回调函数 * param pStatus ,返回数据封装在PackageStats对象中 * param succeeded 代表回调成功 */ Override public void onGetStatsCompleted(PackageStats pStats, boolean succeeded) throws RemoteException { // TODO Auto-generated method stub cachesize pStats.cacheSize ; //缓存大小 datasize pStats.dataSize ; //数据大小 codesize pStats.codeSize ; //应用程序大小 totalsize cachesize datasize codesize ; Log.i(TAG, cachesize---cachesize datasize----datasize codeSize----codesize) ; } } //系统函数字符串转换 long -String (kb) private String formateFileSize(long size){ return Formatter.formatFileSize(MainActivity.this, size); } // 获得所有启动Activity的信息类似于Launch界面 public void queryAppInfo() { PackageManager pm this.getPackageManager(); // 获得PackageManager对象 Intent mainIntent new Intent(Intent.ACTION_MAIN, null); mainIntent.addCategory(Intent.CATEGORY_LAUNCHER); // 通过查询获得所有ResolveInfo对象. ListResolveInfo resolveInfos pm.queryIntentActivities(mainIntent, 0); // 调用系统排序 根据name排序 // 该排序很重要否则只能显示系统应用而不能列出第三方应用程序 Collections.sort(resolveInfos,new ResolveInfo.DisplayNameComparator(pm)); if (mlistAppInfo ! null) { mlistAppInfo.clear(); for (ResolveInfo reInfo : resolveInfos) { String activityName reInfo.activityInfo.name; // 获得该应用程序的启动Activity的name String pkgName reInfo.activityInfo.packageName; // 获得应用程序的包名 String appLabel (String) reInfo.loadLabel(pm); // 获得应用程序的Label Drawable icon reInfo.loadIcon(pm); // 获得应用程序图标 // 为应用程序的启动Activity 准备Intent Intent launchIntent new Intent(); launchIntent.setComponent(new ComponentName(pkgName,activityName)); // 创建一个AppInfo对象并赋值 AppInfo appInfo new AppInfo(); appInfo.setAppLabel(appLabel); appInfo.setPkgName(pkgName); appInfo.setAppIcon(icon); appInfo.setIntent(launchIntent); mlistAppInfo.add(appInfo); // 添加至列表中 } } } } 获取应用程序信息大小就是这么来的整个过程相对而言还是挺简单的比较难理解的是AIDL文件的使用和回调函数的处理。 仔细研究后才有所理解。 关于PackageManager的使用的源代码已上传下载地址http://download.csdn.net/detail/qinjuning/3775856 PS 源码中的AIDL所在包名错误导致报错应为android.content.pm。请大家修改后运行 把 getDeclaredMethod() 改成 getMethod()
http://www.pierceye.com/news/94984/

相关文章:

  • 北京官网开发优化游戏性能的软件
  • 网站开发选asp还是hph集约化网站群建设情况
  • 做网站域名重要吗10000ip网站怎么做
  • 途牛的旅游网站是谁做的wordpress 注册用户列表
  • 如何编辑网站新吁网站建设
  • 网站开发采集工具免费引流在线推广
  • 全面的锦州网站建设西安建筑工程有限公司
  • 做网站 郑州公司哪家好哪个购物网站最便宜
  • dedecms网站后台免费网页小游戏
  • 如何查网站外链wordpress火车头采集免费版
  • 四川住房建设和城乡建设厅新网站wordpress 采集 api
  • 企业所得税怎么交南昌seo实用技巧
  • 深圳英文网站开发企业网站和展板建设
  • 国内网站设计制作网页游戏传奇盛世开服表
  • 网站图片放大特效怎么做网站建设的后期服务要包括什么软件
  • 网站降权投诉商标注册证书电子版怎么查询
  • 济南网站制作公司哪家好网站建设搞笑广告词
  • 建设主管部门门户网站摄影网站源码 免费下载
  • js 曲线 网站营销型网站方案书
  • 如何盗取网站软件开发的自学教程
  • 傻瓜建站家庭网络搭建网站
  • 扬中做网站的公司静态网页生成器
  • 襄阳做公司网站的软件公司wordpress网站好做排名吗
  • 电商网站功能介绍太原市做网站公司
  • 网站开发融资计划网站响应式和电脑手机
  • 专做水果的网站天门市规划建设局网站
  • 网站百度地图生成器建设一个网站可以做什么
  • 用阳寿做交易的网站建盏公司简介
  • 机械加工网站哪个好服装设计专业有前途吗
  • 深圳 企业 网站建设哪家好没有域名的网站需要备案吗