我的Android nfc应用程序在读完智能卡后,会再次显示相同的NFC标签信息,并由操作系统再次启动。事实上,如果你不移动手机,它会进入永久循环。 正在读取的数据量需要一到两秒钟,因此最后再次启动。 (这在我的Galaxy S2 Gingerbread和我在ICS上的S3上相当普遍)
当NFC源(智能卡)没有改变且没有移开手机时,如何阻止它重复?
我的活动有一个意图过滤器:
<intent-filter >
<action android:name="android.nfc.action.TECH_DISCOVERED" />
<category android:name="android.intent.category.DEFAULT" />
<action android:name="android.nfc.action.TAG_DISCOVERED" />
</intent-filter>
<meta-data
android:name="android.nfc.action.TECH_DISCOVERED"
android:resource="@xml/filter_nfc" />
使用
的技术列表 <tech-list>
<tech>android.nfc.tech.IsoDep</tech>
</tech-list>
源代码:
@Override
protected void onCreate(Bundle savedInstanceState) {
resolveIntent(getIntent());
}
@Override
public void onNewIntent(Intent intent) {
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
}
private void resolveIntent(Intent intent) {
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
final String action = intent.getAction();
if (NfcAdapter.ACTION_TECH_DISCOVERED.equals(action)
|| NfcAdapter.ACTION_TAG_DISCOVERED.equals(action)) {
....work
handled = true;
}
if (!handled) {
Log.e(tag, "Unknown intent " + intent);
finish();
return;
}
}
答案 0 :(得分:0)
我能解决的唯一方法是在onCreate(setContentView行和resolveIntent行)内部以及onNewIntent函数内部进行时间检查。
这并没有阻止Android尝试再次调用应用来处理NFC,但是如果在上次成功读取NFC后2秒内调用它,我的应用就没有做任何事情。
可能不是最干净的方法,但它可以有效地解决循环问题并将所有测试传递到不同的设备上。
答案 1 :(得分:0)
这不正常,但我也看到了类似的行为。我尝试的是启用NFC前台调度。这使您的应用程序可以完全控制传入的NFC意图。然后根据标签的ID(或者可能是自上次NFC事件后经过的时间),您可以决定忽略该标签。
@Override
protected void onResume() {
...
ForegroundDispatch.setupForegroundDispatch(this);
}
@Override
protected void onPause() {
...
ForegroundDispatch.stopForegroundDispatch(this);
};
@Override
public void onNewIntent(Intent intent) {
... // check for the tag's ID or elapsed time to determine how to react
}