web-dev-qa-db-fra.com

Pourquoi le processus lié à la sauvegarde peut entraîner l'exécution de l'application onCreate?

Il est courant d'avoir la classe Application comme suit

public class WeNoteApplication extends MultiDexApplication {
    public static WeNoteApplication instance() {
        return me;
    }

    @Override
    public void onCreate() {
        super.onCreate();

        me = this;

Dans des circonstances normales, Application de onCreate sera toujours appelé avant le point d'entrée onCreate de Activity.

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // Normally, it will NOT be null.
        Android.util.Log.i("CHEOK", "WeNoteApplication -> " + WeNoteApplication.instance());

Cependant, si j'exécute la commande suivante lors du lancement de l'application

c:\yocto>adb Shell bmgr restore com.yocto.wenote
restoreStarting: 1 packages
onUpdate: 0 = com.yocto.wenote
restoreFinished: 0
done

L'application sera fermée. Si, je tape sur l'icône de l'application pour la relancer. Voilà ce qui se passe

  1. Le Application de onCreate n'est pas exécuté!
  2. Activity de onCreate est exécuté et WeNoteApplication.instance() est null

Je regarde certains Android d'Android (WorkManager par exemple))

https://github.com/googlecodelabs/Android-workmanager/issues/8

Dans leur commentaire, ils déclarent que

// 1. The app is performing an auto-backup.  Prior to O, JobScheduler could erroneously
//    try to send commands to JobService in this state (b/32180780).  Since neither
//    Application#onCreate nor ContentProviders have run,...

Il semble que, si un processus lié à la sauvegarde est impliqué, le Application de onCreate ne sera pas exécuté!

Pourquoi en est-il ainsi? Ce comportement est-il déjà documenté quelque part?


Traqueur d'incidents

https://issuetracker.google.com/issues/138423608


Exemple complet de démonstration de bogues

https://github.com/yccheok/AutoBackup-bug

21
Cheok Yan Cheng

Le seul endroit où je peux trouver une documentation à ce sujet se trouve dans Test de sauvegarde et restauration . Cela indique que votre application sera fermée et que pour une sauvegarde complète, la classe de base Application sera utilisée à la place de votre classe. Je ne peux pas voir que la raison de ceci est documentée n'importe où, mais je soupçonne que c'est parce qu'une classe d'application personnalisée peut interférer avec la sauvegarde ou la restauration, par exemple, en ouvrant ou en modifiant des fichiers.

Je ne pense pas qu'il existe un moyen de résoudre ce problème dans la base de code Android, car Android ne peut pas savoir quelle classe d'application personnalisée d'une application) va faire, donc ne peut pas exécuter en toute sécurité une sauvegarde automatique pendant que la classe Application personnalisée est en cours d'exécution.

Il existe deux façons de contourner cela dans votre application:

  • Comme suggéré dans la Documentation de classe d'application , ne dérivez pas d'Application. Utilisez plutôt des singletons et Context.getApplicationContext ().
    • Un membre de l'équipe de développement Android Android m'a dit une fois que l'autorisation de classes d'application personnalisées avait été une erreur importante dans la conception de l'API Android Android.
  • Passez à l'aide de Sauvegarde clé/valeur pour sauvegarder votre application. C'est beaucoup plus de travail, mais, puisque votre application contrôle désormais la sauvegarde, elle peut garantir qu'il n'y a pas de conflit entre la sauvegarde ou la restauration et l'application en cours d'exécution.
0
Anthony Berent