2012-01-06 66 views
1

我正在研究一個應用程序,它可以讀取和處理來自NFC標籤的特定URI。我有一個在NDEF_DISCOVERED上註冊的「讀者」活動(A),它從標籤讀取數據,並啓動與數據一起運行的「數據處理」活動(B)。Android:在NDEF_DISCOVERED操作上註冊的活動被忽略

目前我有三個標籤,每一個不同的URI,更具體地具有相同的架構和路徑,但使用不同的查詢數據 - >的TAGID:

T-1:MYSCHEMA:// GMAN的.com /路徑 ID = T-1
T-2:MYSCHEMA://gman.com/path ID = T-2
T-3:MYSCHEMA://gman.com/path?id = T-3

清單:

<activity 
     android:label="@string/reader_nfc" 
     android:name=".reader.nfc.NfcReaderActivity" 
     android:stateNotNeeded="true" > 
     <intent-filter> 
      <action android:name="android.nfc.action.NDEF_DISCOVERED" /> 
      <category android:name="android.intent.category.DEFAULT" /> 
      <data android:scheme="mySchema" /> 
     </intent-filter> 
    </activity> 
    <activity 
     android:label="@string/data_manager_name" 
     android:name=".data.handlers.DataHandlerActivity" > 
    </activity> 

因此,要解決這個問題。當我從第一個標籤(例如T-1)讀取數據時,閱讀器活動正常運行到生命週期,並啓動執行其工作並顯示正確輸出的數據處理活動。當我從下一個標籤(T-2或T-3)讀取時會發生同樣的事情,但是當我返回到第一個標籤時,我會得到最後一次掃描標籤產生的輸出。

日誌顯示是這樣的:

ActivityManager記錄了使用正確的數據的意圖的開始(從T-1),但不`噸上手活動的生命週期,而不是活動B重新啓動並從前一個意圖中接收和處理數據(通過在活動B中調用getIntent()。getData())。

當在T-2和T-3之間切換時,一切正常。

我真的很感激,如果有人解釋我發生了什麼事情。我在設置singleTask啓動模式時看到了類似的行爲,但我沒有使用它。

我真的制定有關API v.2.3.3,採用Android 2.3.6版本

日Thnx在Nexus-S測試!

============================================== ============================================================

編輯:我找到了我的解決方案這個問題符合我的需求,但我還有一個問題。

我專注於讀者活動,並評論了處理和其他正在發生的事情。下面是一小段代碼片段:

public class NfcReaderActivity extends Activity { 

private static final String TAG = "NfcReaderActivity"; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    Log.d(TAG, "onCreate"); 
    setContentView(R.layout.nfc_reader); 
} 

@Override 
protected void onStart() { 
    super.onStart(); 
    Log.d(TAG, "onStart"); 

    readAndHandleData(); 
} 

protected void readAndHandleData() { 
    NdefMessage[] srcObj = readSource(); 

    if (srcObj != null) { 
     Uri srcData = getSrcData(srcObj); 
     launchSourceManagerActivity(srcData); 
    } else { 
     Log.w(TAG, "srcObj was null!"); 
    } 
} 

public NdefMessage[] readSource() { 

    Parcelable[] rawMsgs = getIntent().getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES); 
    NdefMessage[] ndefMsgs = null; 
    // store NdefMessage-s from rawMsgs in ndefMsgs 
    return ndefMsgs ; 
} 

public void launchSourceManagerActivity(Uri srcData) { 
    // launches DataHandlerActivity with srcData 
} 

public Uri getSrcData(NdefMessage[] src) { 
    // returns the data from the tag rapresented as Uri 
} 

}

這樣我得到了一些額外的日誌後(不知道爲什麼,但我想這並不重要),並看到,當我返回第一個標籤,活動重新啓動(onRestart()被調用),而在另外兩種情況下,當掃描第二個和第三個標籤時,活動被重新創建(調用onCreate())。

當onRestart()被調用並從intent(readSource方法)中檢索數據時,getIntent()方法返回掃描前一個標記時收到的同一個intent。

我剛剛開始在Android上開發,我對這些概念不太熟悉,所以也許這是這裏的核心問題;)。我試圖弄清楚這一點,但我無法得到合理的解釋。 如果有人能在這裏向我解釋工作流程,我會非常感激。

不過,我這是怎麼解決這個問題?因爲讀者活動可以爲我設置啓動模式爲singleTask

<activity 
     android:label="@string/reader_nfc" 
     android:name=".reader.nfc.NfcReaderActivity" 
     android:stateNotNeeded="true" 
     android:launchMode="singleTask" > 

,做在NfcReaderActivity以下更改一個單作用:

public class NfcReaderActivity extends Activity { 

private static final String TAG = "NfcReaderActivity"; 

/** 
* override onNewIntent method and store the new intent as the current intent 
*/ 
@Override 
protected void onNewIntent(Intent intent) { 
    super.onNewIntent(intent); 
    Log.d(TAG, "onNewIntent"); 
    // set the intent as the current intent, so new data (EXTRA_NDEF_MESSAGES) can 
//be accessed when calling getIntent() in readSource method 
    setIntent(intent); 
} 

這工作對我很好,但我還是想了解究竟發生了什麼,所以任何有用的(當然,))的評論是值得歡迎的。

+0

你能張貼您的活動代碼?我很確定你的問題在java文件中。 – 2012-01-06 17:19:28

回答