В ожидании намерения всегда совершать новые действия

я пытаюсь сделать приложение с функцией NFC. проблема в том, что при обнаружении тега nfc ожидающее намерение всегда выполняет новое действие, которое уже существует. я использую вкладку хоста. как сделать pendingintent, не совершая нового действия. большое спасибо.

<code> 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;
        }
</code>

Ответы на вопрос(6)

Создайте свое ожидающее намерение, как показано ниже:

PendingIntent.getActivity(this, 0,new Intent(this,
    getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP
    |Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT
    |Intent.FLAG_ACTIVITY_REORDER_TO_FRONT), 0);
 11 апр. 2012 г., 15:03
Вы также пытались установитьandroid:launchMode="singleTop" к вашей деятельности в манифесте?
 user132628811 апр. 2012 г., 15:08
Я только что сделал, но это не работает.
 user132628811 апр. 2012 г., 14:58
уже попробуй, но это не сработает.

Попробуй это:

mNotificationIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);

И в вашем манифесте:

android:launchMode="singleTask"
 14 янв. 2014 г., 22:55
android:launchMode="singleTask" достаточно

Вы можете использовать флаг & quot; PendingIntent.FLAG_UPDATE_CURRENT & quot; во время вызова «getActivity» метод. Я использую его без проблем.

используйте этот флаг вместо ..

new Intent(this,
    getClass()).addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY)
 user132628811 апр. 2012 г., 15:01
уже попробуй, но это не сработает.

Положилandroid:launchMode="singleTask" за вашу деятельность (или действия) в манифесте. Это делает трюк. Всякий раз, когда система отправляет намерение NFC, всегда создается новое действие. Это уникально для намерений NFC. Итак, постановкаandroid:launchMode="singleTop" не будет работать и не будет устанавливать флаги в PendingIntent.

Другое решение заключается в использованииNfcAdapter.enableForegroundDispatch () во всех ваших мероприятиях. Таким образом, ваше приложение обрабатывает все намерения NFC непосредственно (черезonNewIntent()).

 11 апр. 2012 г., 15:30
Как вы определилиmNdefExchangeFilters?
 user132628812 апр. 2012 г., 11:11
ничего, это просто пустой IntentFilter
 user132628812 апр. 2012 г., 07:11
я просто использую IntentFilter [] mNdefExchangeFilters. это неправильно?
 12 апр. 2012 г., 10:36
Извините, я имел в виду: какова их ценность.
 user132628811 апр. 2012 г., 15:18
я попробовал Android: launchMode = & quot; singleTask & quot; но все же не работает и использует NfcAdapter.enableForegroundDispatch (), но, похоже, не работает.

У меня была похожая проблема, но я не использовал TabHost - каждый раз, когда сканировался тег NFC, мое приложение запускало новое действие, а не запускалоonNewIntent как я и хотел. Я пытался установитьandroid:launchMode="singleTask" в манифесте и использованииNfcAdapter.enableForegroundDispatch() в моей деятельностиonResume метод. Вместо этого я отказался от использования PendingIntent и настроил фильтры намерений для своей активности в манифесте следующим образом:

    <activity
        ...
        android:launchMode="singleTask">
        <intent-filter>
            <action android:name="android.nfc.action.NDEF_DISCOVERED" />
            <data android:mimeType="application/vnd.myname.myapp" />
            <category android:name="android.intent.category.DEFAULT" />
        </intent-filter>
        <intent-filter>
            <action android:name="android.nfc.action.TECH_DISCOVERED" />
        </intent-filter>
        <meta-data
            android:name="android.nfc.action.TECH_DISCOVERED"
            android:resource="@xml/nfc_tech_filter" />
    </activity>

Ваш ответ на вопрос