Android徹底清除APP數(shù)據(jù)的兩種方案總結(jié)
用途
用于APP內(nèi)部的重置功能實現(xiàn)。
方案一:利用命令行pm clear 包名,系統(tǒng)級別清除App數(shù)據(jù)
優(yōu)點(diǎn)
和任務(wù)管理器里面清除所有數(shù)據(jù)的操作一致,會刪除所有的APP數(shù)據(jù)。重新進(jìn)入APP還需重新申請權(quán)限。
缺點(diǎn)
系統(tǒng)會直接殺掉APP進(jìn)程,無法進(jìn)行拉起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;
}
方案二:手動刪除內(nèi)部儲存和外部儲存
優(yōu)點(diǎn)
由自身控制,可以重新拉起APP。
缺點(diǎn)
1.沒有系統(tǒng)級的清除那么徹底,比如重新拉起后不需要重新申請權(quán)限。當(dāng)然數(shù)據(jù)庫,SharePreferences相關(guān)的通通都會刪掉的
2.因為數(shù)據(jù)庫文件被刪除,所以重新拉起啟動頁時需要刪除當(dāng)前進(jìn)程,此時會黑屏一下。
代碼
注意:說明一點(diǎn)下面代碼中的ApplicationManager.getApplication()其實是獲取了當(dāng)前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);
}
//殺掉以前進(jìn)程
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;
}
/**
* 根據(jù)路徑刪除指定的目錄或文件,無論存在與否
*/
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;
}
總結(jié)
到此這篇關(guān)于Android徹底清除APP數(shù)據(jù)的兩種方案的文章就介紹到這了,更多相關(guān)Android徹底清除APP數(shù)據(jù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Android使用ViewFlipper和GestrueDetector共同實現(xiàn)滑屏效果實例
這篇文章主要介紹了Android使用ViewFlipper和GestrueDetector共同實現(xiàn)滑屏效果,結(jié)合完整實例形式分析了ViewFlipper和GestrueDetector控件實現(xiàn)滑屏功能的布局與相關(guān)操作技巧,需要的朋友可以參考下2017-02-02
Android開發(fā)ImageView圖片無法顯示解決過程
在Android中ImageView無法顯示加載的本地SDCard圖片:過程為先調(diào)用本地照相機(jī)程序攝像,然后將拍攝的圖片加載在ImageView中顯示,具體解決方法如下,感興趣的朋友可以參考下哈2013-06-06
Android開發(fā)中Launcher3常見默認(rèn)配置修改方法總結(jié)
這篇文章主要介紹了Android開發(fā)中Launcher3常見默認(rèn)配置修改方法,結(jié)合實例形式分析了Android Launcher3的功能與配置修改相關(guān)操作技巧,需要的朋友可以參考下2017-11-11
Android UI設(shè)計與開發(fā)之PopupWindow仿騰訊新聞底部彈出菜單
這篇文章主要為大家詳細(xì)介紹了Android UI設(shè)計與開發(fā)之PopupWindow仿騰訊新聞底部彈出菜單,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-08-08
Android自定義控件eBook實現(xiàn)翻書效果實例詳解
這篇文章主要介紹了Android自定義控件eBook實現(xiàn)翻書效果的方法,結(jié)合實例形式分析了Android自定義控件實現(xiàn)翻書效果的具體步驟與相關(guān)操作技巧,需要的朋友可以參考下2016-10-10
Android MVVM架構(gòu)實現(xiàn)RecyclerView列表詳解流程
MVVM是Model-View-ViewModel的簡寫。它本質(zhì)上就是MVC 的改進(jìn)版。MVVM 就是將其中的View 的狀態(tài)和行為抽象化,讓我們將視圖 UI 和業(yè)務(wù)邏輯分開2021-10-10
總結(jié)Android中多線程更新應(yīng)用的頁面信息的方式
這篇文章主要介紹了總結(jié)Android中多線程更新應(yīng)用的頁面信息的方式,文中共總結(jié)了runOnUiThread、Handler、AsyncTask異步以及View直接在UI線程中更新的方法,需要的朋友可以參考下2016-02-02
Android中的layout_gravity與gravity屬性詳解
layout_gravity和gravity是Android開發(fā)中用于控制視圖布局和對齊方式的兩個屬性,layout_gravity用于指定視圖在父容器中的對齊方式,而gravity用于指定視圖內(nèi)部內(nèi)容的對齊方式,本文介紹Android中的layout_gravity與gravity屬性,感興趣的朋友一起看看吧2025-03-03

