我正在创建一个也会使用NFC来阅读特定标签的应用。我有一个父活动类,我想把函数放在:
public String scanTagId(){...}
我能够从tag获得tagID问题,因为它只发生在onNewIntent上,所以实际上首先它会完成scanTagId()函数,然后实际调用onNewIntent。所以问题是如何编写scanTagId()来实际等待从NFC标签读取标签ID并返回带有此标签ID的字符串。
也许我需要以某种方式以不同的方式处理这个问题,或者这是不可能的 - 但是现在我试图解决这个问题让我很头疼:)
答案 0 :(得分:0)
正如您所说,通常通过onNewIntent
处理NFC。它的工作原理如下:每当手机检测到新的NFC标签(与您的过滤器匹配)时,TAG就会连接,您的应用会通过onNewIntent
获得对TAG的引用。因此,您不需要额外的函数scanTagId(),因为设备已经一直在为TAG扫描。
如果您要禁用该应用获得通知,您可以这样做:
if (mNfcAdapter != null) {
mNfcAdapter.disableForegroundDispatch(this);
}
如果您想通过onNewIntent
(重新)启用有关新TAG的通知,可以使用以下代码:
if (mNfcAdapter != null) {
mNfcAdapter.enableForegroundDispatch(this, mPendingIntent, mFilters, mTechLists);
}
如果你仍然必须拥有你提到的功能,我会将TAG-Id存储在一个实例变量中并实现如下函数:
protected String mLastTagId = "";
protected synchronized void setLastTagId(String id) {
mLastTagId = id;
}
public synchronized String scanTagId(){
return mLastTagId;
}
请注意,此功能不会等待连接TAG,而只会返回过去找到的最后一个TAG的ID。
另一种方法是将onNewIntent
和scanTagId
- 函数与wait()
和notifyAll()
同步。我假设你想从主线程调用你的函数。结合同步,这是一件非常危险的事情,因此我严格建议不要这样做。它会让你的主线程进入睡眠状态,这会导致android通知用户(“应用程序没有响应”)甚至退出你的应用程序。至少你的应用程序不会响应UI事件。
如果您使用AsyncTask
,可以避免这些影响。但我真的建议重新考虑你的设计并为异步事件做好准备。
你想要在第一时间实现什么目标?
如果您想在未找到TAG的情况下经过特定时间后退出活动,则可以使用Timer
:
protected String tag = null;
protected Timer timer = new Timer();
在你的onCreate方法中激活计时器:
timer.schedule(new TimerTask() {
public void run() {
AlertDialog.Builder b = new AlertDialog.Builder(MyActivity.this);
b.setTitle("Timeout").setMessage("Nothing found");
b.setPositiveButton("OK", new OnClickListener() {
MyActivity.finish();
});
b.setCancelable(false);
b.create().show();
}, 10000);
此代码尚未经过测试。