我正在处理的应用程序应该接收一个波束,然后从onResume调用processIntent(intent)函数。我遇到的问题是,当它收到光束时,会打开一个全新的应用实例,而不是只停留在活动中(我已经调用了enableForegroundDispatch)。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mNfcAdapter = NfcAdapter.getDefaultAdapter(this);
if (mNfcAdapter == null){
Toast.makeText(this, "No NFC on this device", Toast.LENGTH_LONG).show();
}
// Create a PendingIntent object so the Android system can populate it with the details of the tag when it is scanned.
pendingIntent = PendingIntent.getActivity(this, 0, new Intent(this, getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0);
// Declare intent filters to handle the intents that the developer wants to intercept.
IntentFilter ndef = new IntentFilter(NfcAdapter.ACTION_NDEF_DISCOVERED);
try {
ndef.addDataType("application/com.sample.mime/string");
} catch (MalformedMimeTypeException e) {
Log.wtf("mimeexception", e);
e.printStackTrace();
}
intentFiltersArray = new IntentFilter[] {ndef};
... ...
}
public void onResume() {
super.onResume();
// Enable the foreground dispatch when the Activity regains focus.
NfcAdapter.getDefaultAdapter(this).enableForegroundDispatch(this, pendingIntent, intentFiltersArray, null);
if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(getIntent().getAction())) {
processIntent(getIntent());
}
}
public void onPause() {
super.onPause();
// Disable the foreground dispatch when the Activity loses focus.
NfcAdapter.getDefaultAdapter(this).disableForegroundDispatch(this);
}
void processIntent(Intent intent){
// do stuff
}
这是清单中的活动
<activity
android:name="com.example.app.opensthisonebutshouldnt"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name="com.example.app.shouldopenthisone"
android:label="@string/title_activity_create_invoice"
android:launchMode="singleTop" >
<intent-filter>
<action android:name="android.nfc.action.NDEF_DISCOVERED" />\
<category android:name="android.intent.category.DEFAULT" />\
<data android:mimeType="application/com.example.nfctest/invoice" />
</intent-filter>
</activity>
感谢输入
答案 0 :(得分:1)
application/com.sample.mime/string
(在ndef.addDataType(...);
中使用)看起来不像是有效的MIME类型。你确定你要打这种类型吗?即使你这样做,我也不确定Android是否能够处理它。接近您的有效MIME类型为application/com.sample.mime
(没有/string
部分)。这同样适用于/invoice
的{{1}}部分。
如果您的前台调度意图过滤器与Beamed NDEF消息的第一条记录不匹配,您的应用可能会根据清单中的意图过滤器接收NFC事件。请注意,application/com.example.nfctest/invoice
意图过滤器仅匹配NDEF消息的第一条记录。
如果Beamed消息包含AAR(Android应用程序记录),并且您的NFC相关意图过滤器都不匹配Beamed NDEF消息的第一条记录,则在您的将启动具有类别NDEF_DISCOVERED
的启动MAIN
的意图过滤器的清单。 这似乎发生在您的情况下。因此请仔细检查您的前台调度是否与传入的NDEF消息实际匹配。否则,您的活动可能会根据应用清单中的定义重新启动。
检查LAUNCHER
中的getIntent()
只检查当前与您的活动相关联的意图(即最初开始您的活动或使用onResume()
注册的意图)您的活动已恢复。但是,您注册的前台发送的事件将会在您的活动setIntent(...)
方法中显示。因此,您需要覆盖该方法并在那里处理NFC事件:
onNewIntent()