【android】跳转外部页面登录状态无法清除问题初步解决(清除应用数据实现)

一、问题描述

最近在安卓项目上做了一个对接第三方大学一卡通平台的账号绑定功能,大概就是先跳转到第三方大学一卡通网页,输入账号以及密码校验账号是否存在,再把校验结果返回到安卓设备上。
中间出现了一个蛮难搞的问题:首次绑定账号会跳转到第三方大学一卡通网页,在解绑账号后重新绑定,跳转界面时就不需要输入账号密码,直接会跳到结果返回安卓设备这一步。
这样就造成了学生如果绑错帐号了,无法重新绑定的问题。初步判断应该是第三方页面缓存所导致的,但是通过清除getCacheDir缓存的方式无法解决,当时决定如果出现需要重新绑定的情况,就通过卸载重装解决。
第三方平台统一登录页面

二、初步解决

经过今天重试,发现通过安卓应用管理中的“清除用户数据”可以达到不删除应用并清除第三方页面缓存的目的(一定不是最优解,但是目前确实没有更好的方法),尝试了包括getCacheDirgetFilesDirgetExternalCacheDirgetExternalFilesDir等等各种缓存的清除,都无法实现。最终使用了执行安卓的pm clear + 应用包名称的方法实现,将该方法绑定至原有的“清除缓存”按钮上。
清除缓存按钮

三、代码展示

1 设置页面代码

⚠️注意:
因为执行pm clear + 应用包名称方法会关闭程序,所以需要输出提示并将代码延迟1000毫秒执行。

	/**
     * 清除缓存
     */
    private void cleanCache(){
        HUDToast("清除缓存中,正在退出程序");
        // 清除缓存
        SPUtils.getInstance().clear();
        DataCleanManager.clearAllCache(this);
        clearSubTextView.setText("");
        // 清除用户数据
        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                if (!DataCleanManager.clearUserData(getPackageName())) {
                    HUDToast("清除用户数据失败");
                }
            }
        }, 1000);
    }
2 工具类代码(DataCleanManager)

⚠️注意:
需要使用catch捕获IOException异常。

	/**
     * 清除用户数据
     *
     * @param packageName 应用包名称
     */
    public static boolean clearUserData(String packageName) {
        try {
            Runtime.getRuntime().exec("pm clear " + packageName);
        } catch (IOException error) {
            HYLOG.E("清除用户数据异常,错误信息:" + error);
            return false;
        }
        return true;
    }
3 其他代码(DataCleanManager)
	/**
     * 清除缓存
     */
    public static void clearAllCache(Context context) {
        deleteDir(context.getCacheDir());
        if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
            deleteDir(context.getExternalCacheDir());
        }
    }

    private static boolean deleteDir(File dir) {
        if (dir != null && dir.isDirectory()) {
            String[] children = dir.list();
            for (int i = 0; i < children.length; i++) {
                boolean success = deleteDir(new File(dir, children[i]));
                if (!success) {
                    return false;
                }
            }
        }
        return dir.delete();
    }

三、总结

目前虽然能够解决第三方网页的问题,虽然需要把用户数据全部清除,但是总是比卸载后重新安装要方便不少,后续还是会关注这一部分的代码并及时更新,如果您有更好的解决方式欢迎在评论区留言交流。

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

布熬夜了

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值