• Android中应用程序清除data/data,清除cache,超详细


    清除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~~~~~~~~  

    本文为博主原创文章,转载请注明出处

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

  • 相关阅读:
    深入了解抽象类和接口
    关于Hibernate查询对象调用set方法自动同步到数据库解决方案
    【鸽子的迷信(一)】python导入由excel文件改后缀变成的csv文件出现乱码错误(ParserError:Error tokenizing data. C error:)
    《计算机操作系统》CH1操作系统引论思维导图整理
    IntelliJ IDEA创建一个Maven项目
    C++实验三
    小练习
    C++实验二
    C++的ch1&ch2的整理
    C++实验一
  • 原文地址:https://www.cnblogs.com/rencm/p/5157114.html
Copyright © 2020-2023  润新知