Android:在 NDEF_DISCOVERED 操作上注册的 Activity 被忽略

标签 android android-intent nfc android-activity

我正在开发一个应用程序,它可以读取和处理来自 NFC 标签的特定 URI。我在 NDEF_DISCOVERED 上注册了一个“阅读器” Activity (A),它从标签中读取数据,然后启动一个“数据处理” Activity (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

list :

   <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)读取数据时,读取器 Activity 通常会通过生命周期并启动数据处理 Activity ,该 Activity 完成其工作并显示正确的输出。当我从下一个标签(T-2 或 T-3)读取时会发生同样的事情,但是当我返回到第一个标签时,我会得到上次扫描的标签产生的输出。

日志显示如下:

ActivityManager 使用正确的数据(来自 T-1)记录 Intent 的开始,但是 Activity A 的生命周期没有开始,而是 Activity B 重新启动并且来自先前 Intent 的数据是接收并处理(通过在 Activity B 中调用 getIntent().getData())。

在 T-2 和 T-3 之间切换时一切正常。

如果有人向我解释发生了什么,我将不胜感激。我在设置 singleTask 启动模式时看到了类似的行为,但我没有使用它。

我在 API v.2.3.3 上开发,在 Nexus-S 上测试 android 版本 2.3.6

谢谢!

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

编辑:我找到了适合我需要的解决方案,但我还有一个问题。

我专注于读者 Activity 并评论了处理和其他正在发生的事情。这是代码 fragment :

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
}

这样做之后我得到了一些额外的日志(不知道为什么,但我想这不是那么重要),并且看到当我返回到第一个标签时, Activity 重新启动(onRestart() 是调用),而在其他两种情况下,当扫描第二个和第三个标签时,将重新创建 Activity (调用 onCreate())。

当调用 onRestart() 并且我从 Intent (readSource 方法)检索数据时,getIntent() 方法返回扫描前一个标签时收到的相同 Intent 。

我最近才开始在 Android 上开发,我对这些概念不是很熟悉,所以这可能是这里的核心问题 ;)。我试图弄清楚这一点,但我无法得出合乎逻辑的解释。 如果有人能向我解释这里的工作流程,我将不胜感激。

但是,这就是我解决问题的方式...因为阅读器 Activity 可以充当单例,所以我将启动模式设置为 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);
}

这对我来说很好,但我仍然想了解到底发生了什么,所以欢迎任何有用的(当然 ;) )评论。

最佳答案

您可能想阅读有关 Activity 生命周期和堆栈的信息:

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

关于Android:在 NDEF_DISCOVERED 操作上注册的 Activity 被忽略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8759935/

相关文章:

java - 错误 :(23, 26) 不允许字符串类型(位于 'src' ,值为 'pen' )。

java - android.view.InflateException : Not able to inflate the fragment

android - 拍照后返回 fragment

java - 使用 PICK_CONTACT 运行第二种情况

java - Android NFC 读卡器给出 "avc: denied"

nfc - 根据 ATR 确定卡类型

Android:在 fragment 内使用 GLSurfaceView

java - onActivityResult() 和 : failure delivering result resultinfo who=null request=1 result=-1 data=intent (has extras)

android - 如何在Android中切换没有动画的 Activity ?

c# - ProximityDevice 未找到索尼 RC-S380 NFC 读写器