Android彻底清除APP数据 Android彻底清除APP数据的两种方案总结
pumpkin的玄学 人气:2想了解Android彻底清除APP数据的两种方案总结的相关内容吗,pumpkin的玄学在本文为您仔细讲解Android彻底清除APP数据的相关知识和一些Code实例,欢迎阅读和指正,我们先划重点:android清除app数据,清除手机app数据,安卓清除数据,下面大家一起来学习吧。
用途
用于APP内部的重置功能实现。
方案一:利用命令行pm clear 包名,系统级别清除App数据
优点
和任务管理器里面清除所有数据的操作一致,会删除所有的APP数据。重新进入APP还需重新申请权限。
缺点
系统会直接杀掉APP进程,无法进行拉起APP的操作。
代码
public static Process clearAppUserData(String packageName) { Process p = execRuntimeProcess("pm clear " + packageName); return p; } public static Process execRuntimeProcess(String commond) { Process p = null; try { p = Runtime.getRuntime().exec(commond); } catch (IOException e) { e.printStackTrace(); } return p; }
方案二:手动删除内部储存和外部储存
优点
由自身控制,可以重新拉起APP。
缺点
1.没有系统级的清除那么彻底,比如重新拉起后不需要重新申请权限。当然数据库,SharePreferences相关的通通都会删掉的
2.因为数据库文件被删除,所以重新拉起启动页时需要删除当前进程,此时会黑屏一下。
代码
注意:说明一点下面代码中的ApplicationManager.getApplication()其实是获取了当前app的Application对象,也可以替换成context。
public void use(){ //使用 clearPublic(); clearPublic(); restartApp(); } public static void restartApp() { Activity activity = getActivity(); final Intent intent = activity.getPackageManager().getLaunchIntentForPackage(activity.getPackageName()); if (intent != null) { intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); activity.startActivity(intent); } //杀掉以前进程 android.os.Process.killProcess(android.os.Process.myPid()); } /** * 清空公有目录 */ public static void clearPublic() { if (ApplicationManager.getApplication() == null) { throw new RuntimeException("App no init"); } String publicFilePath = Environment.getExternalStorageDirectory().getPath() + "/" + getPackageInfo().packageName; File dir = new File(publicFilePath); File[] files = dir.listFiles(); if (null != files) { for (File file : files) { deleteFolder(file.getAbsolutePath()); } } } /** * 清空私有目录 */ public static void clearPrivate() { if (ApplicationManager.getApplication() == null) { throw new RuntimeException("App no init"); } //清空文件夹 File dir = new File(ApplicationManager.getApplication().getFilesDir().getParent()); File[] files = dir.listFiles(); if (null != files) { for (File file : files) { if (!file.getName().contains("lib")) { deleteFolder(file.getAbsolutePath()); } } } } /** * 删除指定文件 */ private static boolean deleteDirectory(String filePath) { boolean flag = false; if (!filePath.endsWith(File.separator)) { filePath = filePath + File.separator; } File dirFile = new File(filePath); if (!dirFile.exists() || !dirFile.isDirectory()) { return false; } flag = true; File[] files = dirFile.listFiles(); for (File file : files) { if (file.isFile()) { flag = deleteSingleFile(file.getAbsolutePath()); if (!flag) { break; } } else { flag = deleteDirectory(file.getAbsolutePath()); if (!flag) { break; } } } if (!flag) { return false; } return dirFile.delete(); } /** * 删除单个文件 * * @param filePath 被删除文件的文件名 * @return 文件删除成功返回true,否则返回false */ private static boolean deleteSingleFile(String filePath) { File file = new File(filePath); if (file.isFile() && file.exists()) { return file.delete(); } return false; } /** * 根据路径删除指定的目录或文件,无论存在与否 */ private static boolean deleteFolder(String filePath) { File file = new File(filePath); if (!file.exists()) { return false; } else { if (file.isFile()) { return deleteSingleFile(filePath); } else { return deleteDirectory(filePath); } } } /** * 获取包信息 */ private static PackageInfo getPackageInfo() { PackageManager packageManager = ApplicationManager.getApplication().getPackageManager(); PackageInfo packInfo = null; try { packInfo = packageManager.getPackageInfo(ApplicationManager.getApplication().getPackageName(), 0); } catch (PackageManager.NameNotFoundException e) { e.printStackTrace(); } return packInfo; }
总结
加载全部内容