Чтение меток NFC
Я получил приложение, которое читает и пишет теги NFC с форматом данных NDEF. Кажется, все в порядке. Но всякий раз, когда я пытаюсь приблизить тег к своему телефону, он вызывает новую активность. Я только хочу получить данные по тегу без открытия новых намерений. Таким образом, я могу сделать так, чтобы мое приложение решало, был ли тег отмечен два раза подряд.
Код, который я обрабатываю ближайшие теги:
public class MainActivity extends Activity {
public static Context myContext;
private Button myButton;
private int currentID, currentBalance;
protected void onCreate(Bundle savedInstanceState) { // Firstly Created when
// a tag tapped to
// the phone
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
myButton = (Button) findViewById(R.id.button1);
currentID = 0;
currentBalance = 0;
myButton.setOnClickListener(new View.OnClickListener() { // Tag write
// function
// places
// here
public void onClick(View arg0) {
Intent i = new Intent(getApplicationContext(), nfcWrite.class);
i.putExtra("id",currentID);
i.putExtra("balance",currentBalance);
startActivity(i);
}
});
}
@Override
protected void onResume() {
// TODO Auto-generated method stub
super.onResume();
Intent intent = getIntent();
if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(getIntent().getAction())) {
Parcelable[] rawMsgs = intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES);
NdefRecord myRecord = ((NdefMessage) rawMsgs[0]).getRecords()[0];
String nfcData = new String(myRecord.getPayload());
String[] splitData = nfcData.split("-");
currentID = Integer.parseInt(splitData[0]);
currentBalance = Integer.parseInt(splitData[1]);
Toast.makeText(getApplicationContext(), nfcData, Toast.LENGTH_LONG).show();
}
}
}
2 ответа
Добавлять android:launchMode="singleTask"
к <activity>
элемент для MainActivity
, Обратите внимание, что если действие уже выполняется, onNewIntent()
будет называться, а не onCreate()
, чтобы доставить NDEF Intent
тебе. Следовательно, вам нужно будет обработать NDEF Intent
в обоих onCreate()
(если действие еще не было запущено) и onNewIntent()
(если активность уже запущена).
Этот пример проекта иллюстрирует технику.
Вместо установки режима запуска действия, которое получает намерения NFC, на "singleTask" (см. Ответ CommonsWare), предпочтительным способом для приложений NFC получать намерения, связанные с NFC, пока приложение находится на переднем плане, является система диспетчеризации переднего плана (или в качестве альтернативы API режима чтения при использовании только Android 4.4).
Чтобы использовать диспетчеризацию переднего плана, вы должны создать отложенное намерение, например:
PendingIntent pendingIntent = PendingIntent.getActivity(
this,
0,
new Intent(this, getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP),
0);
Затем в вашей деятельности onResume()
метод, вы бы включили диспетчеризацию переднего плана следующим образом:
NfcAdapter nfcAdapter = NfcAdapter.getDefaultAdapter(this);
nfcAdapter.enableForegroundDispatch(this, pendingIntent, null, null);
После этого вы будете получать уведомления о найденных тегах через действия onNewIntent()
метод:
public void onNewIntent(Intent intent) {
...
}
Кроме того, вы должны отключить отправку переднего плана в вашей деятельности onPause()
метод:
NfcAdapter nfcAdapter = NfcAdapter.getDefaultAdapter(this);
nfcAdapter.disableForegroundDispatch(this);