Android launch activity multiple times on an NFC tag

android, android-intent, nfc

Solution

I found the answer finally after trying everything.

The answer is to set the activity to android:launchmode="singleTask", and in the code in onNewIntent add the lines:

intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);

Problem

My Android app has 2 activities, a main one for info and one for receiving NFC. When launching the app for the first time, I can read NFC tags, multiple times - each time bringing up a new activity and showing some info. If the app is closed but the phone is brought to the NFC tag - it will show the nfc tag activity the first time, but never respond to any other tags again. What am I doing wrong?! Manifest part and code for second activity: ``` <uses-sdk android:minSdkVersion="10" /> <uses-permission android:name="android.permission.NFC" /> <uses-feature android:name="android.hardware.nfc" android:required="true" /> <application android:icon="@drawable/aaa" android:label="@string/app_name" android:theme="@android:style/Theme.NoTitleBar"> <activity android:label="@string/app_name" android:name=".MainActivity"> <intent-filter > <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name=".TagDiscoveredActivity" android:screenOrientation="portrait"> <intent-filter > <action android:name="android.nfc.action.TECH_DISCOVERED" /> <action android:name="android.nfc.action.TAG_DISCOVERED" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> <meta-data android:name="android.nfc.action.TECH_DISCOVERED" android:resource="@xml/filter_nfc" /> </activity> </application> </manifest> ``` The code ``` public class TagDiscoveredActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.info); etc } @Override public void onNewIntent(Intent intent) { setIntent(intent); resolveIntent(intent); } private void resolveIntent(Intent intent) { intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); //| Intent.FLAG_ACTIVITY_SINGLE_TOP); boolean handled = false; // Parse the intent final String action = intent.getAction(); if (NfcAdapter.ACTION_TECH_DISCOVERED.equals(action) || NfcAdapter.ACTION_TAG_DISCOVERED.equals(action)) { // When a tag is discovered we send it to the service to be save. We // include a PendingIntent for the service to call back onto. This // will cause this activity to be restarted with onNewIntent(). At // that time we read it from the database and view it. Parcelable nfctag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG); if (nfctag != null) { //read tag and display here } } } if (!handled) { Log.e(logTag, "Unknown intent " + intent); finish(); return; } } ``` When I run it and log for the second scenario - launching direct from NFC without the app running - the log shows it working first time, but the second time, none of the functions are logging anything. Thank you for any helpful suggestions.

Original source