2017-08-27 22 views
2

私のアクティビティ(A)の1つは、提供されているPendingIntentを通じてプッシュ通知によって起動されます。このインテントに特定のキーがある場合は、新しいアクティビティ(B)を開始する必要があります。 Bを押すと、私はAに戻るべきです。もし私が「活動をしないでください」を開発者の設定で有効にすると、AはBを起動した後に明らかに殺されます。つまり、BからAに戻ると、Aは元の意図Bをもう一度起動すると、ユーザーはBに固執します)。AndroidのsetIntent()は、再作成されたアクティビティに新しい値を残さない

回避策として、Bを起動してインテントをリセットする前に、Aの余分なキーを削除しようとしました。このコードはアクティビティAのonCreate()メソッドからのものです。私はAlarmManagerを追加して、簡単にその動作を複製しました。これは私の問題とは関係ありません。

Intent originalIntent = getIntent(); 
    if(originalIntent != null && originalIntent.hasExtra("A")){ 
     Log.d(TAG, "onCreate: has A"); 
     startActivity(new Intent(this, PAlarmTwo.class)); 
     originalIntent.removeExtra("A"); 
     setIntent(originalIntent); 
     Log.d(TAG, "onCreate: modified intent has A : " + getIntent().hasExtra("A")); 
    } else { 
     Log.d(TAG, "onCreate: no A"); 
    } 

    final FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab); 
    fab.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE); 
      Intent alarmIntent = new Intent(PAlarmOne.this, PAlarmOne.class); 
      alarmIntent.putExtra("A", "a"); 
      PendingIntent pendingIntent = PendingIntent.getActivity(PAlarmOne.this, 1, alarmIntent, 0); 
      alarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime()+1000, pendingIntent); 
     } 
    }); 

ログはsetIntent()がBを起動する前に、キーを削除しているが、Aがキーと古い意図を取得する再作成することを示しています。基本的に、ログ(「no A」)は決して印刷されません。私が試してみました

2ソリューション:

  1. PendingIntentを作成するためのPendingIntent.FLAG_ONE_SHOTを渡します。ドキュメントに基づいて動作するはずですが、そうではありません。この旗の私の理解は間違っていますか?
  2. インテントが一度使用されたかどうかを示すアクティビティAのインスタンス変数を設定します。私は外部からを介してこの変数を永続化することができ、同じアクティビティの再作成されたインスタンス全体にわたって持続します。このアプローチは、複数のライフサイクルメソッドを追跡するための新しい変数を導入するために、きれいではありません。

答えて

0

Aは明らかにBからAへの復帰に意味Bを、起動後に殺され、Aは(余分なキーを持っている)本来の意図で再作成された - 再びBを起動する - そしてそれは、その結果ユーザーは、あなたはログがsetIntent()があることを示しているB.

を開始する必要があるかどうかがわかります保存されたインスタンス状態Bundle状態を保存しなければならないB.

に貼付されています削除するBを起動する前のキー、Aを再作成したキーは古い意図をキーで取得します。

私の推測では、setIntent()は現在のインスタンスにのみ影響します。これは何とかAndroidはA.

が間違っている、このフラグの私の理解です再作成するために使用するバックスタックレコードで、この新しいIntentを関連付けるために、バックコアOSに指示を送信しませんか?

このフラグはPendingIntentを制御します。 にラップされたIntentによって開始されたコンポーネントには影響しません。

このアプローチでは、複数のライフサイクルメソッドを追跡するための新しい変数を導入するためにクリーンではありません。

あなたの意見は大歓迎です。アクティビティ状態には多くのものが含まれています。たとえば、データロードや確認メッセージなど、一度だけ呼び出す必要があるものがたくさんあります。これはまさに別のものです。

関連する問題