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
Application
de onCreate
n'est pas exécuté!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?
https://issuetracker.google.com/issues/138423608
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: