我的一項活動(A)通過推送通知通過PendingIntent提供。如果這個意圖有一個特定的關鍵,那麼我需要開始一個新的活動(B)。按回B,我應該返回到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收到舊有意向的關鍵。基本上,日誌(「否A」)從不打印。
2解決方案我曾嘗試:
- 傳遞
PendingIntent.FLAG_ONE_SHOT
創建PendingIntent
。基於文檔,它應該工作,但事實並非如此。我對這個標誌的理解是錯誤的嗎? - 在活動A中設置一個實例變量,指出該意圖是否曾經使用過一次。我可以通過
onSaveInstanceState()
在外部持久保存這個變量,並且它會在同一活動的重新創建的實例中保留。這種方法並不感覺乾淨,因爲引入了一個新變量來跟蹤多個生命週期方法。