Android App清除全部数据接口

  • Post author:
  • Post category:其他



大家在进行Android开发的时候肯定都遇到过需要编写清理内存情况,所以下面这篇文章主要给大家介绍了关于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;
}

此处packageName如果不清楚可以对应在手机文件中查找android -- data 中查看  一般以com.xxx.xxxx格式



方案二:手动删除内部储存和外部储存


优点

由自身控制,可以重新拉起APP。


缺点

1.没有系统级的清除那么彻底,比如重新拉起后不需要重新申请权限。当然数据库,SharePreferences相关的通通都会删掉的

2.因为数据库文件被删除,所以重新拉起启动页时需要删除当前进程,此时会黑屏一下(也可以通过具体的调用接口的修改来优化,对于此方法只建议在针对指定文件或文件夹使用)。

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;
 }
 注意:说明一点下面代码中的ApplicationManager.getApplication()其实是获取了当前app的Application对象,也可以替换成context。对于context可以理解为创建类的实例对象,避免出错



版权声明:本文为loveryunz原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。