我有两项活动。我想使用第一个活动(如MainAcitivity
)来读卡,第二个活动是写卡。因为在发现卡时活动需要处于活动状态。因此,我使用以下设置进行这两项活动:
</intent-filter>
<!-- Handle notes detected from outside our application -->
<intent-filter>
<action android:name="android.nfc.action.NDEF_DISCOVERED" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="text/plain" />
</intent-filter>
然而,我的问题是,当我进行第二项活动并且我扫描NFC卡时,手机将显示第一项和第二项活动的意图选择器。
那么,如何通过代码在第二个活动(反过来)中禁用第一个活动的NDEF_DISCOVERED
意图过滤器?
这是完整的AndroidManifest文件:
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".FirstActivity"
android:label="@string/app_name"
android:configChanges="orientation|screenSize|screenLayout"
>
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<!-- Handle notes detected from outside our application -->
<intent-filter>
<action android:name="android.nfc.action.NDEF_DISCOVERED" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="text/plain" />
</intent-filter>
</activity>
<activity
android:name=".SecondActivity"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.nfc.action.NDEF_DISCOVERED" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="text/plain" />
</intent-filter>
</activity>
</application>
答案 0 :(得分:0)
为了强制当前位于前台的活动接收NFC发现事件,您可以使用foreground dispatch system或reader-mode API。
如果当前位于前台,这两种方法都会在接收NFC发现事件时赋予活动优先权。
例如,你可以使用类似的东西:
public void onResume() {
super.onResume();
NfcAdapter nfcAdapter = NfcAdapter.getDefaultAdapter(this);
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, new Intent(this, getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0);
// to catch all NFC discovery events:
nfcAdapter.enableForegroundDispatch(this, pendingIntent, null, null);
// or to only catch text/plain NDEF records (as you currently do in your manifest):
//IntentFilter ndef = new IntentFilter(NfcAdapter.ACTION_NDEF_DISCOVERED);
//try {
// ndef.addDataType("text/plain");
//} catch (MalformedMimeTypeException e) {}
//nfcAdapter.enableForegroundDispatch(this, pendingIntent, new IntentFilter[] { ndef }, null);
}
public void onPause() {
super.onPause();
NfcAdapter nfcAdapter = NfcAdapter.getDefaultAdapter(this);
nfcAdapter.disableForegroundDispatch(this);
}
public void onNewIntent(Intent intent) {
if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(intent.getAction()) ||
NfcAdapter.ACTION_TECH_DISCOVERED.equals(intent.getAction()) ||
NfcAdapter.ACTION_TAG_DISCOVERED.equals(intent.getAction())) {
// handle NFC events ...
}
}
此外,如果您不希望NFC发现事件启动活动,则无需在该活动的主要活动中声明android.nfc.action.*_DISCOVERED
意图过滤器。