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;

}

相关推荐

一垄地等于多少亩
数字365吉凶

一垄地等于多少亩

🎯 09-29 💯 129