2012-04-11 30 views
5

Estoy tratando de hacer la aplicación con la función nfc. El problema es cuando se descubre la etiqueta nfc, el intento pendiente siempre crea una nueva actividad que ya existe. Estoy usando tab host. cómo hacer que pendingintent sin hacer una nueva actividad. muchas gracias.intención pendiente siempre hacer actividad nueva

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

Respuesta

0

Cree su intención a la espera de la siguiente manera:

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

ya lo intento, pero no funciona. – user1326288

+0

¿También intentó configurar 'android: launchMode =" singleTop "' a su actividad en manifiesto? – waqaslam

+0

acabo de hacerlo, pero no funciona. – user1326288

0

puede utilizar la bandera "PendingIntent.FLAG_UPDATE_CURRENT" al llamar al método "getActivity". I2m usándolo sin ningún problema.

+0

ya lo intento, pero no funciona. – user1326288

+0

supongo que pones la bandera en Intent.addFlag por lo que veo en tu código y en las otras respuestas. se debe poner en lugar de la última bandera "0" en PendingIntent.getActivity – cagla

+0

todavía, no funciona. – user1326288

0

uso esta bandera en su lugar ..

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

ya lo intento, pero no funciona. – user1326288

7

Deja android:launchMode="singleTask" para su actividad (o actividades) en el manifiesto. Eso hace el truco. Siempre que el sistema envíe un intento de NFC, siempre se creará una nueva actividad. Esto es único para los intentos de NFC. Por lo tanto, el ajuste android:launchMode="singleTop" no funcionará, ni los indicadores de configuración en PendingIntent.

Otra solución es usar NfcAdapter.enableForegroundDispatch() en todas sus actividades. De esta forma, su aplicación maneja todos los intentos de NFC directamente (a través del onNewIntent()).

+0

intenté android: launchMode = "singleTask" pero aún así, no funciona y usé NfcAdapter.enableForegroundDispatch() pero parece que no funciona. – user1326288

+0

¿Cómo definió 'mNdefExchangeFilters'? –

+0

solo uso IntentFilter [] mNdefExchangeFilters. ¿esta mal? – user1326288

2

Prueba esto:

mNotificationIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP); 

Y en su manifiesto:

android:launchMode="singleTask" 
+1

'android: launchMode =" singleTask "' es suficiente – tbruyelle

0

que tenía un problema similar, pero no el uso de un TabHost - cada vez que una etiqueta NFC se escaneó mi aplicación fue el lanzamiento de un nuevo actividad en lugar de disparar onNewIntent como yo quería. Intenté establecer android:launchMode="singleTask" en el manifiesto y uso NfcAdapter.enableForegroundDispatch() en mi método de actividades onResume. En cambio, abandoné el uso de PendingIntent y configuré los filtros de intención de mi actividad en el manifiesto de la siguiente manera:

<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> 
Cuestiones relacionadas