持っているのが一般的である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
「SonCreate
実行され、そしてWeNoteApplication.instance()
ありますnull
私はいくつかのGoogleのAndroidのソースコードを見て(WorkManager
例えば)
https://github.com/googlecodelabs/android-workmanager/issues/80
彼らのコメントでは、彼らは、と述べています
// 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
バグのデモンストレーションのための完全な例
あなたは、この回避策を使用して、問題を回避することができます。
この背後にある考え方は、カスタム作成することであるBackupAgent
の通知受信するonRestoreFinished
次回は、システムがカスタムアプリケーションクラスを作成しますアプリを開きますので、イベントをして、あなたのプロセスを強制終了します。
通常、カスタム使用してBackupAgent
抽象メソッドを実装するために力にあなたがonBackup
してonRestore
、キーと値のバックアップに使用されています、。あなたが指定した場合幸いにもandroid:fullBackupOnly
マニフェストで説明したように、このシステムは、代わりにファイルベースの自動バックアップを使用しますここに。
まず第一に、カスタムを作成しますBackupAgent
:
package com.yocto.cheok;
import android.app.ActivityManager;
import android.app.backup.BackupAgent;
import android.app.backup.BackupDataInput;
import android.app.backup.BackupDataOutput;
import android.content.Context;
import android.os.ParcelFileDescriptor;
import android.os.Process;
import java.util.List;
public class CustomBackupAgent extends BackupAgent {
private Boolean isRestoreFinished = false;
@Override
public void onBackup(ParcelFileDescriptor oldState, BackupDataOutput data, ParcelFileDescriptor newState) {
//NO-OP - abstract method
}
@Override
public void onRestore(BackupDataInput data, int appVersionCode, ParcelFileDescriptor newState) {
//NO-OP - abstract method
}
@Override
public void onRestoreFinished() {
super.onRestoreFinished();
isRestoreFinished = true;
}
@Override
public void onDestroy() {
super.onDestroy();
if (isRestoreFinished) {
ActivityManager activityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
if (activityManager != null) {
final List<ActivityManager.RunningAppProcessInfo> runningServices = activityManager.getRunningAppProcesses();
if (runningServices != null &&
runningServices.size() > 0 &&
runningServices.get(0).processName.equals("com.yocto.cheok")
) {
Process.killProcess(runningServices.get(0).pid);
}
}
}
}
}
その後、追加android:backupAgent="com.yocto.cheok.CustomBackupAgent"
およびandroid:fullBackupOnly="true"
Androidのマニフェストに:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.yocto.cheok">
<application
android:name="com.yocto.cheok.CheokApplication"
android:allowBackup="true"
android:backupAgent="com.yocto.cheok.CustomBackupAgent"
android:fullBackupContent="@xml/my_backup_rules"
android:fullBackupOnly="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name="com.yocto.cheok.MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
次回は昼食後のアプリは、あなたが取得する復元されます:
2019-07-28 22:25:33.528 6956-6956/com.yocto.cheok I/CHEOK: CheokApplication onCreate
2019-07-28 22:25:33.642 6956-6956/com.yocto.cheok I/CHEOK: In MainActivity, CheokApplication = com.yocto.cheok.CheokApplication@7b28a29