2017-08-27 34 views
2

我的一項活動(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解決方案我曾嘗試:

  1. 傳遞PendingIntent.FLAG_ONE_SHOT創建PendingIntent。基於文檔,它應該工作,但事實並非如此。我對這個標誌的理解是錯誤的嗎?
  2. 在活動A中設置一個實例變量,指出該意圖是否曾經使用過一次。我可以通過onSaveInstanceState()在外部持久保存這個變量,並且它會在同一活動的重新創建的實例中保留。這種方法並不感覺乾淨,因爲引入了一個新變量來跟蹤多個生命週期方法。

回答

0

一個推出B,這意味着在從B到A返回後明顯死亡,A被重新使用原來的意圖(其中有額外的鍵) - 這又推出乙 - 它導致用戶粘在B.

你應該在保存實例狀態Bundle,告訴你可以節省你的狀態是否應該首發B.

日誌表明,雖然setIntent()是刪除在啓動B之前的密鑰,重新創建A時會獲得舊密鑰的意圖。

我的猜測是setIntent()隻影響當前的實例。它不發送指令返回到核心操作系統以某種方式這個新Intent與背部堆棧記錄相關聯的機器人將用於重建A.

是我這個標誌的理解錯了嗎?

該標誌控制着PendingIntent。它不會影響由包裝在PendingIntent中啓動的組件。

這種方法並不感覺乾淨,因爲引入了一個新的變量來跟蹤多個生命週期方法。

歡迎您的意見。活動狀態涉及很多事情,包括大量可能只需調用一次的內容(例如,數據加載,確認消息)。這只是另一個。

相關問題