Android 系统清空应用数据方法

        在 Android 系统级应用开发中,有的同学可能会需要用到清空某个应用数据的方法。我翻阅了蛮多资料也没找到有用的方法,所以决定直接扒源码!在此做个小总结。总结不易,还有现成方法提供,所以粉丝可见不过分吧(doge)!

        注意,以下讲到的大部分方法都基于 Android 源码(版本:Android 13,API 33),且都基于系统级应用,非系统级应用可能不适用哦!

1、源码位置

        如果不想知道怎么找到的,可以直接跳转到第 2 节。

        在我花费了七七四十九秒后,可算让我找到了源码的位置,如图 1-1 所示。

图1-1.源码位置

         找到了清除应用数据的方法源码的位置,继续扒,往下看,可以看到如图 1-2 所示的变量定义,就更能确定我们没找错位置!

图1-2.变量定义

        再继续往下扒!我们知道清除数据会有个弹窗提示,那我们是不是可以找弹窗呢? 如图 1-3所示,搜索关键字后,看见 “// Clear user data here”。没错!找到了!方法就是 initiateClearUserData();

图1-3.定位方法

        再找到这个方法,如图 1-4 所示,这就是原生设置中,用于清除某个应用的数据的方法了。

图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);

扒源码不易~ 希望对各位有用~ 不妨点小赞!❤️❤️❤️

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值