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获取应用程序大小和缓存的实例代码,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对毛票票网站的支持!