Löschen Sie die Daten der Anwendung programmgesteuert

120

Ich möchte die Daten meiner Anwendung programmgesteuert löschen.

Die Daten der Anwendung können Datenbanken, freigegebene Einstellungen, intern-externe Dateien oder andere in der Anwendung erstellte Dateien enthalten.

Ich weiß, dass wir Daten auf dem mobilen Gerät löschen können durch:

Einstellungen-> Anwendungen-> Anwendungen verwalten-> Meine_Anwendung-> Daten löschen

Aber muss ich das oben genannte über ein Android-Programm tun?

uday
quelle

Antworten:

110

In API 19 (KitKat) wurde eine neue API eingeführt: ActivityManager.clearApplicationUserData () .

Ich empfehle dringend, es in neuen Anwendungen zu verwenden:

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

Wenn Sie nicht auf hackige Weise möchten, können Sie die Schaltfläche auch auf der Benutzeroberfläche ausblenden, sodass die Funktionalität auf alten Telefonen einfach nicht verfügbar ist.

Die Kenntnis dieser Methode ist für jeden Benutzer obligatorisch android:manageSpaceActivity.


Wann immer ich das benutze, mache ich das von einem manageSpaceActivitywas hat android:process=":manager". Dort töte ich alle anderen Prozesse meiner App manuell . Auf diese Weise kann ich eine Benutzeroberfläche laufen lassen und den Benutzer entscheiden lassen, wohin er als Nächstes gehen möchte.

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);
        }
    }
}
TWiStErRob
quelle
9
für mich .clearApplicationUserData (); ist das erzwungene Schließen der App.
Gaurav414u
9
Es muss die App beenden, sonst könnten Daten, an denen es festhält, zurückgeschrieben werden. Der einzig sichere Weg, dies zu tun, besteht darin, (1) die App zu beenden, (2) alle ihre Daten zu löschen, (3) beim nächsten Start der App ohne Daten neu zu starten.
Hackbod
4
Hallo @TWiStErRob Ich möchte diese Methode implementieren, wenn ich in meiner Anwendung auf die Schaltfläche LOGOUT klicke. Aber es erzwingt das Schließen der App. Stattdessen möchte ich die Hauptaktivität starten, in der das Anmelde- / Anmeldeformular vorhanden ist. Wie wird dies möglich sein?
pblead26
1
Für die Pre-KitKat-Version siehe diese Antwort: stackoverflow.com/a/23470355/3256989
Ultraon
2
Ist
106

Ich setze nur das Tutorial von dem Link ihrupin hier in diesem Beitrag.

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

Wenn Sie also eine Schaltfläche dazu benötigen, müssen Sie MyApplication.getInstance () aufrufen. clearApplicationData () aus einem onClickListener heraus

Update: Ihre SharedPreferencesInstanz behält möglicherweise Ihre Daten bei und erstellt die Voreinstellungsdatei neu, nachdem Sie sie gelöscht haben. Also wirst du dein SharedPreferencesObjekt bekommen wollen und

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

Aktualisieren:

Sie müssen android:name="your.package.MyApplication"der application tagDatei AndroidManifest.xml hinzufügen , wenn Sie dies nicht getan haben. Else, MyApplication.getInstance()kehrt null, was eine Nullpointer .

MinceMan
quelle
5
Pass auf ! Sie entfernen alles im App-Ordner, einschließlich der Freigabeeinstellungen. Nicht nur das Cache-Verzeichnis selbst und seinen Inhalt.
Snicolas
2
Ich habe diese Lösung implementiert. Aber meine Anwendungsdaten werden nicht gelöscht, nur der Cache wird gelöscht. 5 MB verbleiben noch. Gibt es eine andere Lösung? Bitte helfen Sie mir aus :(
SweetWisher
1
@MinceMan Bitte erwähnen Sie, dass dies in einer Klasse geschrieben werden muss, die die Anwendung für eine bessere Wirkung erweitert
gruseliger_Driver
Sehr klug, das lib-Verzeichnis zu behalten.
frostymarvelous
1
Ja, es wurden alle Dateien entfernt, aber die App hat es nicht erkannt, sodass ich immer noch Dateien im App-Verzeichnis sein kann. App wurde gelöscht, nachdem die App aus der letzten App entfernt und dann gestartet wurde. Ich habe versucht, Aktivität neu zu erstellen, aber es funktioniert nicht
gturedi
15

kombiniere Code aus 2 Antworten:

Hier ist die resultierende kombinierte quellenbasierte Antwort

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();
    } 
}
CrandellWS
quelle
Funktioniert dies auf allen Android-Geräten unabhängig von der Android-Version? Für mich funktioniert es auf allen 3 Android-Geräten, die ich besitze (mit Lollipop, Marshmallow und Pie)
Kathir
ja das if else ist gleich oder kleiner als kit kat ... benutze clearApplicationUserData und darüber verwendet es runtime.exce ... im Grunde ein Shell-Befehl ... ziemlich zuverlässig, abgesehen von Berechtigungen ... es sollte einfach funktionieren ...
CrandellWS
12

Der einfachste Weg, dies zu tun, ist

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

Dadurch werden die Daten gelöscht und Ihre App aus dem Speicher entfernt. Dies entspricht der Option zum Löschen von Daten unter Einstellungen -> Anwendungsmanager -> Ihre App -> Daten löschen

Summierter Jain
quelle
3
Ich würde diesen Ansatz nicht empfehlen. Die Verwendung von Befehlszeilenprogrammen (z. B. pm), die möglicherweise nicht vorhanden sind, ist riskant. Sie sind nicht Teil des "Vertrags" für Android SDK. Ob sie auf einem bestimmten Gerät vorhanden sind oder sich genauso verhalten wie auf anderen Geräten, liegt bei den Herstellern und benutzerdefinierten ROM-Entwicklern.
CommonsWare
2
Als Alternative habe ich eine weitere Option: ((ActivityManager) context.getSystemService (ACTIVITY_SERVICE)) .clearApplicationUserData (); Es gibt jedoch eine Einschränkung, dass es nur auf API-Ebene> = 19 funktioniert. Können Sie hier bitte eine Alternative angeben oder eine andere Option sein?
Summved Jain
2

Was ich überall benutze:

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

Durch Ausführen des obigen Codeteils wird die Anwendung geschlossen und alle Datenbanken und freigegebenen Einstellungen werden entfernt

Pehlaj - Entwickler mobiler Apps
quelle
-1

Wenn Sie einen weniger ausführlichen Hack wollen:

void deleteDirectory(String path) {
  Runtime.getRuntime().exec(String.format("rm -rf %s", path));
}
Christopher Perry
quelle
1
Vielleicht möchten Sie diesen Pfad zitieren, falls er Leerzeichen und ähnliches enthält.
TWiStErRob