10
votes

L'intention en attente fait toujours une nouvelle activité

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;
        }


0 commentaires

6 Réponses :


0
votes

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);


1 commentaires

Avez-vous également essayé de définir android: launleMode = "singletop" à votre activité dans Manifest?



0
votes

Vous pouvez utiliser le drapeau "pkinting.flag_update_current" tout en appelant la méthode "getactivité". I2m en utilisant sans problème.


6 commentaires

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 ??



0
votes

Utilisez ce drapeau à la place ..

new Intent(this,
    getClass()).addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY)


0 commentaires

10
votes

Mettez Android: LaunleMode = "SingleTask" 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" ne fonctionnera pas, pas plus que des drapeaux dans le Passoire.

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 OnNewIntent () ).


4 commentaires

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 ?


Désolé, je voulais dire: Quelle est leur valeur.


Est "rien" une liste vide ou null ? Une valeur de null 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.



3
votes

Essayez ceci: xxx

et dans votre manifeste: xxx


1 commentaires

Android: LaunleMode = "singletsk" suffit



0
votes

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>


0 commentaires