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数据的两种方案的文章就介绍到这了,更多相关Android彻底清除APP数据内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
Android使用ViewFlipper和GestrueDetector共同实现滑屏效果实例
这篇文章主要介绍了Android使用ViewFlipper和GestrueDetector共同实现滑屏效果,结合完整实例形式分析了ViewFlipper和GestrueDetector控件实现滑屏功能的布局与相关操作技巧,需要的朋友可以参考下2017-02-02
Android开发中Launcher3常见默认配置修改方法总结
这篇文章主要介绍了Android开发中Launcher3常见默认配置修改方法,结合实例形式分析了Android Launcher3的功能与配置修改相关操作技巧,需要的朋友可以参考下2017-11-11
Android UI设计与开发之PopupWindow仿腾讯新闻底部弹出菜单
这篇文章主要为大家详细介绍了Android UI设计与开发之PopupWindow仿腾讯新闻底部弹出菜单,具有一定的参考价值,感兴趣的小伙伴们可以参考一下2017-08-08
Android MVVM架构实现RecyclerView列表详解流程
MVVM是Model-View-ViewModel的简写。它本质上就是MVC 的改进版。MVVM 就是将其中的View 的状态和行为抽象化,让我们将视图 UI 和业务逻辑分开2021-10-10
Android中的layout_gravity与gravity属性详解
layout_gravity和gravity是Android开发中用于控制视图布局和对齐方式的两个属性,layout_gravity用于指定视图在父容器中的对齐方式,而gravity用于指定视图内部内容的对齐方式,本文介绍Android中的layout_gravity与gravity属性,感兴趣的朋友一起看看吧2025-03-03


最新评论