なぜバックアップ関連のプロセスは、アプリケーションののonCreateが実行されていない可能性がありますか?

Cheokヤンチェン:

持っているのが一般的である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

アプリが閉じられます。場合、私は再び起動するようにアプリのアイコンをタップします。これは何が起こるかであります

  1. ApplicationさんはonCreate実行されません!
  2. Activity「S onCreate実行され、そして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


バグのデモンストレーションのための完全な例

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

マティアMaestrini:

あなたは、この回避策を使用して、問題を回避することができます。

この背後にある考え方は、カスタム作成することである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

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=228942&siteId=1