Очистити дані програми програмно


121

Я хочу очистити дані своєї програми програмно.

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

Я знаю, що ми можемо очистити дані на мобільному пристрої через:

Налаштування-> Програми-> ManageApplications-> My_application-> Очистити дані

Але мені потрібно зробити вищезазначене через програму Android?

Відповіді:


111

В 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.
}

Якщо ви не хочете хакітського способу, ви також можете приховати кнопку в інтерфейсі, так що функціональність просто не доступна на старих телефонах.

Знання цього методу є обов'язковим для всіх, хто використовує 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);
        }
    }
}

9
для мене .clearApplicationUserData (); також примусово закривати додаток.
gaurav414u

9
Він повинен вбити додаток, інакше він може мати дані, до яких він утримується, і вони будуть записані назад. Єдиний безпечний спосіб зробити це - (1) знищити додаток, (2) очистити всі його дані, (3) наступного разу, коли додаток запуститься, воно почне свіжий без даних.
хакбод

4
Привіт @TWiStErRob Я хочу реалізувати цей метод, коли натиснув кнопку LOGOUT у своїй програмі. Але це змушує закривати додаток. Натомість я хочу розпочати основну діяльність там, де є форма для реєстрації / входу. Як це стане можливим?
pblead26

1
Для попередньої версії KitKat побачити цю відповідь: stackoverflow.com/a/23470355/3256989
ultraon

2
чи можна розпочати будь-яку іншу діяльність після застосування цього коду
Amandeep Rohila

107

Я просто розміщую підручник із посилання на нихрупін, розміщеного тут у цій публікації.

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 .


5
Піклуватися ! Ви видаляєте що-небудь в папці додатків, включаючи налаштування спільного доступу.
Snicolas

2
Я реалізував це рішення. Але дані моїх програм не очищені, очищається лише кеш .. 5 Мб все ще залишається .. будь-яке інше рішення ?? Будь ласка, допоможіть мені :(
SweetWisher ツ

1
@MinceMan Будь ласка, зауважте, що це має бути написано в класі, що розширює програму для кращого ефекту
creepy_driver

Дуже розумний, щоб тримати ліб реж.
frostymarvelous

1
так, він видалив усі файли, але додаток не зрозумів цього, тому я все-таки можу бути файлами в режимі програми. Програма реалізувала очищення після видалення програми з недавнього тренажера додатка. Я спробував відтворити діяльність, але це не
вийшло

15

комбінувати код з 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();
    } 
}

Чи буде це працювати на всіх пристроях Android незалежно від версії Android? Для мене, це працює на всіх 3 Android пристроїв я володію (з льодяник, Зефір і Pie)
Касир

Так, якщо інше дорівнює або меншим, ніж комплект kat ... використовуйте clearApplicationUserData і вище він використовує runtime.exce ... в основному команда оболонки ... досить надійна, крім дозволів ... вона повинна просто працювати ...
CrandellWS

13

Найпростіший спосіб це зробити

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

Це очистить дані та видалить ваш додаток із пам'яті. Це еквівалентно параметру очищення даних у розділі Налаштування -> Диспетчер програм -> Ваша програма -> Очистити дані


3
Я б не рекомендував такий підхід. Використовувати програми командного рядка (наприклад, pm), які можуть не існувати, є ризиковим. Вони не є частиною "контракту" на Android SDK, і тому, чи існують вони на певному пристрої, чи поводяться вони так само, як на інших пристроях, залежить від виробників та розробників на замовлення ROM.
CommonsWare

2
В якості альтернативи у мене є ще один варіант, тобто ((ActivityManager) context.getSystemService (ACTIVITY_SERVICE)) .clearApplicationUserData (); Але є обмеження, що він працює лише на рівні API>> 19 Чи можете ви, будь ласка, вкажіть альтернативний варіант тут чи інший варіант.
Підсумкований Джаїн


-1

Якщо ви хочете зламати менш детально:

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

1
Ви можете процитувати цей шлях, якщо у ньому є пробіли та інші речі.
TWiStErRob
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.