Android获取应用程序大小和缓存的实例代码
info
packagecom.qin.appsize;
importandroid.content.Intent;
importandroid.graphics.drawable.Drawable;
//Model类,用来存储应用程序信息
publicclassAppInfo{
privateStringappLabel;//应用程序标签
privateDrawableappIcon;//应用程序图像
privateIntentintent;//启动应用程序的Intent,一般是Action为Main和Category为Lancher的Activity
privateStringpkgName;//应用程序所对应的包名
privatelongcachesize;//缓存大小
privatelongdatasize;//数据大小
privatelongcodesieze;//应用程序大小
publiclonggetCachesize(){
returncachesize;
}
publicvoidsetCachesize(longcachesize){
this.cachesize=cachesize;
}
publiclonggetDatasize(){
returndatasize;
}
publicvoidsetDatasize(longdatasize){
this.datasize=datasize;
}
publiclonggetCodesieze(){
returncodesieze;
}
publicvoidsetCodesieze(longcodesieze){
this.codesieze=codesieze;
}
publicAppInfo(){}
publicStringgetAppLabel(){
returnappLabel;
}
publicvoidsetAppLabel(StringappName){
this.appLabel=appName;
}
publicDrawablegetAppIcon(){
returnappIcon;
}
publicvoidsetAppIcon(DrawableappIcon){
this.appIcon=appIcon;
}
publicIntentgetIntent(){
returnintent;
}
publicvoidsetIntent(Intentintent){
this.intent=intent;
}
publicStringgetPkgName(){
returnpkgName;
}
publicvoidsetPkgName(StringpkgName){
this.pkgName=pkgName;
}
}
自定义的类
packagecom.qin.appsize;
importjava.util.List;
importandroid.content.Context;
importandroid.view.LayoutInflater;
importandroid.view.View;
importandroid.view.ViewGroup;
importandroid.widget.BaseAdapter;
importandroid.widget.ImageView;
importandroid.widget.TextView;
//自定义适配器类,提供给listView的自定义view
publicclassBrowseApplicationInfoAdapterextendsBaseAdapter{
privateList<AppInfo>mlistAppInfo=null;
LayoutInflaterinfater=null;
publicBrowseApplicationInfoAdapter(Contextcontext,List<AppInfo>apps){
infater=(LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
mlistAppInfo=apps;
}
@Override
publicintgetCount(){
//TODOAuto-generatedmethodstub
System.out.println("size"+mlistAppInfo.size());
returnmlistAppInfo.size();
}
@Override
publicObjectgetItem(intposition){
//TODOAuto-generatedmethodstub
returnmlistAppInfo.get(position);
}
@Override
publiclonggetItemId(intposition){
//TODOAuto-generatedmethodstub
return0;
}
@Override
publicViewgetView(intposition,Viewconvertview,ViewGrouparg2){
System.out.println("getViewat"+position);
Viewview=null;
ViewHolderholder=null;
if(convertview==null||convertview.getTag()==null){
view=infater.inflate(R.layout.browse_app_item,null);
holder=newViewHolder(view);
view.setTag(holder);
}
else{
view=convertview;
holder=(ViewHolder)convertview.getTag();
}
AppInfoappInfo=(AppInfo)getItem(position);
holder.appIcon.setImageDrawable(appInfo.getAppIcon());
holder.tvAppLabel.setText(appInfo.getAppLabel());
holder.tvPkgName.setText(appInfo.getPkgName());
returnview;
}
classViewHolder{
ImageViewappIcon;
TextViewtvAppLabel;
TextViewtvPkgName;
publicViewHolder(Viewview){
this.appIcon=(ImageView)view.findViewById(R.id.imgApp);
this.tvAppLabel=(TextView)view.findViewById(R.id.tvAppLabel);
this.tvPkgName=(TextView)view.findViewById(R.id.tvPkgName);
}
}
}
主类
packagecom.qin.appsize;
importjava.lang.reflect.Method;
importjava.util.ArrayList;
importjava.util.Collections;
importjava.util.List;
importcom.qin.appsize.AppInfo;
importandroid.app.Activity;
importandroid.app.AlertDialog;
importandroid.content.ComponentName;
importandroid.content.Context;
importandroid.content.DialogInterface;
importandroid.content.Intent;
importandroid.content.pm.IPackageStatsObserver;
importandroid.content.pm.PackageManager;
importandroid.content.pm.PackageStats;
importandroid.content.pm.ResolveInfo;
importandroid.graphics.drawable.Drawable;
importandroid.os.Bundle;
importandroid.os.RemoteException;
importandroid.text.format.Formatter;
importandroid.util.Log;
importandroid.view.LayoutInflater;
importandroid.view.View;
importandroid.widget.AdapterView;
importandroid.widget.ListView;
importandroid.widget.TextView;
importandroid.widget.AdapterView.OnItemClickListener;
publicclassMainActivityextendsActivityimplementsOnItemClickListener{
privatestaticStringTAG="APP_SIZE";
privateListViewlistview=null;
privateList<AppInfo>mlistAppInfo=null;
LayoutInflaterinfater=null;
//全局变量,保存当前查询包得信息
privatelongcachesize;//缓存大小
privatelongdatasize;//数据大小
privatelongcodesize;//应用程序大小
privatelongtotalsize;//总大小
@Override
publicvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.browse_app_list);
listview=(ListView)findViewById(R.id.listviewApp);
mlistAppInfo=newArrayList<AppInfo>();
queryAppInfo();//查询所有应用程序信息
BrowseApplicationInfoAdapterbrowseAppAdapter=newBrowseApplicationInfoAdapter(
this,mlistAppInfo);
listview.setAdapter(browseAppAdapter);
listview.setOnItemClickListener(this);
}
//点击弹出对话框,显示该包得大小
publicvoidonItemClick(AdapterView<?>arg0,Viewview,intposition,longarg3){
//更新显示当前包得大小信息
try{
queryPacakgeSize(mlistAppInfo.get(position).getPkgName());
}catch(Exceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
infater=(LayoutInflater)MainActivity.this.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
Viewdialog=infater.inflate(R.layout.dialog_app_size,null);
TextViewtvcachesize=(TextView)dialog.findViewById(R.id.tvcachesize);//缓存大小
TextViewtvdatasize=(TextView)dialog.findViewById(R.id.tvdatasize);//数据大小
TextViewtvcodesize=(TextView)dialog.findViewById(R.id.tvcodesize);//应用程序大小
TextViewtvtotalsize=(TextView)dialog.findViewById(R.id.tvtotalsize);//总大小
//类型转换并赋值
tvcachesize.setText(formateFileSize(cachesize));
tvdatasize.setText(formateFileSize(datasize));
tvcodesize.setText(formateFileSize(codesize));
tvtotalsize.setText(formateFileSize(totalsize));
//显示自定义对话框
AlertDialog.Builderbuilder=newAlertDialog.Builder(MainActivity.this);
builder.setView(dialog);
builder.setTitle(mlistAppInfo.get(position).getAppLabel()+"的大小信息为:");
builder.setPositiveButton("确定",newDialogInterface.OnClickListener(){
@Override
publicvoidonClick(DialogInterfacedialog,intwhich){
//TODOAuto-generatedmethodstub
dialog.cancel();//取消显示对话框
}
});
builder.create().show();
}
publicvoidqueryPacakgeSize(StringpkgName)throwsException{
if(pkgName!=null){
//使用放射机制得到PackageManager类的隐藏函数getPackageSizeInfo
PackageManagerpm=getPackageManager();//得到pm对象
try{
//通过反射机制获得该隐藏函数
MethodgetPackageSizeInfo=pm.getClass().getDeclaredMethod("getPackageSizeInfo",String.class,IPackageStatsObserver.class);
//调用该函数,并且给其分配参数,待调用流程完成后会回调PkgSizeObserver类的函数
getPackageSizeInfo.invoke(pm,pkgName,newPkgSizeObserver());
}
catch(Exceptionex){
Log.e(TAG,"NoSuchMethodException");
ex.printStackTrace();
throwex;//抛出异常
}
}
}
//aidl文件形成的Bindler机制服务类
publicclassPkgSizeObserverextendsIPackageStatsObserver.Stub{
/***回调函数,
*@parampStatus,返回数据封装在PackageStats对象中
*@paramsucceeded代表回调成功
*/
@Override
publicvoidonGetStatsCompleted(PackageStatspStats,booleansucceeded)
throwsRemoteException{
//TODOAuto-generatedmethodstub
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)
privateStringformateFileSize(longsize){
returnFormatter.formatFileSize(MainActivity.this,size);
}
//获得所有启动Activity的信息,类似于Launch界面
publicvoidqueryAppInfo(){
PackageManagerpm=this.getPackageManager();//获得PackageManager对象
IntentmainIntent=newIntent(Intent.ACTION_MAIN,null);
mainIntent.addCategory(Intent.CATEGORY_LAUNCHER);
//通过查询,获得所有ResolveInfo对象.
List<ResolveInfo>resolveInfos=pm.queryIntentActivities(mainIntent,0);
//调用系统排序,根据name排序
//该排序很重要,否则只能显示系统应用,而不能列出第三方应用程序
Collections.sort(resolveInfos,newResolveInfo.DisplayNameComparator(pm));
if(mlistAppInfo!=null){
mlistAppInfo.clear();
for(ResolveInforeInfo:resolveInfos){
StringactivityName=reInfo.activityInfo.name;//获得该应用程序的启动Activity的name
StringpkgName=reInfo.activityInfo.packageName;//获得应用程序的包名
StringappLabel=(String)reInfo.loadLabel(pm);//获得应用程序的Label
Drawableicon=reInfo.loadIcon(pm);//获得应用程序图标
//为应用程序的启动Activity准备Intent
IntentlaunchIntent=newIntent();
launchIntent.setComponent(newComponentName(pkgName,activityName));
//创建一个AppInfo对象,并赋值
AppInfoappInfo=newAppInfo();
appInfo.setAppLabel(appLabel);
appInfo.setPkgName(pkgName);
appInfo.setAppIcon(icon);
appInfo.setIntent(launchIntent);
mlistAppInfo.add(appInfo);//添加至列表中
}
}
}
}
以上所述是小编给大家介绍的Android获取应用程序大小和缓存的实例代码,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对毛票票网站的支持!