2012-04-23 65 views
3

我對前臺調度行爲有一個討厭的問題。有時候不是調用onNewIntent(),而是完全重新創建活動,這會打破應用程序的工作流程。Android的NFC前臺調度系統是否有bug?

我的具體情況:活動A是MainActivity,它使用前臺調度。一切正常。但是,在從瀏覽器(VIEW操作)啓動的我的活動B中,在某些情況下,前臺調度不再有效。

的工作流程:

  • 我開始在MainActivity,切換到瀏覽器(不關閉 在MainActivity),發射活動B和附上我的NFC設備 - >它 創建一個新的活動B.

  • 我啓動MainActivity並再次關閉它。從那以後,我切換
    到瀏覽器,發射活動B和附上我的NFC設備 - > 一切工作與onNewIntent()

的代碼是正確的,例如如果我在第一個場景中連接NFC設備兩次,它將在第二次應用時運行,但不是在第一次。在MainActivity和Activity B中,我明確地調用activity的onPause()方法中的disableForegroundDispatch()方法。

有沒有解決我的特定問題的方法?對我來說,這聽起來像一個錯誤。

編輯:

public void resume(Activity targetActivity) { 
    if (nfc != null && nfc.isEnabled()) { 
     // nfc is the default NFC adapter and never null on my devices 

     Intent intent = new Intent(targetActivity, targetActivity.getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); 
     PendingIntent pendingIntent = PendingIntent.getActivity(targetActivity, 0, intent, 0); 
     nfc.enableForegroundDispatch(targetActivity, pendingIntent, null, new String[][] { new String[] { IsoDep.class.getName() } }); 
    } 
} 

public void pause(Activity targetActivity) { 
    if (nfc != null && nfc.isEnabled()) { 
     nfc.disableForegroundDispatch(targetActivity); 
    } 
} 

這些方法稱爲在每個活動的相應方法。謝謝您的幫助!

解決方案:經過很長時間的研究,我終於找到了問題。 Logcat打印:

  • startActivity從非活動上下文中調用;迫使Intent.FLAG_ACTIVITY_NEW_TASK爲:意向

我發現其他問題,在#2,那裏的人有過與NotificationManager同樣的問題,但所有的暗示並沒有幫助我。將標誌singleTask添加到我的活動B中對我來說是個竅門,但說實話我不明白,因爲上下文總是一個活動。

我刪除了MainActivity中的所有代碼,第一個方案仍然無法工作。我從清單中挑選了MainActivity,之後一切都很好。也許這是一個問題,應用程序實例正在運行,並且活動B從瀏覽器啓動?我不知道。

無論如何,感謝幫助NFC的人!

+0

請顯示您創建的PendingIntent代碼。 – 2012-04-23 11:01:28

+0

我已經添加了。提前致謝。 – vRallev 2012-04-23 11:32:48

+0

我遇到了同樣的問題...我解決了你使用SingleTask方法。我對解決方案也不是很滿意。你有沒有找到另一種解決方法? – david 2013-02-20 13:33:52

回答

2

您傳遞給enableForegroundDispatchIntentFilter[]爲空。因此,由於IntentFilter(s)在清單文件中,您的NFC意圖可能會到達您的Activity。這解釋了您觀察到的行爲,因爲NFC意圖通過這種方式始終創建新實例。

添加這樣的事情,而不是你的代碼,使前景調度:

IntentFilter[] iFilters = new IntentFilter[2]; 
iFilters[0] = new IntentFilter(); 
iFilters[0].addAction("android.nfc.action.TECH_DISCOVERED"); 
iFilters[1] = new IntentFilter(); 
iFilters[1].addAction("android.nfc.action.TAG_DISCOVERED"); 
iFilters[1].addCategory(Intent.CATEGORY_DEFAULT); 

,並傳遞作爲參數傳遞給enableForegroundDispatch

更新: 我最近了解了更多關於這個特定問題。這是由Android決定在哪個任務中啓動新的Activity所引起的。我不知道或瞭解的是如何工作的具體細節,但效果是:

  1. 當活動B從瀏覽器啓動,它是在瀏覽器的任務創建
  2. 當NFC意圖系統確定要在活動A的任務中創建新的活動B

因爲2.因此,SINGLE_TOP不會被忽略:在A任務的頂部只有一個活動B實例。當活動A關閉時,它的任務已經消失,因此活動B將始終在瀏覽器的任務中創建,如您所看到的。

在這種情況下,您可能會覺得這是一個Android錯誤(我認爲),但是這種行爲如何創建任務對於Android來說非常重要,以至於許多應用程序都依賴它。所以這種情況不太可能會改變。

可能的解決方法:用launchMode「singleTask」(或「singleInstance」)聲明活動B.然後在B啓動時創建一個新的(第三)任務。

+0

沒有,這沒有幫助。這是一個完全不同的問題(我更新了我的問題)。另外,文檔中提到:指定意圖過濾器和技術過濾器的空數組,指定您要過濾所有回退到TAG_DISCOVERED意圖的標記。所以null應該罰款在我的情況。無論如何,感謝您的幫助! – vRallev 2012-04-23 12:41:03

0

我猜你的工作流程如下:首頁 - >檢測標籤 - >讀卡器活動 - >作家活性檢測標籤 - >寫入標籤

這個問題似乎出現在你的作家活動(在一個前景啓用,我想這是爲了寫作的目的)屬於一個活動堆棧(如一個任務),這是從以前的標籤發現調用。 - >寫入標籤

我的解決方法是調用作家活動在新任務開始 主要作家活性檢測標籤:

特別是,它不一樣,如果你的工作流程如下出現。 在laucnhes作家的活動中,只需在啓動作者的意圖中添加新的任務標誌。

startActivity(new Intent(this,MyTagWriterActivity.class).addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)); 

首頁 - >檢測標籤 - >讀卡器活動-NEW_TASK->作家活性檢測標籤 - >寫入標籤

它確實惹的活動歷史,但讓筆者活動更可預測。

相關問題