Очистить данные приложения программно

Я хочу очистить данные своего приложения программно.

Данные приложения могут содержать что-либо, например, базы данных, общие настройки, внутренние-внешние файлы или любые другие файлы, созданные в приложении.

Я знаю, что мы можем очистить данные в мобильном устройстве через:

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));
}