Effacer les données de l'application par programme

121

Je souhaite effacer les données de mon application par programmation.

Les données de l'application peuvent contenir quelque chose comme des bases de données, des préférences partagées, des fichiers internes-externes ou tout autre fichier créé dans l'application.

Je sais que nous pouvons effacer les données de l'appareil mobile via:

Paramètres-> Applications-> Gérer les applications-> Ma_application-> Effacer les données

Mais je dois faire la chose ci-dessus via un programme Android?

uday
la source

Réponses:

111

Une nouvelle API a été introduite dans l'API 19 (KitKat): ActivityManager.clearApplicationUserData () .

Je recommande vivement de l'utiliser dans de nouvelles applications:

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

Si vous ne voulez pas le piratage, vous pouvez également masquer le bouton sur l'interface utilisateur, de sorte que la fonctionnalité ne soit tout simplement pas disponible sur les anciens téléphones.

La connaissance de cette méthode est obligatoire pour toute personne utilisant android:manageSpaceActivity.


Chaque fois que j'utilise ceci, je le fais à partir d'un manageSpaceActivityqui a android:process=":manager". Là, je tue manuellement tous les autres processus de mon application. Cela me permet de laisser une interface utilisateur continuer à fonctionner et de laisser l'utilisateur décider où aller ensuite.

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
la source
9
pour moi .clearApplicationUserData (); force également la fermeture de l'application.
gaurav414u
9
Il doit tuer l'application, sinon il pourrait avoir des données sur lesquelles il se tient et qui seront réécrits. Le seul moyen sûr de le faire est de (1) tuer l'application, (2) effacer toutes ses données, (3) la prochaine fois que l'application démarre, elle recommencera sans aucune donnée.
hackbod
4
Salut @TWiStErRob Je veux implémenter cette méthode lorsque je clique sur le bouton LOGOUT dans mon application. Mais cela force la fermeture de l'application. Au lieu de cela, je veux commencer l'activité principale où le formulaire d'inscription / de connexion est présent. Comment cela sera-t-il possible?
pblead26
1
Pour la version pré KitKat, voir cette réponse: stackoverflow.com/a/23470355/3256989
ultraon
2
est-il possible de commencer une autre activité après avoir appliqué ce code
Amandeep Rohila
106

Je mets juste le tutoriel à partir du lien ihrupin posté ici dans ce post.

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

Donc, si vous voulez qu'un bouton le fasse, vous devez appeler MyApplication.getInstance (). clearApplicationData () depuis un onClickListener

Mise à jour: votre SharedPreferencesinstance peut conserver vos données et recréer le fichier de préférences après l'avoir supprimé. Alors vous allez vouloir obtenir votre SharedPreferencesobjet et

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

Mettre à jour:

Vous devez ajouter android:name="your.package.MyApplication"à l' application tagintérieur AndroidManifest.xml si vous ne l'avez pas fait. Sinon, MyApplication.getInstance()retourne null, ce qui entraîne une NullPointerException .

MinceMan
la source
5
Prends soin de toi ! Vous supprimez tout dans le dossier de l'application, y compris les préférences de partage ... pas seulement le répertoire de cache lui-même et son contenu.
Snicolas
2
J'ai implémenté cette solution. Mais mes données d'application ne sont pas effacées, seul le cache est effacé. Il reste encore 5 Mo .. toute autre solution ?? S'il vous plaît aidez-moi :(
SweetWisher ツ
1
@MinceMan Veuillez mentionner que cela doit être écrit dans la classe qui étend l'application pour un meilleur effet
creepy_driver
Très intelligent pour garder le répertoire lib.
frostymarvelous
1
oui, il a supprimé tous les fichiers mais l'application ne l'a pas réalisé, donc je pourrais toujours être des fichiers sur le répertoire de l'application. L'application a réalisé l'effacement après avoir supprimé l'application de l'application récente puis la démarrer. J'ai essayé de recréer l'activité mais cela ne fonctionne pas
gturedi
15

combiner le code de 2 réponses:

Voici la réponse basée sur la source combinée résultante

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
la source
Cela fonctionnera-t-il sur tous les appareils Android, quelle que soit la version d'Android? Pour moi, cela fonctionne sur les 3 appareils Android que je possède (avec Lollipop, Marshmallow et Pie)
Kathir
oui le if else est égal ou inférieur à kit kat ... utilisez clearApplicationUserData et au-dessus, il utilise runtime.exce ... fondamentalement une commande shell ... assez fiable autre que les permissions ... cela devrait juste fonctionner ...
CrandellWS
13

La manière la plus simple de procéder est

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

Cela effacera les données et supprimera votre application de la mémoire. Cela équivaut à l'option d'effacement des données sous Paramètres -> Gestionnaire d'applications -> Votre application -> Effacer les données

Jain sommé
la source
3
Je ne recommanderais pas cette approche. Utiliser des programmes de ligne de commande (par exemple pm) qui pourraient ne pas exister est risqué. Ils ne font pas partie du "contrat" ​​du SDK Android, et donc, qu'ils existent sur un appareil donné ou s'ils se comportent de la même manière que sur d'autres appareils, c'est aux fabricants et aux développeurs de ROM personnalisées.
CommonsWare
2
Comme alternative, j'ai une autre option à savoir ((ActivityManager) context.getSystemService (ACTIVITY_SERVICE)) .clearApplicationUserData (); Mais il a une limitation qu'il ne fonctionne qu'au niveau API> = 19 Pouvez-vous s'il vous plaît fournir une alternative ici ou peut-être une autre option.
Summved Jain le
2

Ce que j'utilise partout:

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

L'exécution du morceau de code ci-dessus ferme l'application et supprime toutes les bases de données et les préférences partagées

Pehlaj - Développeur d'applications mobiles
la source
-1

Si vous voulez un hack moins verbeux:

void deleteDirectory(String path) {
  Runtime.getRuntime().exec(String.format("rm -rf %s", path));
}
Christopher Perry
la source
1
Vous voudrez peut-être citer ce chemin au cas où il y aurait des espaces et des trucs.
TWiStErRob