我得到了一个用ndef数据格式读写nfc标签的应用程序。这一切似乎都没问题。但每当我试图将标签贴近我的手机时,它就会产生新的活动。我只想在不打开新意图的情况下获取标签上的数据。所以我可以让我的应用程序决定是否连续两次点击标记。
我处理即将发布标签的代码:
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();
}
}
}
答案 0 :(得分:3)
将android:launchMode="singleTask"
添加到<activity>
的{{1}}元素。请注意,如果活动已在投放,则会调用MainActivity
而不是onNewIntent()
来向您发送NDEF onCreate()
。因此,您需要在Intent
(如果活动尚未运行)和Intent
(如果活动已在运行)中处理NDEF onCreate()
。
This sample project说明了这项技术。
答案 1 :(得分:2)
而不是将接收NFC意图的活动的启动模式设置为&#34; singleTask&#34; (请参阅CommonsWare的回答),当应用程序处于前台时,NFC应用程序接收NFC相关意图的首选方式是foreground dispatch system(或者仅使用Android 4.4时reader mode API)
为了使用前台调度,您可以创建一个挂起的意图,如下所示:
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);