Android彻底清除APP数据的两种方案总结

编辑: admin 分类: Android 发布时间: 2021-11-29 来源:互联网
目录
  • 用途
  • 方案一:利用命令行pm clear 包名,系统级别清除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;
        }
    

    总结

    到此这篇关于Android彻底清除APP数据的两种方案的文章就介绍到这了,更多相关Android彻底清除APP数据内容请搜索海外IDC网以前的文章或继续浏览下面的相关文章希望大家以后多多支持海外IDC网!

    【文章原创作者:http://www.yidunidc.com/st.html转发请说明出处】