一、问题描述
最近在安卓项目上做了一个对接第三方大学一卡通平台的账号绑定功能,大概就是先跳转到第三方大学一卡通网页,输入账号以及密码校验账号是否存在,再把校验结果返回到安卓设备上。
中间出现了一个蛮难搞的问题:首次绑定账号会跳转到第三方大学一卡通网页,在解绑账号后重新绑定,跳转界面时就不需要输入账号密码,直接会跳到结果返回安卓设备这一步。
这样就造成了学生如果绑错帐号了,无法重新绑定的问题。初步判断应该是第三方页面缓存所导致的,但是通过清除getCacheDir
缓存的方式无法解决,当时决定如果出现需要重新绑定的情况,就通过卸载重装解决。
二、初步解决
经过今天重试,发现通过安卓应用管理中的“清除用户数据”可以达到不删除应用并清除第三方页面缓存的目的(一定不是最优解,但是目前确实没有更好的方法),尝试了包括getCacheDir
、getFilesDir
、getExternalCacheDir
、getExternalFilesDir
等等各种缓存的清除,都无法实现。最终使用了执行安卓的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();
}
三、总结
目前虽然能够解决第三方网页的问题,虽然需要把用户数据全部清除,但是总是比卸载后重新安装要方便不少,后续还是会关注这一部分的代码并及时更新,如果您有更好的解决方式欢迎在评论区留言交流。