我正在开发一个应用程序,它可以读取和处理来自 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/