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数据内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

时间: 2021-11-18

Android APP瘦身(清除工程中没用到的资源)详解

清除Android工程中没用到的资源 项目需求一改再改,UI一调再调,结果就是项目中一堆已经用不到但却没有清理的垃圾资源,不说工程大小问题,对新进入项目的人或看其他模块的代码的人来说,这些没清理的资源可能也可能会带来困扰,所以最好还是清理掉这些垃圾,对于一个稍微大一点的工程来说,手工清理明显是不现实的,这就需要一个方法做这些事情. 清理资源文件 要清理没用的资源,首要的工作当然是找到他们,我们知道Anroid SDK中有一个工具叫lint,可以帮助我们查看工程中存在的问题,其中有一项功能就是查找

Android 中API之Drawable资源详解及简单实例

Android 中API之Drawable资源 1.最常用的StateListDrawable 说StateListDrawable,很多Android猿可能感到不太熟悉,不过如果说selector选择器,肯定都会恍然大悟,不错,这两个东西就是同一个~~ 它的用途之广,每个app必用,下面就写一个demo,来简要说一下用法. 比如一个登陆界面,它的输入框在获取焦点时需要更改背景,登陆按钮在输入框中有内容时,则更改背景颜色,这时候用selector选择器,那就方便多了,效果如下: EditText

Android Studio 4.0 新功能中的Live Layout Inspector详解

最近 Android Studio 4.0 稳定版本正式发布,其中一个重要升级就是新版的Layout Inspector 旧版的Layout Inspector 4.0 之前我们通过Tools -> Android -> Layout Inspector 可以对当前进程现实中画面进行分析,获取视图的Hierarchy以及Property信息 Live Layout Inspector 4.0 通过同样的菜单可以打开新版的 Layout Inspector 运行APP后,选择当前进程,可以看到当

Android、iOS和Windows Phone中的推送技术详解

推送并不是什么新技术,这种技术在互联网时代就已经很流行了.只是随着进入移动互联网时代,推送技术显得更加重要.因为在智能手机中,推送从某种程度上,可以取代使用多年的短信,而且与短信相比,还可以向用户展示更多的信息(如图像.表格.声音等). 推送技术的实现通常会使用服务端向客户端推送消息的方式.也就是说客户端通过用户名.Key等ID注册到服务端后,在服务端就可以将消息向所有活动的客户端发送. 实际上,在很多移动操作系统中,官方都为其提供了推送方案,例如,Google的云推送.IOS.Windows

android如何获取view在布局中的高度与宽度详解

前言 可能很多情况下,我们都会有在activity中获取view 的尺寸大小(宽度和高度)的需求.面对这种情况,很多同学立马反应:这么简单的问题,还用你说?你是不是傻..然后立马写下getWidth().getHeight()等方法,洋洋得意的就走了.然而事实就是这样的吗?实践证明,我们这样是获取不到View的宽度和高度大小的. 当我们在 onCreate() 方法中获取某个 View 组件的宽度和高度,直接调用 getWidth().getHeight().getMeasuredWidth()

Android清除工程中无用资源文件的两种方法

一.调用Android lint命令查找出没有用到的资源,并生成一个清单列表: 命令:lint –check "UnusedResources" [project_path] > result.txt 执行完之后会生成一个清单文件,内容如下: 二.使用代码自动删除无用的文件: public class DelAction { public static void main(String[] args) throws IOException { String projectPath

Android 中读取Excel文件实例详解

Android 中读取Excel文件实例详解 最近有个需求需要在app内置数据,新来的产品扔给了我两个Excel表格就不管了(两个表格格式还不统一...),于是通过度娘等方法找到了Android中读取Excel表格文件的一种方法,记录一下. 闲话一下Excel中工作簿和工作表的区别: 工作簿中包含有工作表.工作簿可以由一张或多张工作表组成,一个工作簿就是一个EXCEL表格文件. 好了,开始读取表格文件吧. 前提 首先,我们假设需要读取的表格文件名字为test.xls, 位于assets根目录下.

Android中XUtils3框架使用方法详解(一)

xUtils简介 xUtils 包含了很多实用的android工具. xUtils 支持大文件上传,更全面的http请求协议支持(10种谓词),拥有更加灵活的ORM,更多的事件注解支持且不受混淆影响... xUitls 最低兼容android 2.2 (api level 8) 今天给大家带来XUtils3的基本介绍,本文章的案例都是基于XUtils3的API语法进行的演示.相信大家对这个框架也都了解过, 下面简单介绍下XUtils3的一些基本知识. XUtils3一共有4大功能:注解模块,网络

Android 开发中使用Linux Shell实例详解

Android 开发中使用Linux Shell实例详解 引言 Android系统是基于Linux内核运行的,而做为一名Linux粉,不在Android上面运行一下Linux Shell怎么行呢? 最近发现了一个很好的Android Shell工具代码,在这里分享一下. Shell核心代码 import java.io.BufferedReader; import java.io.DataOutputStream; import java.io.IOException; import java.

Android 中 Tweened animation的实例详解

Android 中 Tweened animation的实例详解 Tweened animation有四种类型,下面主要介绍Scale类型. 运行效果如下: Android SDK提供了2种方法:直接从XML资源中读取Animation,使用Animation子类的构造函数来初始化Animation对象,第二种方法在看了Android SDK中各个类的说明就知道如何使用了,下面简要说明从XML资源中读取Animation.XML资源中的动画文件animation.xml内容为: <?xml ve