您现在的位置是:群英 > 开发技术 > 移动开发
Android中怎样实现完全清除APP数据
Admin发表于 2022-04-28 17:18:551296 次浏览
这篇文章给大家分享的是“Android中怎样实现完全清除APP数据”,文中的讲解内容简单清晰,对大家学习和理解有一定的参考价值和帮助,有这方面学习需要的朋友,接下来就跟随小编一起学习一下“Android中怎样实现完全清除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数据”的相关知识,感谢各位的阅读,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注群英网络,小编每天都会为大家更新不同的知识。

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。

相关信息推荐
2022-09-20 18:05:02 
摘要:这篇文章主要介绍了如何利用PHP读取Excel文件的记录,文中的示例代码讲解详细,对我们学习或工作有一定帮助,感兴趣的可以跟随小编了解一下
2022-05-16 17:52:42 
摘要:要让php能上传大文件,一般修改配置文件php.ini就可以,如下配置file_uploads = on ; //是否允许通过http上传文件的开关,默认为onupload_tmp_dir ; //文
2022-10-09 18:13:08 
摘要:这篇文章主要和大家详细介绍一下如何在Spring Security中自定义权限表达式,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
云活动
推荐内容
热门关键词
热门信息
群英网络助力开启安全的云计算之旅
立即注册,领取新人大礼包
  • 联系我们
  • 24小时售后:4006784567
  • 24小时TEL :0668-2555666
  • 售前咨询TEL:400-678-4567

  • 官方微信

    官方微信
Copyright  ©  QY  Network  Company  Ltd. All  Rights  Reserved. 2003-2019  群英网络  版权所有   茂名市群英网络有限公司
增值电信经营许可证 : B1.B2-20140078   粤ICP备09006778号
免费拨打  400-678-4567
免费拨打  400-678-4567 免费拨打 400-678-4567 或 0668-2555555
微信公众号
返回顶部
返回顶部 返回顶部