我正在研究一個應用程序,它可以讀取和處理來自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);
}
這工作對我很好,但我還是想了解究竟發生了什麼,所以任何有用的(當然,))的評論是值得歡迎的。
你能張貼您的活動代碼?我很確定你的問題在java文件中。 – 2012-01-06 17:19:28