Очистить данные приложения программно
Я хочу очистить данные своего приложения программно.
Данные приложения могут содержать что-либо, например, базы данных, общие настройки, внутренние-внешние файлы или любые другие файлы, созданные в приложении.
Я знаю, что мы можем очистить данные в мобильном устройстве через:
Settings-> Приложения-> ManageApplications-> My_application-> Очистить данные
Но мне нужно сделать вышеуказанную вещь через программу Android?
Ответы
Ответ 1
Я просто выкладываю учебник по ссылке ihrupin, размещенной здесь в этом посте.
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(). clearApplicationData() изнутри onClickListener
Обновление: ваш экземпляр SharedPreferences
может сохранить ваши данные и воссоздать файл настроек после того, как вы удалите его. Итак, вы захотите получить объект SharedPreferences
и
prefs.edit().clear().commit();
Обновить:
Вам нужно добавить android:name="your.package.MyApplication"
в application tag
внутри AndroidManifest.xml, если вы этого еще не сделали. В MyApplication.getInstance()
возвращает значение null
, в результате чего возникает исключение NullPointerException.
Ответ 2
В API 19 появился новый API (KitKat): 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.
}
Если вам не нужен хакерский способ, вы также можете скрыть кнопку в пользовательском интерфейсе, так что функциональность просто недоступна на старых телефонах.
Знание этого метода обязательно для всех, кто использует android:manageSpaceActivity
.
Всякий раз, когда я использую это, я делаю это из manageSpaceActivity
котором есть android:process=":manager"
. Там я вручную убиваю любые другие процессы моего приложения. Это позволяет мне позволить пользовательскому интерфейсу работать и позволить пользователю решать, куда идти дальше.
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);
}
}
}
Ответ 3
Самый простой способ сделать это -
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();
} }
Это очистит данные и удалит ваше приложение из памяти. Это эквивалентно понятию четких данных в
Настройки → Диспетчер приложений → Ваше приложение → Очистить данные
Ответ 4
объединить код из 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();
}
}
Ответ 5
То, что я использую везде:
Runtime.getRuntime().exec("pm clear me.myapp");
Выполнение вышеуказанного фрагмента кода закрывает приложение и удаляет все базы данных и общие настройки
Ответ 6
Если вам нужен менее сложный взлом:
void deleteDirectory(String path) {
Runtime.getRuntime().exec(String.format("rm -rf %s", path));
}