Я работаю над приложением, которое выполняет чтение и обработку определенных URI из тегов NFC. У меня есть активность "reader" ( A ), зарегистрированная в NDEF_DISCOVERED, которая считывает данные из тега и затем запускает операцию "обработка данных" ( B ), которая работает с данными.
В настоящее время у меня есть три тега, каждый с другим URI, точнее с той же схемой и путем, но с разными данными запроса -> tagID:
T-1: mySchema: //gman.com/path? Id = T-1
T-2: mySchema: //gman.com/path? Id = T-2
T-3: mySchema: //gman.com/path? Id = T-3
Manifest:
<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), но жизненный цикл действия A не запускается, вместо этого действие B перезапускается, и данные из предыдущего намерения принимаются и обрабатывается (вызывая getIntent (). getData () в действии B).
При переключении между T-2 и T-3 все работает нормально.
Я был бы очень признателен, если бы кто-нибудь объяснил мне, что происходит. Я видел похожее поведение при установке режима запуска singleTask, но я им не пользуюсь.
Я занимаюсь разработкой API v.2.3.3, тестирую на Nexus-S с версией Android 2.3.6
Thnx!
=============================================== ===================================
РЕДАКТИРОВАТЬ : Я нашел решение по моей проблеме, которое соответствует моим потребностям, но у меня все еще есть вопрос.
Я сосредоточился на деятельности читателя и прокомментировал обработку и другие вещи, которые происходили. Вот фрагмент кода:
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 () и я получаю данные из намерения (метод readSource), метод getIntent () возвращает то же намерение, полученное при сканировании предыдущего тега.
Я только недавно начал разрабатывать на 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);
}
Это прекрасно работает для меня, но я все же хотел бы понять, что именно происходит, поэтому любые полезные (конечно;)) комментарии приветствуются.