... [复制链接] 发表于 2013-5-13 10:41 | 来自 51CTO网页 [只看他] 楼主 想做个功能,清除一个应用下面的所有数据,比如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/
写的很匆忙,大家将就着看吧。。。
本帖最近评分记录
- 四海轩 无忧币 +20 精典原创 2013-5-15 12:42
本帖最后由 rongwei84n 于 2013-5-13 17:10 编辑 更多1 楼主关注
- 在网络环境中下载读取一个文件urlConnection.getInputStream报错!
- Android自动接听&挂断电话(包含怎么应对4.1以上版本的权限检查)
- android-serialport-api组建起来 运行问题
- 转给初学者:Android的版本和API的对应关系
- 问题请教
- Android发送HTTP请求的两个方式的区别
版主推荐
- 请大神们帮帮忙,看一下哪儿错了,总是setOnClickListener报错
- Android Activity定制需要的Title
- AIDL介绍和实例讲解
- 【分享与求教】Android-Apk实现静默安装
- 【求破】ListView的item无法点击,按钮可以点击
- 在Service如何保存数据?
51CTO学院300课程免费在线看 | 下载年末活动送豪礼 | 工信部弱电项目经理资格认证 |
|
rongwei84n 版主 帖子 4231 精华 0 无忧币 7650
|
发表于 2013-5-13 17:03 | 来自 51CTO网页 [只看他] 沙发 终于解决了。。 ;P1 ;P1
<strong>欢迎来到Sandy安卓应用开发视频讲解 http://down.51cto.com/473181/up <strong> 51CTO学院300课程免费在线看 | 下载年末活动送豪礼 | 工信部弱电项目经理资格认证 |
|
rongwei84n 版主 帖子 4231 精华 0 无忧币 7650
|
发表于 2013-5-14 09:42 | 来自 51CTO网页 [只看他] 板凳 其实这个功能也是蛮不错的,和setting里面的应用管理有点像。。 ;P1
<strong>欢迎来到Sandy安卓应用开发视频讲解 http://down.51cto.com/473181/up <strong> 51CTO学院300课程免费在线看 | 下载年末活动送豪礼 | 工信部弱电项目经理资格认证 |
|
四海轩 版主 帖子 547 精华 0 无忧币 4964
|
发表于 2013-5-15 12:41 | 来自 51CTO网页 [只看他] 地板 引用:
原帖由 rongwei84n 于 2013-5-13 10:41 发表
想做个功能,清除一个应用下面的所有数据,比如sharedPreference和数据库等等。请问大家有没有什么想法呢?
----------------------------------------- 分割线 , 因为下面是解决方法 -------------------------------- ...
我也碰到过需要调用>
51CTO学院300课程免费在线看 | 下载年末活动送豪礼 | 工信部弱电项目经理资格认证 |
|
rongwei84n 版主 帖子 4231 精华 0 无忧币 7650
|
发表于 2013-5-15 13:22 | 来自 51CTO网页 [只看他] 5# 引用:
原帖由 四海轩 于 2013-5-15 12:41 发表
我也碰到过需要调用 sdk中 隐藏的接口,不知道怎弄,原来可以这样操作!
嗯~~, 可以用反射。。 其实反射真的用途挺广的。特别是一些框架,比如struts之类的。大量使用反射来实例化程序员配置在xml文件里面的类。 :lol1
<strong>欢迎来到Sandy安卓应用开发视频讲解 http://down.51cto.com/473181/up <strong> 51CTO学院300课程免费在线看 | 下载年末活动送豪礼 | 工信部弱电项目经理资格认证 |
|
Kyson 新新人类 帖子 1 精华 0 无忧币 12
|
发表于 2013-7-12 17:24 | 来自 51CTO网页 [只看他] 6# LZ啊,如果我要不绑定系统签名和应用怎么搞?360安全卫士什么的不是可以一键清除缓存的嘛?LZ有思路没?
|
|
rongwei84n 版主 帖子 4231 精华 0 无忧币 7650
|
发表于 2013-7-12 17:34 | 来自 51CTO网页 [只看他] 7# 引用:
原帖由 Kyson 于 2013-7-12 17:24 发表
LZ啊,如果我要不绑定系统签名和应用怎么搞?360安全卫士什么的不是可以一键清除缓存的嘛?LZ有思路没?
如果不用系统签名的话, 要root权限的,也就是两个方面 1。 你的手机是root过的 2. 360得到你的授权可以请求到root权限。。 |
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)