【发布时间】:2011-05-26 05:32:50
【问题描述】:
我想以编程方式清除应用程序的数据。
应用程序的数据可能包含数据库、共享首选项、内部-外部文件或在应用程序中创建的任何其他文件。
我知道我们可以通过以下方式清除移动设备中的数据:
设置->应用程序->管理应用程序->我的应用程序->清除 数据
但是我需要通过一个Android程序来做以上事情吗?
【问题讨论】:
标签: android
我想以编程方式清除应用程序的数据。
应用程序的数据可能包含数据库、共享首选项、内部-外部文件或在应用程序中创建的任何其他文件。
我知道我们可以通过以下方式清除移动设备中的数据:
设置->应用程序->管理应用程序->我的应用程序->清除 数据
但是我需要通过一个Android程序来做以上事情吗?
【问题讨论】:
标签: android
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);
}
}
}
【讨论】:
我只是将来自the link ihrupin posted 的教程放在这篇文章中。
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;
}
}
因此,如果您想要一个按钮来执行此操作,您需要调用 MyApplication.getInstance()。 onClickListener 中的 clearApplicationData()
更新:
您的SharedPreferences 实例可能会保留您的数据并在您删除它后重新创建首选项文件。所以你会想要得到你的SharedPreferences 对象和
prefs.edit().clear().commit();
更新:
如果您尚未将android:name="your.package.MyApplication" 添加到AndroidManifest.xml 中的application tag,则需要这样做。否则,MyApplication.getInstance() 返回 null,导致 NullPointerException。
【讨论】:
结合来自 2 个答案的代码:
这是得到的基于源的组合答案
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 deleteAppData() {
try {
// clearing app data
String packageName = getApplicationContext().getPackageName();
Runtime runtime = Runtime.getRuntime();
runtime.exec("pm clear "+packageName);
} catch (Exception e) {
e.printStackTrace();
} }
这将清除数据并从内存中删除您的应用。相当于下面的清除数据选项 设置 --> 应用程序管理器 --> 你的应用程序 --> 清除数据
【讨论】:
pm)是有风险的。它们不是 Android SDK“合同”的一部分,因此它们是否存在于给定设备上,或者它们的行为是否与其他设备上的行为相同,取决于制造商和自定义 ROM 开发人员。
我随处使用的东西:
Runtime.getRuntime().exec("pm clear me.myapp");
执行上述代码会关闭应用程序并删除所有数据库和共享首选项
【讨论】:
如果你想要一个不那么冗长的 hack:
void deleteDirectory(String path) {
Runtime.getRuntime().exec(String.format("rm -rf %s", path));
}
【讨论】:
试试这个代码
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();
}
}
【讨论】: