西部数码主机 | 阿里云主机| 虚拟主机 | 服务器 | 返回乐道官网

Android中应用程序清除data/data,清除cache

时间:2016-01-25 14:23来源:未知 作者:好模板 点击:
清除data,清除cache,其实在Android原生Setting里面有这个功能的。 需求是把这个功能做到自己的App里面,并计算出cache和data的size。 所以参考了一下Setting的源码。看如何实现该功能: 首先

清除data,清除cache,其实在Android原生Setting里面有这个功能的。

需求是把这个功能做到自己的App里面,并计算出cache和data的size。

所以参考了一下Setting的源码。看如何实现该功能:

首先需要写两个aidl去调用系统的清除以及获取size功能:

IPackageStatsObserver.aidl  -- 获取data以及cache的size

/*
**
** Copyright 2007, The Android Open Source Project
**
** Licensed under the Apache License, Version 2.0 (the "License");
** you may not use this file except in compliance with the License.
** You may obtain a copy of the License at
**
**     http://www.apache.org/licenses/LICENSE-2.0
**
** Unless required by applicable law or agreed to in writing, software
** distributed under the License is distributed on an "AS IS" BASIS,
** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
** See the License for the specific language governing permissions and
** limitations under the License.
*/

package android.content.pm;

import android.content.pm.PackageStats;
/**
 * API for package data change related callbacks from the Package Manager.
 * Some usage scenarios include deletion of cache directory, generate
 * statistics related to code, data, cache usage(TODO)
 * {@hide}
 */
oneway interface IPackageStatsObserver {
    
    void onGetStatsCompleted(in PackageStats pStats, boolean succeeded);
}

IPackageDataObserver.aidl -- 清除完成

/* 
 ** 
 ** Copyright 2007, The Android Open Source Project 
 ** 
 ** Licensed under the Apache License, Version 2.0 (the "License"); 
 ** you may not use this file except in compliance with the License. 
 ** You may obtain a copy of the License at 
 ** 
 **     http://www.apache.org/licenses/LICENSE-2.0 
 ** 
 ** Unless required by applicable law or agreed to in writing, software 
 ** distributed under the License is distributed on an "AS IS" BASIS, 
 ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
 ** See the License for the specific language governing permissions and 
 ** limitations under the License. 
 */ 
  
package android.content.pm; 
  
 /** 
  * API for package data change related callbacks from the Package Manager. 
  * Some usage scenarios include deletion of cache directory, generate 
  * statistics related to code, data, cache usage(TODO) 
  * {@hide} 
  */ 
 oneway interface IPackageDataObserver { 
     void onRemoveCompleted(in String packageName, boolean succeeded); 
 }

然后Java代码实现:

private Handler handler=new Handler(){
    public void handleMessage(android.os.Message msg) {
      switch (msg.what) {
      case Constant.Hanler.MSG_GET_DATASIZE:
        String size=Formatter.formatFileSize(AppDetialActivity.this, catcheSize);
        tv_catcheSize.setText(size);
        break;
      case Constant.Hanler.MSG_CLEAR_DATA_SUCCESS:
        String pkgname=(String) msg.obj;
        getSize(pkgname);
        break;
      default:
        break;
      }
    };
  };

通过包名清除数据

private ClearUserDataObserver mClearDataObserver;
  private void clearData(String packagename){
    if (mClearDataObserver == null) {
      mClearDataObserver = new ClearUserDataObserver();
    }
    ActivityManager am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
    boolean res = am.clearApplicationUserData(packageName,
        mClearDataObserver);
    if (!res) {
      // Clearing data failed for some obscure reason. Just log error for now
      Log.i(TAG, "Couldnt clear application user data for package:"
          + packageName);
      showToast("Clear failed");
    } else {
      
    }
  }

清除完成回调

class ClearUserDataObserver extends IPackageDataObserver.Stub {
         public void onRemoveCompleted(final String packageName, final boolean succeeded) {
      	   Logger.d(TAG, "packageName "+packageName +"   succeeded  "+succeeded);
      	   if(succeeded){
          	 Message msg=Message.obtain();
          	 msg.what=Constant.Hanler.MSG_CLEAR_DATA_SUCCESS;
          	 msg.obj=packageName;
          	 handler.sendMessage(msg);
             }
          }
      }

获取data,cache文件size

private void getSize(String packageName) {
    if (!Util.isNullStr(packageName)) {
      PackageManager pManager = getPackageManager();
      pManager.getPackageSizeInfo(packageName, statsObserver);
    }
  }

  IPackageStatsObserver statsObserver = new IPackageStatsObserver.Stub() {
    @Override
    public void onGetStatsCompleted(PackageStats pStats, boolean succeeded)
        throws RemoteException {
      // TODO Auto-generated method stub
      catcheSize = pStats.dataSize;
      handler.sendEmptyMessage(Constant.Hanler.MSG_GET_DATASIZE);
    }
  };

到此就OK

(责任编辑:好模板)
顶一下
(2)
100%
踩一下
(0)
0%
------分隔线----------------------------
栏目列表
热点内容