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

