以下のようにApplication
クラスを持つことは一般的です
_public class WeNoteApplication extends MultiDexApplication {
public static WeNoteApplication instance() {
return me;
}
@Override
public void onCreate() {
super.onCreate();
me = this;
_
通常の状況では、Application
のonCreate
は常にエントリポイントActivity
のonCreateの前に呼び出されます。
_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());
_
ただし、アプリの起動中に次のコマンドを実行すると
_c:\yocto>adb Shell bmgr restore com.yocto.wenote
restoreStarting: 1 packages
onUpdate: 0 = com.yocto.wenote
restoreFinished: 0
done
_
アプリは閉じられます。もしそうなら、私はアプリのアイコンをタップして再起動します。これは何が起こるかです
Application
のonCreate
は実行されません!Activity
のonCreate
が実行され、WeNoteApplication.instance()
はnull
私はいくつかのGoogleのAndroidソースコード(例:WorkManager
)を見て)
https://github.com/googlecodelabs/Android-workmanager/issues/8
彼らのコメントでは、彼らはそれを述べています
_// 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,...
_
バックアップ関連の処理が含まれている場合、Application
のonCreate
は実行されないようです。
なぜそうなのか?この動作はどこかに記録されていますか?
https://issuetracker.google.com/issues/138423608
これに関するドキュメントを見つけることができる唯一の場所は Test Backup and Restore です。これは、アプリが終了すること、および完全バックアップの場合、クラスの代わりにアプリケーション基本クラスが使用されることを示しています。この理由がどこに文書化されているかはわかりませんが、カスタムアプリケーションクラスがファイルのオープンや変更などによってバックアップや復元に干渉する可能性があるためと考えられます。
Androidはアプリのカスタムアプリケーションクラスを認識できないため、Androidコードベースでこの問題を解決できる方法はないと思いますカスタムアプリケーションクラスの実行中は自動バックアップを安全に実行できません。
アプリでこれを回避する方法は2つあります。