Android 进程 缓存服务,Android获取应用程序大小和缓存的实例代码

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的自定义view

public class BrowseApplicationInfoAdapter extends BaseAdapter {

private List mlistAppInfo = null;

LayoutInflater infater = null;

public BrowseApplicationInfoAdapter(Context context, List 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 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();

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 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); // 添加至列表中

}

}

}

}

以上所述是小编给大家介绍的Android获取应用程序大小和缓存的实例代码,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值