以编程方式清除应用程序数据

我希望以编程方式清除应用程序的数据。

应用程序的数据可能包含类似数据库、共享首选项、内部-外部文件或应用程序内创建的任何其他文件的内容。

我知道我们可以通过以下方式清除移动设备中的数据:

设置-> 应用程序-> 管理应用程序-> My _ application-> 清除 百科

但是我需要通过一个 Android 程序来做上面的事情吗?

141632 次浏览

我只是把 Hrupin 发布的链接的教程放在这里。

package com.hrupin.cleaner;


import java.io.File;


import android.app.Application;
import android.util.Log;


public class MyApplication extends Application {


private static MyApplication instance;


@Override
public void onCreate() {
super.onCreate();
instance = this;
}


public static MyApplication getInstance() {
return instance;
}


public void clearApplicationData() {
File cacheDirectory = getCacheDir();
File applicationDirectory = new File(cacheDirectory.getParent());
if (applicationDirectory.exists()) {
String[] fileNames = applicationDirectory.list();
for (String fileName : fileNames) {
if (!fileName.equals("lib")) {
deleteFile(new File(applicationDirectory, fileName));
}
}
}
}


public static boolean deleteFile(File file) {
boolean deletedAll = true;
if (file != null) {
if (file.isDirectory()) {
String[] children = file.list();
for (int i = 0; i < children.length; i++) {
deletedAll = deleteFile(new File(file, children[i])) && deletedAll;
}
} else {
deletedAll = file.delete();
}
}


return deletedAll;
}
}

因此,如果您希望按钮执行此操作,则需要从 onClickListener 中调用 MyApplication.getInstance () . clearApplicationData ()

更新: SharedPreferences实例可能会保留数据,并在删除数据后重新创建首选项文件。所以你需要得到 SharedPreferences对象

prefs.edit().clear().commit();

更新:

如果您没有这样做,那么需要将 android:name="your.package.MyApplication"添加到 AndroidManifest.xml 中的 application tag。否则,MyApplication.getInstance()返回 null,从而产生 NullPointerException

如果你想要一个不那么冗长的黑客技巧:

void deleteDirectory(String path) {
Runtime.getRuntime().exec(String.format("rm -rf %s", path));
}

API 19(KitKat)引入了一个新的 API: ActivityManager.clearApplicationUserData () .

我强烈建议在新的应用程序中使用它:

import android.os.Build.*;
if (VERSION_CODES.KITKAT <= VERSION.SDK_INT) {
((ActivityManager)context.getSystemService(ACTIVITY_SERVICE))
.clearApplicationUserData(); // note: it has a return value!
} else {
// use old hacky way, which can be removed
// once minSdkVersion goes above 19 in a few years.
}

如果你不想使用这种方式,你也可以隐藏 UI 上的按钮,这样旧手机就不能使用这种功能了。

对于任何使用 android:manageSpaceActivity的人来说,了解这个方法是必须的。


无论什么时候我使用这个,我都是从一个有 android:process=":manager"manageSpaceActivity开始的。在那里,我手动关闭我的应用程序的任何 其他进程。这允许我让 UI 保持运行,并让用户决定下一步去哪里。

private static void killProcessesAround(Activity activity) throws NameNotFoundException {
ActivityManager am = (ActivityManager)activity.getSystemService(Context.ACTIVITY_SERVICE);
String myProcessPrefix = activity.getApplicationInfo().processName;
String myProcessName = activity.getPackageManager().getActivityInfo(activity.getComponentName(), 0).processName;
for (ActivityManager.RunningAppProcessInfo proc : am.getRunningAppProcesses()) {
if (proc.processName.startsWith(myProcessPrefix) && !proc.processName.equals(myProcessName)) {
android.os.Process.killProcess(proc.pid);
}
}
}

我在任何地方使用的东西:

 Runtime.getRuntime().exec("pm clear me.myapp");

执行上面的代码关闭应用程序并删除所有数据库和共享首选项

将两个答案的代码组合在一起:

下面是基于源代码的结果组合答案

private void clearAppData() {
try {
// clearing app data
if (Build.VERSION_CODES.KITKAT <= Build.VERSION.SDK_INT) {
((ActivityManager)getSystemService(ACTIVITY_SERVICE)).clearApplicationUserData(); // note: it has a return value!
} else {
String packageName = getApplicationContext().getPackageName();
Runtime runtime = Runtime.getRuntime();
runtime.exec("pm clear "+packageName);
}


} catch (Exception e) {
e.printStackTrace();
}
}

试试这个代码

private void clearAppData() {
try {
if (Build.VERSION_CODES.KITKAT <= Build.VERSION.SDK_INT) {
((ActivityManager)getSystemService(ACTIVITY_SERVICE)).clearApplicationUserData();
} else {
Runtime.getRuntime().exec("pm clear " + getApplicationContext().getPackageName());
}
} catch (Exception e) {
e.printStackTrace();
}
}