我试图用nfc功能制作应用程序。问题是当发现nfc标记时,挂起的意图总是会创建一个已经存在的新活动。我正在使用标签主机。 如何在不进行新活动的情况下制作pendingintent。 非常感谢。
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mNfcAdapter = NfcAdapter.getDefaultAdapter(this);
mNfcPendingIntent = PendingIntent.getActivity(this, 0,new Intent(this,
getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0);
}
protected void onResume() {
super.onResume();
mResumed = true;
// Sticky notes received from Android
if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(getIntent().getAction())) {
NdefMessage[] messages = getNdefMessages(getIntent());
byte[] payload = messages[0].getRecords()[0].getPayload();
try { cekNfc(new String(payload)); }
catch (SQLException e) { e.printStackTrace(); }
catch (NoSuchAlgorithmException e) { e.printStackTrace(); }
catch (UnsupportedEncodingException e) { e.printStackTrace(); }
setIntent(new Intent());
}
enableNdefExchangeMode();
}
private void enableNdefExchangeMode() { mNfcAdapter.enableForegroundDispatch(this, mNfcPendingIntent, mNdefExchangeFilters, null); }
NdefMessage[] getNdefMessages(Intent intent) { // Parse the intent
NdefMessage[] msgs = null;
String action = intent.getAction();
//jika ada action
if (NfcAdapter.ACTION_TAG_DISCOVERED.equals(action) || NfcAdapter.ACTION_NDEF_DISCOVERED.equals(action)) {
Parcelable[] rawMsgs = intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES);
if (rawMsgs != null) {
msgs = new NdefMessage[rawMsgs.length];
for (int i = 0; i < rawMsgs.length; i++) { msgs[i] = (NdefMessage) rawMsgs[i]; }
}
}
return msgs;
}
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mNfcAdapter = NfcAdapter.getDefaultAdapter(this);
mNfcPendingIntent = PendingIntent.getActivity(this, 0,new Intent(this,
getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0);
}
protected void onResume() {
super.onResume();
mResumed = true;
// Sticky notes received from Android
if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(getIntent().getAction())) {
NdefMessage[] messages = getNdefMessages(getIntent());
byte[] payload = messages[0].getRecords()[0].getPayload();
try { cekNfc(new String(payload)); }
catch (SQLException e) { e.printStackTrace(); }
catch (NoSuchAlgorithmException e) { e.printStackTrace(); }
catch (UnsupportedEncodingException e) { e.printStackTrace(); }
setIntent(new Intent());
}
enableNdefExchangeMode();
}
private void enableNdefExchangeMode() { mNfcAdapter.enableForegroundDispatch(this, mNfcPendingIntent, mNdefExchangeFilters, null); }
NdefMessage[] getNdefMessages(Intent intent) { // Parse the intent
NdefMessage[] msgs = null;
String action = intent.getAction();
//jika ada action
if (NfcAdapter.ACTION_TAG_DISCOVERED.equals(action) || NfcAdapter.ACTION_NDEF_DISCOVERED.equals(action)) {
Parcelable[] rawMsgs = intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES);
if (rawMsgs != null) {
msgs = new NdefMessage[rawMsgs.length];
for (int i = 0; i < rawMsgs.length; i++) { msgs[i] = (NdefMessage) rawMsgs[i]; }
}
}
return msgs;
}
答案 0 :(得分:8)
将android:launchMode="singleTask"
放入清单中的活动(或活动)。这就是诀窍。每当系统调度NFC意图时,始终会创建一个新的活动。这对于NFC意图来说是独一无二的。因此设置android:launchMode="singleTop"
将不起作用,也不会在PendingIntent中设置标志。
另一种解决方案是在所有活动中使用NfcAdapter.enableForegroundDispatch()。这样您的应用就可以直接处理所有NFC意图(通过onNewIntent()
)。
答案 1 :(得分:3)
试试这个:
mNotificationIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
在你的清单中:
android:launchMode="singleTask"
答案 2 :(得分:0)
创建您的待处理意图,如下所示:
PendingIntent.getActivity(this, 0,new Intent(this,
getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP
|Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT
|Intent.FLAG_ACTIVITY_REORDER_TO_FRONT), 0);
答案 3 :(得分:0)
您可以在调用“getActivity”方法时使用标记“PendingIntent.FLAG_UPDATE_CURRENT”。 I2m使用它没有问题。
答案 4 :(得分:0)
请改用此标志..
new Intent(this,
getClass()).addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY)
答案 5 :(得分:0)
我有类似的问题,但没有使用TabHost - 每次扫描NFC标签时,我的应用程序都会启动新活动,而不是按我的意愿触发onNewIntent
。我试图在清单中设置android:launchMode="singleTask"
,并在我的活动NfcAdapter.enableForegroundDispatch()
方法中使用onResume
。相反,我放弃使用PendingIntent并在清单中设置intent过滤我的活动,如下所示:
<activity
...
android:launchMode="singleTask">
<intent-filter>
<action android:name="android.nfc.action.NDEF_DISCOVERED" />
<data android:mimeType="application/vnd.myname.myapp" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
<intent-filter>
<action android:name="android.nfc.action.TECH_DISCOVERED" />
</intent-filter>
<meta-data
android:name="android.nfc.action.TECH_DISCOVERED"
android:resource="@xml/nfc_tech_filter" />
</activity>