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