8

Android OS は、メモリが不足するとプロセスを強制終了します。シナリオ: Android がアプリ プロセスを強制終了し、Android ランチャーまたは最近のタスク リスト (ホーム ボタンを長押し) を使用してアプリを再度開きます。Android が最近表示したアクティビティの onCreate() メソッドでアプリ プロセスを強制終了したかどうかを確認するには、次を使用します。

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

    if (savedInstanceState != null) {
        // Re-initialise things that killing the app would have destroyed
    }
}

ただし、Android がアプリ プロセスを強制終了し、PendingIntent 内にパッケージ化されたインテントを使用して通知を介して再度開いた場合、アプリ プロセスが Android によって強制終了されたかどうかを判断する方法がわかりません。その後、アプリ プロセスを強制終了すると破壊されたものを再初期化しません。

通知から新しいアクティビティを開くときに Android がアプリケーション プロセスを強制終了したかどうかを判断する方法はありますか?

この問題に対するハックな解決策を 1 つ見つけました。使用: Android: 通知をクリックすると常にトップ アクティビティを起動する Android がアプリ プロセスを強制終了し、再初期化を処理する場合、savedInstanceState が渡されるスタックの一番上にあるアクティビティを開くことができます。各アクティビティは、元の Notification Intent の Extras を使用して、ユーザーを適切なアクティビティにリダイレクトする役割を果たします。このシナリオの意図の設定は次のとおりです。

Intent notificationIntent = new Intent(this, MainActivity.class);
notificationIntent.setAction(Intent.ACTION_MAIN);
notificationIntent.addCategory(Intent.CATEGORY_LAUNCHER);
notificationIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);

ユーザーが新しいインテント/アクティビティで行ったかのように、アプリプロセスを再度開くことをエミュレートするインテントに設定できるアクション、カテゴリ、またはフラグはありますか?

編集:最後の質問を明確にするために (Android の幼児の理解が私を失敗させているようですが、おそらく意味がありません): 上記のスニペットのように、インテントに設定できるアクション、カテゴリ、またはフラグはありますか?アプリプロセスがOSによって強制終了されたかどうかを判断できるようになりますか?

4

2 に答える 2

15

Android がプロセスを強制終了してから新しいプロセスを作成したかどうかを判断する最も簡単な方法は次のとおりです。

ルート アクティビティ (ACTION=MAIN および CATEGORY=DEFAULT のアクティビティ) で、次のような public static boolean 変数を作成します。

public static boolean initialized;

onCreate()ルート アクティビティの で、この変数を に設定しますtrue

onCreate()のすべてのアクティビティの中で、ブール値の状態を確認することで、Android がタスクを強制終了/再作成したかどうかを確認できます。アプリが初期化されていない場合は、ルート アクティビティにリダイレクトするか、初期化メソッドなどを呼び出すことができます。 ... このような:

if (!RootActivity.initialized) {
    // Android has killed and recreated the process and launched this
    //  Activity. We need to reinitialize everything now
    ... redirect to root activity or call reinitialize method
}
于 2015-04-22T15:45:11.080 に答える
9

アプリが強制終了されて再起動されるとプロセス ID が変更されるため、これを使用して確認できます。

現在onSaveInstanceState(Bundle outState)のプロセス ID を取得し、outState に保存します。

onSavedInstanceState(Bundle outState){
   super.onSaveInstanceState(outState);
   outState.putInt("my_pid", Process.myPid());
}

次にonCreate(Bunde savedInstanceState)、保存されたプロセス ID と現在のプロセス ID を比較します。

onCreate(Bundle savedInstanceState){
   if(savedInstanceState!=null){            
      if(savedInstanceState.getInt("my_pid",-1)==android.os.Process.myPid())
         // app was not killed    
      else
        // app was killed
    }
}
于 2017-11-25T08:07:02.030 に答える