Android中應用程序清除data/data,清除cache,超詳細

yypo5211 8年前發布 | 42K 次閱讀 安卓開發 Android開發 移動開發

來自: http://www.cnblogs.com/rencm/p/5157114.html

清除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); }</pre>

    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); }</pre>

    然后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;
        }
    };
    

    };</pre>

    通過包名清除數據

    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 {
    
    }
    

    }</pre>

    清除完成回調

    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);
           }
        }
    }</pre> 
    

    獲取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);
    }
    

    };</pre>

    到此就OK~~~~~~~~

    </div>

 本文由用戶 yypo5211 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!