首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Android:在NDEF_DISCOVERED操作上注册的活动被忽略

Android:在NDEF_DISCOVERED操作上注册的活动被忽略
EN

Stack Overflow用户
提问于 2012-01-06 15:11:34
回答 1查看 2.1K关注 0票数 1

我正在开发一个应用程序,它可以读取和处理来自NFC标签的特定URI。我有一个在上注册的“读取器”活动(),它从标签中读取数据,而不是启动一个使用数据操作的“数据处理”活动(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

清单:

代码语言:javascript
复制
   <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>

所以,谈谈问题吧。当我从第一个标记(例如T1)读取数据时,读取器活动通常贯穿整个生命周期,并启动数据处理活动,该活动完成其工作并显示正确的输出。当我从下一个标签(T-2或T-3)读取时,也会发生同样的情况,但是当我返回到第一个标记时,就会得到最后一个先前扫描过的标记产生的输出。

日志显示如下所示:

ActivityManager用正确的数据(来自T1)记录意图的开始,但是活动A的生命周期没有开始,而是活动B重新启动,并且接收和处理来自前一个意图的数据(通过在活动B中调用getIntent().getData() )。

在T-2和T-3之间切换时,一切都很好.

如果有人能告诉我发生了什么,我会非常感激的。在设置singleTask启动模式时,我看到了类似的行为,但我没有使用它。

我正在API v.2.3.3上开发,在Nexus上用android版本2.3.6进行测试

索尼克斯!

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

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

我专注于读者的活动,并评论了处理和其他正在进行的事情。下面是代码片段:

代码语言:javascript
复制
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上开发,我对这些概念不太熟悉,所以这可能是这里的核心问题;)我试着想办法解决这个问题,但我还是找不到合乎逻辑的解释。,如果有人能在这里解释一下我的工作流程,我将非常感激。

但是,这就是我如何解析issue...since --读取器活动可以作为一个单例--我已经将启动模式设置为singleTask

代码语言:javascript
复制
<activity
        android:label="@string/reader_nfc"
        android:name=".reader.nfc.NfcReaderActivity"
        android:stateNotNeeded="true"
        android:launchMode="singleTask"  >

并在NfcReaderActivity中做了以下更改:

代码语言:javascript
复制
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);
}

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-01-10 19:44:32

您可能想了解一下活动的生命周期和堆栈:

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8759935

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档