2014-02-05 7 views
5

Ich implementiere die NFC in Android-Projekt. Ich habe die Einträge geschrieben, die in der AndroidManifest.xml und Java-Code erforderlich sind.Methode onNewIntent (Absicht) nicht in NFC ausgeführt

Wenn ein Tag in die Nähe des Geräts kommt, erkennt meine App das Tag, dann öffnet es die Aktivität, aber hier bekomme ich NFC Tag Info, aber onNewIntent wird nicht ausgeführt.

Bitte teilen Sie Ihre Ansichten.

public class NFCActivity extends Activity { 

    private NfcAdapter mNFCAdapter; 
    private PendingIntent mNfcPendingIntent; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_nfc); 

     // Create the OpenSqliteHelper object. It always best to create only 
     // once instance of this OpenSqliteHelper 
     DatabaseManager.init(this); 

     mNFCAdapter = NfcAdapter.getDefaultAdapter(this); 

     if (mNFCAdapter == null) { 
      // Device does not support NFC 
      Toast.makeText(this, 
        getString(R.string.device_does_not_support_nfc), 
        Toast.LENGTH_LONG).show(); 
     } else { 
      if (!mNFCAdapter.isEnabled()) { 
       // NFC is disabled 
       Toast.makeText(this, getString(R.string.enable_nfc), 
         Toast.LENGTH_LONG).show(); 
      } else { 
       mNfcPendingIntent = PendingIntent.getActivity(NFCActivity.this, 
         0, new Intent(NFCActivity.this, NFCActivity.class) 
           .addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0); 
      } 
     } 
     finish(); 
    } 

    @Override 
    protected void onNewIntent(Intent intent) { 
     Tag mTag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG); 
    } 

    @Override 
    protected void onPause() { 
     super.onPause(); 
     mNFCAdapter.disableForegroundDispatch(this); 
    } 

    @Override 
    public void onResume() { 
     super.onResume(); 
     mNFCAdapter.enableForegroundDispatch(this, mNfcPendingIntent, null, 
       null); 
    } 
} 

AndroidManifest.xml

<activity 
    android:name="net.livepatrols.thepartnerSA.NFCActivity" 
    android:theme="@android:style/Theme.NoDisplay" > 
    <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" /> 

    <intent-filter> 
     <action android:name="android.nfc.action.TAG_DISCOVERED" /> 

     <category android:name="android.intent.category.DEFAULT" /> 
    </intent-filter> 
</activity> 
+0

Versuch in Aktivitäts-Tag android Zugabe: launchMode = "SingleInstance" oder android: launchMode = "singleTop", wenn Ausgabe onNewIntent verwandt ist, es wird – TheLittleNaruto

+0

lösen Es ist bereits singleTop '.addFlags (Intent.FLAG_ACTIVITY_SINGLE_TOP) , 0); 'hier –

+0

kurze Version ist - setzen Sie die einzige obere Flagge in der Absicht und im Manifest. [Referenz] (http://stackoverflow.com/questions/4020909/bug-onnewintent-not-called-for-selletop-activity-with-intent-flag-activity-new) – TheLittleNaruto

Antwort

6

Von dem, was ich sehe, Ihre Tätigkeit nicht der Launcher ist, so verstehe ich, dass Sie Ihre Aktivität gestartet werden soll, wenn ein Tag entdeckt. Der Code funktioniert gut, wenn Ihre Aktivität im Vordergrund ist, aber wenn die Aktivität durch eine Absicht mit android.nfc.action.XXX_DISCOVERED gestartet wird, ruft sie nicht onNewIntent() auf. Sie sollten die nfc-Logik für eine andere Methode ausführen und sie onCreate() und onNewIntent() aufrufen.

public class NFCActivity extends Activity { 

    private NfcAdapter mNFCAdapter; 
    private PendingIntent mNfcPendingIntent; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     ... 
     performTagOperations(getIntent()); 
    } 

    @Override 
    protected void onNewIntent(Intent intent) { 
     performTagOperations(intent); 
    } 

    private void performTagOperations(Intent intent){ 
     String action = intent.getAction(); 
     if(action.equals(NfcAdapter.ACTION_TAG_DISCOVERED) || 
     action.equals(NfcAdapter.ACTION_TECH_DISCOVERED)){ 
      PERFORM TAG OPERATIONS 
     } 
    } 
    ... 
}