Android: действие, зарегистрированное для действия NDEF_DISCOVERED, игнорируется - PullRequest
1 голос
/ 06 января 2012

Я работаю над приложением, которое выполняет чтение и обработку определенных 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);
}

Это прекрасно работает для меня, но я все же хотел бы понять, что именно происходит, поэтому любые полезные (конечно;)) комментарии приветствуются.

1 Ответ

1 голос
/ 10 января 2012

Возможно, вы захотите прочитать о жизненном цикле деятельности и стеке:

http://developer.android.com/guide/topics/fundamentals/tasks-and-back-stack.html

...