Android 如何以编程方式计算已安装应用程序的所有缓存大小?
我只想用缓存大小显示所有已安装应用程序名称的列表。缓存大小必须与android设备中显示的本机设置应用程序相同 我可以列出所有已安装的应用程序pkg名称,但无法计算本机设置应用程序显示的相同缓存大小(我指的是在设置中清除缓存选项的位置)Android 如何以编程方式计算已安装应用程序的所有缓存大小?,android,caching,memory-management,Android,Caching,Memory Management,我只想用缓存大小显示所有已安装应用程序名称的列表。缓存大小必须与android设备中显示的本机设置应用程序相同 我可以列出所有已安装的应用程序pkg名称,但无法计算本机设置应用程序显示的相同缓存大小(我指的是在设置中清除缓存选项的位置) pkNames=getPackageManager().getInstalledPackages(0); ArrayAdapter=新的ArrayAdapter(此, android.R.layout.simple_list_item_1,pkNames); 最
pkNames=getPackageManager().getInstalledPackages(0);
ArrayAdapter=新的ArrayAdapter(此,
android.R.layout.simple_list_item_1,pkNames);
最终PackageManager pm=getPackageManager();
对于(int i=0;i将应用程序缓存文件夹定位到以下路径中的内存中
“/data/data/com.your.package.appname/cache”
计算磁盘上的应用程序缓存大小。要直接获取已安装应用程序的缓存大小,您无法获取。
使用时,我们无法直接获得有关已安装包大小的详细信息,因为抽象方法无法直接访问,因此使用时您可以调用它。如果将来方法名称更改或任何内容更改,则可能无法使用
您需要创建AIDL.AIDL&它应该在android.content.pm
包中,因为您不能直接访问它们
IPackageStatsObserver.aidl
package android.content.pm;
import android.content.pm.PackageStats;
oneway interface IPackageStatsObserver {
void onGetStatsCompleted(in android.content.pm.PackageStats pStats, boolean succeeded);
}
package android.content.pm;
parcelable PackageStats;
PackageStats.aidl
package android.content.pm;
import android.content.pm.PackageStats;
oneway interface IPackageStatsObserver {
void onGetStatsCompleted(in android.content.pm.PackageStats pStats, boolean succeeded);
}
package android.content.pm;
parcelable PackageStats;
IPackageStatsObserver.aidl和PackageStats.aidl都将其保存在android.content.pm
package中。
IDataStatus
public interface IDataStatus {
public void onStatusListner(String msg);
}
public class AppDetails {
Activity mActivity;
public ArrayList<PackageInfoStruct> res = new ArrayList<PackageInfoStruct>();
public ListView list;
public String app_labels[];
public AppDetails(Activity mActivity) {
this.mActivity = mActivity;
}
public ArrayList<PackageInfoStruct> getPackages() {
ArrayList<PackageInfoStruct> apps = getInstalledApps(false); /*
* false =
* no system
* packages
*/
final int max = apps.size();
for (int i = 0; i < max; i++) {
apps.get(i);
}
return apps;
}
private ArrayList<PackageInfoStruct> getInstalledApps(boolean getSysPackages) {
List<PackageInfo> packs = mActivity.getPackageManager()
.getInstalledPackages(0);
try {
app_labels = new String[packs.size()];
} catch (Exception e) {
Toast.makeText(mActivity.getApplicationContext(), e.getMessage(),
Toast.LENGTH_SHORT).show();
}
for (int i = 0; i < packs.size(); i++) {
PackageInfo p = packs.get(i);
if ((!getSysPackages) && (p.versionName == null)) {
continue;
}
PackageInfoStruct newInfo = new PackageInfoStruct();
newInfo.appname = p.applicationInfo.loadLabel(
mActivity.getPackageManager()).toString();
newInfo.pname = p.packageName;
newInfo.datadir = p.applicationInfo.dataDir;
newInfo.versionName = p.versionName;
newInfo.versionCode = p.versionCode;
newInfo.icon = p.applicationInfo.loadIcon(mActivity
.getPackageManager());
res.add(newInfo);
app_labels[i] = newInfo.appname;
}
return res;
}
class PackageInfoStruct {
String appname = "";
String pname = "";
String versionName = "";
int versionCode = 0;
Drawable icon;
String datadir = "";
}
}
活动
public class MyScreen extends Activity implements OnClickListener {
public static final int FETCH_PACKAGE_SIZE_COMPLETED = 100;
public static final int ALL_PACAGE_SIZE_COMPLETED = 200;
IDataStatus onIDataStatus;
TextView lbl_cache_size;
ProgressDialog pd;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
findViewById(R.id.btn_get_cacheSize).setOnClickListener(this);
lbl_cache_size = (TextView) findViewById(R.id.lbl_cache_size);
// clearCache();
}
private void showProgress(String message) {
pd = new ProgressDialog(this);
pd.setIcon(R.drawable.ic_launcher);
pd.setTitle("Please Wait...");
pd.setMessage(message);
pd.setCancelable(false);
pd.show();
}
long packageSize = 0, size = 0;
AppDetails cAppDetails;
public ArrayList<PackageInfoStruct> res;
private void getpackageSize() {
cAppDetails = new AppDetails(this);
res = cAppDetails.getPackages();
if (res == null)
return;
for (int m = 0; m < res.size(); m++) {
PackageManager pm = getPackageManager();
Method getPackageSizeInfo;
try {
getPackageSizeInfo = pm.getClass().getMethod(
"getPackageSizeInfo", String.class,
IPackageStatsObserver.class);
getPackageSizeInfo.invoke(pm, res.get(m).pname,
new cachePackState());
} catch (SecurityException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
handle.sendEmptyMessage(ALL_PACAGE_SIZE_COMPLETED);
Log.v("Total Cache Size", " " + packageSize);
}
private Handler handle = new Handler() {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case FETCH_PACKAGE_SIZE_COMPLETED:
if (packageSize > 0)
size = (packageSize / 1024000);
lbl_cache_size.setText("Cache Size : " + size + " MB");
break;
case ALL_PACAGE_SIZE_COMPLETED:
if (null != pd)
if (pd.isShowing())
pd.dismiss();
break;
default:
break;
}
}
};
private class cachePackState extends IPackageStatsObserver.Stub {
@Override
public void onGetStatsCompleted(PackageStats pStats, boolean succeeded)
throws RemoteException {
Log.d("Package Size", pStats.packageName + "");
Log.i("Cache Size", pStats.cacheSize + "");
Log.w("Data Size", pStats.dataSize + "");
packageSize = packageSize + pStats.cacheSize;
Log.v("Total Cache Size", " " + packageSize);
handle.sendEmptyMessage(FETCH_PACKAGE_SIZE_COMPLETED);
}
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn_get_cacheSize:
size = 0;
packageSize = 0;
showProgress("Calculating Cache Size..!!!");
/**
* You can also use async task
* */
new Thread(new Runnable() {
@Override
public void run() {
getpackageSize();
}
}).start();
break;
}
}
}
public类MyScreen扩展活动实现OnClickListener{
公共静态最终整数取数\包大小\完成=100;
公共静态最终整数所有包装尺寸完成=200;
伊达斯塔斯;
TextView lbl_缓存_大小;
进展性帕金森病;
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
findviewbyd(R.id.btn\u get\u cacheSize).setOnClickListener(this);
lbl\u cache\u size=(TextView)findViewById(R.id.lbl\u cache\u size);
//clearCache();
}
私有void showProgress(字符串消息){
pd=新进度对话框(本);
pd.setIcon(R.drawable.ic_发射器);
pd.setTitle(“请稍候…”);
设置消息(消息);
pd.可设置可取消(假);
pd.show();
}
长包装尺寸=0,尺寸=0;
AppDetails和AppDetails;
公共阵列列表;
私有void getpackageSize(){
cAppDetails=新的AppDetails(本);
res=cAppDetails.getPackages();
如果(res==null)
返回;
对于(int m=0;m0)
尺寸=(包装尺寸/1024000);
lbl_cache_size.setText(“缓存大小:+size+“MB”);
打破
案例所有包装尺寸完成:
if(null!=pd)
if(pd.isShowing())
pd.解散();
打破
违约:
打破
}
}
};
私有类cachePackState扩展了IPackageStatsObserver.Stub{
@凌驾
公共无效onGetStatsCompleted(PackageStats pStats,布尔成功)
抛出远程异常{
Log.d(“包大小”,pStats.packageName+”);
Log.i(“缓存大小”,pStats.cacheSize+);
Log.w(“数据大小”,pStats.dataSize+);
packageSize=packageSize+pStats.cacheSize;
Log.v(“总缓存大小”,“打包大小”);
handle.sendEmptyMessage(获取包大小完成);
}
}
@凌驾
公共void onClick(视图v){
开关(v.getId()){
案例R.id.btn\u获取\u缓存大小:
尺寸=0;
packageSize=0;
showProgress(“计算缓存大小..!!!”;
/**
*您还可以使用异步任务
* */
新线程(newrunnable()){
@凌驾
公开募捐{
getpackageSize();
}
}).start();
打破
}
}
}
AppDetails
public interface IDataStatus {
public void onStatusListner(String msg);
}
public class AppDetails {
Activity mActivity;
public ArrayList<PackageInfoStruct> res = new ArrayList<PackageInfoStruct>();
public ListView list;
public String app_labels[];
public AppDetails(Activity mActivity) {
this.mActivity = mActivity;
}
public ArrayList<PackageInfoStruct> getPackages() {
ArrayList<PackageInfoStruct> apps = getInstalledApps(false); /*
* false =
* no system
* packages
*/
final int max = apps.size();
for (int i = 0; i < max; i++) {
apps.get(i);
}
return apps;
}
private ArrayList<PackageInfoStruct> getInstalledApps(boolean getSysPackages) {
List<PackageInfo> packs = mActivity.getPackageManager()
.getInstalledPackages(0);
try {
app_labels = new String[packs.size()];
} catch (Exception e) {
Toast.makeText(mActivity.getApplicationContext(), e.getMessage(),
Toast.LENGTH_SHORT).show();
}
for (int i = 0; i < packs.size(); i++) {
PackageInfo p = packs.get(i);
if ((!getSysPackages) && (p.versionName == null)) {
continue;
}
PackageInfoStruct newInfo = new PackageInfoStruct();
newInfo.appname = p.applicationInfo.loadLabel(
mActivity.getPackageManager()).toString();
newInfo.pname = p.packageName;
newInfo.datadir = p.applicationInfo.dataDir;
newInfo.versionName = p.versionName;
newInfo.versionCode = p.versionCode;
newInfo.icon = p.applicationInfo.loadIcon(mActivity
.getPackageManager());
res.add(newInfo);
app_labels[i] = newInfo.appname;
}
return res;
}
class PackageInfoStruct {
String appname = "";
String pname = "";
String versionName = "";
int versionCode = 0;
Drawable icon;
String datadir = "";
}
}
公共类AppDetails{
活动能力;
public ArrayList res=new ArrayList();
公共列表视图列表;
公共字符串应用程序标签[];
公共应用程序详细信息(活动权限){
this.mActivity=mActivity;
}
公共ArrayList getPackages(){
ArrayList apps=getInstalledApps(false)/*
*假的=