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
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 广州住房公积金查询 河南省住房公积金查询 福州住房公积金管理中心 常州住房公积金查询 遂宁市住房公积金管理中心 天津市住房公积金管理中心 湖南住房公积金查询个人账户 深圳住房公积金电话 住房公积金查询网 洛阳住房公积金 呼和浩特住房公积金查询 青海省住房公积金查询 郑州住房公积金管理中心 苏州住房公积金查询 成都住房公积金查询个人账户 住房公积金中心电话 昆山住房公积金管理中心 吉林市住房公积金查询 沈阳住房公积金 沈阳住房公积金管理中心 贵港市住房公积金管理中心 萍乡住房公积金查询 郑州市住房公积金 赣州市住房公积金管理中心 济南住房公积金查询 济宁市住房公积金个人查询 西安住房公积金查询网 西安市住房公积金中心 西安市住房公积金 西安市住房公积金管理中心 西安市个人住房公积金查询 个人住房公积金查询个人账户 西安住房公积金个人帐户查询 住房公积金账户 查询住房公积金个人账户余额 怎么查询住房公积金 个人住房公积金 怎样查询住房公积金账户余额 西安个人住房公积金查询 住房公积金怎么用 住房公积金个人查询