Android获取应用程序大小和缓存的实例代码
来源:互联网 发布:成都景鑫云科技 知乎 编辑:程序博客网 时间:2024/05/22 12:38
info
package com.qin.appsize;import android.content.Intent;import android.graphics.drawable.Drawable;//Model类 ,用来存储应用程序信息public class AppInfo { private String appLabel; //应用程序标签 private Drawable appIcon ; //应用程序图像 private Intent intent ; //启动应用程序的Intent ,一般是Action为Main和Category为Lancher的Activity private String pkgName ; //应用程序所对应的包名 private long cachesize ; //缓存大小 private long datasize ; //数据大小 private long codesieze ; //应用程序大小 public long getCachesize() { return cachesize; } public void setCachesize(long cachesize) { this.cachesize = cachesize; } public long getDatasize() { return datasize; } public void setDatasize(long datasize) { this.datasize = datasize; } public long getCodesieze() { return codesieze; } public void setCodesieze(long codesieze) { this.codesieze = codesieze; } public AppInfo(){} public String getAppLabel() { return appLabel; } public void setAppLabel(String appName) { this.appLabel = appName; } public Drawable getAppIcon() { return appIcon; } public void setAppIcon(Drawable appIcon) { this.appIcon = appIcon; } public Intent getIntent() { return intent; } public void setIntent(Intent intent) { this.intent = intent; } public String getPkgName(){ return pkgName ; } public void setPkgName(String pkgName){ this.pkgName=pkgName ; }}
自定义的类
package com.qin.appsize;import java.util.List;import android.content.Context;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.BaseAdapter;import android.widget.ImageView;import android.widget.TextView;//自定义适配器类,提供给listView的自定义viewpublic class BrowseApplicationInfoAdapter extends BaseAdapter { private List<AppInfo> mlistAppInfo = null; LayoutInflater infater = null; public BrowseApplicationInfoAdapter(Context context, List<AppInfo> apps) { infater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); mlistAppInfo = apps ; } @Override public int getCount() { // TODO Auto-generated method stub System.out.println("size" + mlistAppInfo.size()); return mlistAppInfo.size(); } @Override public Object getItem(int position) { // TODO Auto-generated method stub return mlistAppInfo.get(position); } @Override public long getItemId(int position) { // TODO Auto-generated method stub return 0; } @Override public View getView(int position, View convertview, ViewGroup arg2) { System.out.println("getView at " + position); View view = null; ViewHolder holder = null; if (convertview == null || convertview.getTag() == null) { view = infater.inflate(R.layout.browse_app_item, null); holder = new ViewHolder(view); view.setTag(holder); } else{ view = convertview ; holder = (ViewHolder) convertview.getTag() ; } AppInfo appInfo = (AppInfo) getItem(position); holder.appIcon.setImageDrawable(appInfo.getAppIcon()); holder.tvAppLabel.setText(appInfo.getAppLabel()); holder.tvPkgName.setText(appInfo.getPkgName()); return view; } class ViewHolder { ImageView appIcon; TextView tvAppLabel; TextView tvPkgName; public ViewHolder(View view) { this.appIcon = (ImageView) view.findViewById(R.id.imgApp); this.tvAppLabel = (TextView) view.findViewById(R.id.tvAppLabel); this.tvPkgName = (TextView) view.findViewById(R.id.tvPkgName); } }}
主类
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 List<AppInfo> 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 ArrayList<AppInfo>(); queryAppInfo(); // 查询所有应用程序信息 BrowseApplicationInfoAdapter browseAppAdapter = new BrowseApplicationInfoAdapter( this, mlistAppInfo); listview.setAdapter(browseAppAdapter); listview.setOnItemClickListener(this); } // 点击弹出对话框,显示该包得大小 public void onItemClick(AdapterView<?> arg0, View view, int position,long arg3) { //更新显示当前包得大小信息 try { queryPacakgeSize(mlistAppInfo.get(position).getPkgName()); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } 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对象. List<ResolveInfo> 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); // 添加至列表中 } } }}
0 0
- Android获取应用程序大小和缓存的实例代码
- Android中获取应用程序(包)的大小和缓存大小
- android 获取应用程序(包)的信息和缓存大小 PackageManager的使用
- Android获取应用程序的大小
- Android的Bitmap和缓存机制
- android:一句代码搞定图片下载和缓存
- 不可变类和缓存实例的不可变类
- Android中获取应用程序(包)的大小
- android上的缓存、缓存算法和缓存框架
- Android系统应用信息中存储和缓存的计算方法
- android:强大的图片下载和缓存库Picasso
- android上的缓存、缓存算法和缓存框架
- android上的缓存、缓存算法和缓存框架
- Android系统应用信息中存储和缓存的计算方法
- Android下载图片 图片的异步加载 和缓存存取
- android:强大的图片下载和缓存库Picasso
- android:强大的图片下载和缓存库Picasso
- Android系统应用信息中存储和缓存的计算方法
- Xcode iOS10.0 配置包 could not find developer disk image
- iOS导航栏跳转
- 前端开发入门提升经验整理
- jstl报错ye:javax.el.PropertyNotFoundException: Property 'name' not found on type java.lang.String
- 400 404 500 代表什么
- Android获取应用程序大小和缓存的实例代码
- Leetcode-133. Clone Graph
- response的contentType 几种类型
- 《转》实现斗鱼直播弹幕效果
- iOS-应用崩溃日志揭秘
- 刷新加载RecyclerView+图片加载Glide+多样式布局(二)
- 二维数组相同数组的字段 合并
- Java集合框架
- 百度地图放置多个点位(可以1000以上)