在 Android 系统级应用开发中,有的同学可能会需要用到清空某个应用数据的方法。我翻阅了蛮多资料也没找到有用的方法,所以决定直接扒源码!在此做个小总结。总结不易,还有现成方法提供,所以粉丝可见不过分吧(doge)!
注意,以下讲到的大部分方法都基于 Android 源码(版本:Android 13,API 33),且都基于系统级应用,非系统级应用可能不适用哦!
1、源码位置
如果不想知道怎么找到的,可以直接跳转到第 2 节。
在我花费了七七四十九秒后,可算让我找到了源码的位置,如图 1-1 所示。
找到了清除应用数据的方法源码的位置,继续扒,往下看,可以看到如图 1-2 所示的变量定义,就更能确定我们没找错位置!
再继续往下扒!我们知道清除数据会有个弹窗提示,那我们是不是可以找弹窗呢? 如图 1-3所示,搜索关键字后,看见 “// Clear user data here”。没错!找到了!方法就是 initiateClearUserData();
再找到这个方法,如图 1-4 所示,这就是原生设置中,用于清除某个应用的数据的方法了。
2、方法的使用
找到方法了,但是看见里面有那么多不熟悉的方法和对象,而且复制进项目里一堆的报错,是不是手足无措!别慌,其实关键的代码方法只是一部分而已。
查看图 1-4 可以看出来,关键的类只要是:ActivityManager (所以熟悉 AM 真的很有必要!)的 clearApplicationUserData 方法,通过将应用的包名和 ClearUserDataObserver 对象传入到方法里,即可成功清除该应用的数据。
基于此,下面放上本人总结后编写的代码,导入对应的包后,可直接复制使用(点个赞吧~):
private ClearUserDataObserver mClearDataObserver;
private ActivityManager activityManager;
/**
* 清除应用数据
* @param context
* @param pkgName 要清除数据的应用包名
* @return true 清除成功
* false 清除失败
* @Author @还能再睡会儿
* */
private boolean clearData(Context context, String pkgName) {
// 异常数据处理
if (context == null || pkgName.isEmpty()) return false;
Log.i("sukkk", "要删除应用数据的应用包名: " + pkgName);
// 确保对象不为空,且只创建一次
if (mClearDataObserver == null) mClearDataObserver = new ClearUserDataObserver();
if (activityManager == null) activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
try {
// 清除应用数据关键代码
return activityManager.clearApplicationUserData(pkgName, mClearDataObserver);
} catch (SecurityException e) {
Log.e("sukkk", "Failed to clear application user data: " + e);
}
return false;
}
// 定义一个类,继承IPackageDataObserver.Stub(因为是跨进程通信,需要使用.Stub),用于接收清除应用的结果
private class ClearUserDataObserver extends IPackageDataObserver.Stub {
public void onRemoveCompleted(final String packageName, final boolean succeeded) {
// 清除缓存后回调
Log.d("sukkk", "Clearing " + packageName + " application data completed! " + "Succeeded: " + succeeded);
}
}
使用方法也很简单,只需要调用方法,然后将 context 对象和需要清除应用数据的应用包名传过去即可:
if (clearData(mContext, packageName))
Toast.makeText(mContext, "清空数据完成!packageName: " + packageName, Toast.LENGTH_SHORT).show();
else Toast.makeText(mContext, "清空数据失败!packageName: " + packageName, Toast.LENGTH_SHORT).show();
至此,如何清除一个应用的数据讲完,请注意,以上方法都是基于系统级应用,不确保第三方应用能正常调用!
3、题外话:跳转到应用管理界面
如果想要实现长按某个应用就跳转到该应用的应用管理界面,只需要如下操作就可:
Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
// 可指定要打开的一个能用的包名,也可不指定包名
// intent.setPackage("com.android.settings");
intent.setData(Uri.parse("package:" + packageName));
mContext.startActivity(intent);
扒源码不易~ 希望对各位有用~ 不妨点小赞!❤️❤️❤️