待意图总是让新活动意图、让新

2023-09-05 02:04:17 作者:好听的百度贴吧昵称 独一无二的贴吧昵称

我试图与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()).