J'essaie de faire une application avec la fonction NFC. Le problème est que lorsque la balise NFC a découvert, l'intention en attente fait toujours une nouvelle activité qui existe déjà. J'utilise l'hébergeur d'onglets. Comment faire en sorte que de faire une nouvelle activité sans faire une nouvelle activité. merci beaucoup.
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; }
6 Réponses :
Créez votre intention en attente comme ci-dessous:
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);
Avez-vous également essayé de définir android: launleMode = "singletop" code> à votre activité dans Manifest?
Vous pouvez utiliser le drapeau "pkinting.flag_update_current" tout en appelant la méthode "getactivité". I2m en utilisant sans problème. P>
Je suppose que vous mettez le drapeau à l'intention.addddflag de ce que je vois de votre code et des autres réponses. Il devrait être mis au lieu du dernier drapeau "0" dans PLINCTIONSINTENT.GETACTIVITÉ
une autre suggestion. essayez "inent.flag_activity_new_task" dans l'intention.adddflags Méthode cette fois lors de la création de l'intention.
OK, il n'est pas lié à la création d'une intention en attente si vous utilisez ActiveFforefindisPatch et OnNewIntent est appelé. Je ne sais pas grand chose à propos de NFC, mais je l'utiliserai probablement bientôt au travail; Donc je suis intéressé. Pouvez-vous me dire pourquoi vous utilisez seintent (nouvel intention ())
Je ne sais pas, je reçois cela de l'exemple Android NFC. Je ne comprends pas vraiment à propos de NFC, je suis nouveau.
J'ai demandé parce que je ne l'ai pas vu jusqu'à présent dans d'autres postes sur Stackoverflow. Je ne connais pas les détails, mais essayez de téléphoner en acierforefindispatch dans le premier appel de cette activité (peut-être dans Oncreate). Si cette méthode n'est pas appelée, la méthode OnNewIntente n'est pas appelée alors onResume n'est pas appelée.
Est-il possible qu'il y a un problème dans mon filtre d'intention ??
Utilisez ce drapeau à la place ..
new Intent(this, getClass()).addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY)
Mettez Une autre solution consiste à utiliser NFCADAPTER.NABLOFFROUNDDISPATCH () dans toutes vos activités. De cette façon, votre application permet de gérer directement toutes les intentions NFC directement (via Android: LaunleMode = "SingleTask" code> pour votre activité (ou vos activités) dans le manifeste. Ça fait l'affaire. Chaque fois qu'une intention NFC est expédiée par le système, une nouvelle activité sera toujours créée. Ceci est unique pour les intentions NFC. Donc, réglage
Android: LaunleMode = "SingleTop" code> ne fonctionnera pas, pas plus que des drapeaux dans le Passoire. P>
OnNewIntent () code>). P>
J'ai essayé Android: LaunleMode = "SingleSksk" mais toujours, ne fonctionne pas et utilisait NFCADAPTER.NABLOFRONFORDDISPATCH () mais ne semble pas fonctionner.
Comment avez-vous défini mndefexchangefilters code>?
Désolé, je voulais dire: Quelle est leur valeur.
Est "rien" une liste vide ou null code>? Une valeur de
null code> agirait une carte générique, correspondant à tout. Je ne suis pas sûr de quoi le résultat d'une liste vide est. Peut-être que cela ne résulte pas de quoi que ce soit correspondant à quoi que ce soit, il serait donc de contourner l'envoi de premier plan.
Essayez ceci: et dans votre manifeste: p>
Android: LaunleMode = "singletsk" code> suffit
J'ai eu un problème similaire mais n'utilise pas un tabhost - chaque fois qu'une balise NFC a été scannée mon application lançait une nouvelle activité plutôt que de tirer surNewIntent code> comme je le souhaite. J'essayais de définir
Android: LaunleMode = "SingleTask" code> dans le manifeste et utilisez
nfcadapter.NableForeForeDisPatch () code> dans mes activités
Onresume code> méthode. Au lieu de cela, j'ai abandonné à l'aide de l'intention et de configurer l'intention de filtre mon activité dans le manifeste comme suit:
<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>