我试图与NFC功能的应用程序。问题是,当NFC标签发现,悬而未决的意图总是让已经存在一个新的活动。我使用标签主机。 如何使pendingintent不作新的活动。 非常感谢。
公共无效的onCreate(包savedInstanceState){
super.onCreate(savedInstanceState);
的setContentView(R.layout.main);
mNfcAdapter = NfcAdapter.getDefaultAdapter(本);
mNfcPendingIntent = PendingIntent.getActivity(此,0,新的意向(这一点,
。的getClass())addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP),0);
}
保护无效onResume(){
super.onResume();
mResumed = TRUE;
从安卓收到//便签
如果(NfcAdapter.ACTION_NDEF_DISCOVERED.equals(getIntent()。的getAction())){
NdefMessage []消息= getNdefMessages(getIntent());
字节[] =有效载荷的消息[0] .getRecords()[0] .getPayload();
尝试{cekNfc(新的字符串(有效载荷)); }
赶上(的SQLException E){e.printStackTrace(); }
赶上(抛出:NoSuchAlgorithmException E){e.printStackTrace(); }
赶上(UnsupportedEncodingException E){e.printStackTrace(); }
setIntent(新的意向书());
}
enableNdefExchangeMode();
}
私人无效enableNdefExchangeMode(){mNfcAdapter.enableForegroundDispatch(这一点,mNfcPendingIntent,mNdefExchangeFilters,NULL); }
NdefMessage [] getNdefMessages(意向意图){//解析意图
NdefMessage []封邮件= NULL;
串动= intent.getAction();
//吉卡ADA行动
如果(NfcAdapter.ACTION_TAG_DISCOVERED.equals(动作)|| NfcAdapter.ACTION_NDEF_DISCOVERED.equals(动作)){
Parcelable [] rawMsgs = intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES);
如果(rawMsgs!= NULL){
封邮件=新NdefMessage [rawMsgs.length]
的for(int i = 0; I< rawMsgs.length;我++){封邮件[I] =(NdefMessage)rawMsgs [I] }
}
}
返回封邮件;
}
公共无效的onCreate(包savedInstanceState){
super.onCreate(savedInstanceState);
的setContentView(R.layout.main);
mNfcAdapter = NfcAdapter.getDefaultAdapter(本);
mNfcPendingIntent = PendingIntent.getActivity(此,0,新的意向(这一点,
。的getClass())addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP),0);
}
保护无效onResume(){
super.onResume();
mResumed = TRUE;
从安卓收到//便签
如果(NfcAdapter.ACTION_NDEF_DISCOVERED.equals(getIntent()。的getAction())){
NdefMessage []消息= getNdefMessages(getIntent());
字节[] =有效载荷的消息[0] .getRecords()[0] .getPayload();
尝试{cekNfc(新的字符串(有效载荷)); }
赶上(的SQLException E){e.printStackTrace(); }
赶上(抛出:NoSuchAlgorithmException E){e.printStackTrace(); }
赶上(UnsupportedEncodingException E){e.printStackTrace(); }
setIntent(新的意向书());
}
enableNdefExchangeMode();
}
私人无效enableNdefExchangeMode(){mNfcAdapter.enableForegroundDispatch(这一点,mNfcPendingIntent,mNdefExchangeFilters,NULL); }
NdefMessage [] getNdefMessages(意向意图){//解析意图
NdefMessage []封邮件= NULL;
串动= intent.getAction();
//吉卡ADA行动
如果(NfcAdapter.ACTION_TAG_DISCOVERED.equals(动作)|| NfcAdapter.ACTION_NDEF_DISCOVERED.equals(动作)){
Parcelable [] rawMsgs = intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES);
如果(rawMsgs!= NULL){
封邮件=新NdefMessage [rawMsgs.length]
的for(int i = 0; I< rawMsgs.length;我++){封邮件[I] =(NdefMessage)rawMsgs [I] }
}
}
返回封邮件;
}
解决方案
把安卓launchMode =singleTask
为您在清单活动(或活动)。这是卓有成效的。每当NFC的意图是由系统布控,总是一个新的活动将被创建。这是唯一的NFC意图。因此,设置机器人:launchMode =singleTop
将无法正常工作,也不会设置标志的PendingIntent
另一种解决方案是使用NfcAdapter.enableForegroundDispatch()在所有的活动。这样,您的应用程序得到直接处理所有的NFC意图本身(通过 onNewIntent()
)。
i trying to make app with nfc function. the problem is when nfc tag discovered, pending intent always make a new activity that already exist. i'm using tab host. how to make pendingintent without making a new activity. thanks a lot.
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;
}
解决方案
Put android:launchMode="singleTask"
for your activity (or activities) in the manifest. That does the trick. Whenever an NFC intent is dispatched by the system, always a new Activity will be created. This is unique for NFC intents. So setting android:launchMode="singleTop"
will not work, nor will setting flags in the PendingIntent.
Another solution is to use NfcAdapter.enableForegroundDispatch() in all your Activities. That way your app gets to handle all NFC intents itself directly (via onNewIntent()
).
上一篇:同时采用像前pression SQLite中土耳其字符土耳其、字符、pression、SQLite
下一篇:Android浏览器触发jQuery的$(窗口).resize()上scolling浏览器、窗口、Android、jQuery