欢迎访问移动开发之家(rcyd.net),关注移动开发教程。移动开发之家  移动开发问答|  每日更新
页面位置 : > > > 内容正文

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

来源: 开发者 投稿于  被查看 38291 次 评论:261

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


目录
  • 用途
  • 方案一:利用命令行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数据内容请搜索3672js教程以前的文章或继续浏览下面的相关文章希望大家以后多多支持3672js教程!

    您可能感兴趣的文章:
    • Android APP瘦身(清除工程中没用到的资源)详解

    用户评论