我正在开发一个应用程序,它可以读取和处理来自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
清单:
<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进行测试
索尼克斯!
==================================================================================
编辑:我找到了一个适合我需要的解决方案,但我仍然有一个问题。
我专注于读者的活动,并评论了处理和其他正在进行的事情。下面是代码片段:
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
<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);
}这对我来说很好,但我仍然想了解到底发生了什么,所以欢迎任何有用的(当然;)评论。
发布于 2012-01-10 19:44:32
您可能想了解一下活动的生命周期和堆栈:
http://developer.android.com/guide/topics/fundamentals/tasks-and-back-stack.html
https://stackoverflow.com/questions/8759935
复制相似问题