Android一键清除其他应用缓存数据,有没有什么好方法?

想做个功能,清除一个应用下面的所有数据,比如sharedPreference和数据库等等。请问大家有没有什么想法呢?



-----------------------------------------  分割线 , 因为下面是解决方法 ---------------------------------------------------------------------------------------

如果一个应用想去清除其他应用的缓存数据,今天找了个方法,如下:
1. 得到ActivityManager对象
因为ActivityManager.java有个方法clearApplicationUserData(),这个方法就是用来清除其他应用的数据的
复制内容到剪贴板
代码:
/**
     * @hide
     */
    public boolean clearApplicationUserData(String packageName, IPackageDataObserver observer) {
        try {
            return ActivityManagerNative.getDefault().clearApplicationUserData(packageName, 
                    observer, Binder.getOrigCallingUser());
        } catch (RemoteException e) {
            return false;
        }
    }
得到ActivityManager对象:
复制内容到剪贴板
代码:
ActivityManager am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
2. 通过反射调用am.clearApplicationUserData()方法
看到这里,大家肯定会觉得这个东西有点恐怖,因为随便一个应该就把别人应用程序的缓存清除了,那是多么可怕的事情!
所以,google就把这个方法设置成隐藏的,如上@hide, 也就是sdk开发,是调用不到这个方法的。那么我们怎么调用呢?嗯,用反射。。。如:
复制内容到剪贴板
代码:
for (int i = 0; i < methods.length; i++) {
                    Log.d("Sandy", "i: " + i + " method name: " + methods);
                    if ("clearApplicationUserData".equals(methods.getName())){  
                        try {
                            methods.invoke(am, "com.android.providers.contacts", new ClearUserDataObserver());
                        } catch (Exception e) {
                            Log.d("Sandy", "", e);
                        } 
                    }
                }
复制内容到剪贴板
代码:
class ClearUserDataObserver extends IPackageDataObserver.Stub {
           public void onRemoveCompleted(final String packageName, final boolean succeeded) {
//               final Message msg = mHandler.obtainMessage(CLEAR_USER_DATA);
//               msg.arg1 = succeeded?OP_SUCCESSFUL:OP_FAILED;
//               mHandler.sendMessage(msg);
            }
        }
首先拿到am对象的所有方法,然后找到clearApplicationUserData方法,再执行这个方法。我这里要清除的是手机上所有的联系人记录信息("com.android.providers.contacts")。

3. 设置android.permission.CLEAR_APP_USER_DATA权限
嗯,google认为单单把clearApplicationUserData设置成@hide还不够安全,于是它要求执行clearApplicationUserData方法还需要应用具有android.permission.CLEAR_APP_USER_DATA权限。
在AndroidManifest.xml文件里面配置这个权限,如下:
复制内容到剪贴板
代码:
<uses-permission android:name="android.permission.CLEAR_APP_USER_DATA" />
4.  设置应用程序的系统进程权限
是不是这样就ok了呢?还不是的。。 ^_^, 我们的应用程序必须具有系统进程权限才可以执行这个操作,怎么办呢?在AndroidManifest.xml里面配置android:sharedUserId,如:
复制内容到剪贴板
代码:
android:sharedUserId="android.uid.system"
5.  编写Android.mk文件
修改Android.mk文件,加入LOCAL_CERTIFICATE := platform这一行, 这一行的意思是调用系统平台的签名

6.  用mm命令来编译我们的应用程序,这样,我们的应用程序就可以清除联系人的数据了。

这种方法的缺陷:
1.  由于调用LOCAL_CERTIFICATE := platform来编译应用程序,所以我们的应用程序就和系统签名绑定在一起了,就是基本上这个应用程序只能在你的系统上进行安装,别人的手机是装不了的。。这个也是为了安全考虑。
不然别人做个应用程序,然后啪啪啪就把你的应用程序的数据清空了,那真的是可怕的事情了。。

下面是一个链接,大家可以参考:
http://elsila.blog.163.com/blog/static/173197158201101472354986/

写的很匆忙,大家将就着看吧。。。
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值