10

nfc機能でアプリを作ろうとしています。問題は、nfcタグが検出されたときに、保留中のインテントが常に既存の新しいアクティビティを作成することです。タブホストを使用しています。新しいアクティビティを作成せずに保留中のインテントを作成する方法。どうもありがとう。

 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;
        }
4

6 に答える 6

10

android:launchMode="singleTask"マニフェストにあなたの活動(または活動)を入れてください。それはトリックを行います。NFC インテントがシステムによってディスパッチされるたびに、常に新しいアクティビティが作成されます。これは、NFC インテントに固有のものです。そのため、設定android:launchMode="singleTop"は機能せず、PendingIntent でフラグを設定することもできません。

別の解決策は、すべてのアクティビティでNfcAdapter.enableForegroundDispatch()を使用することです。そうすれば、アプリはすべての NFC インテント自体を ( 経由で) 直接処理できるようになりますonNewIntent()

于 2012-04-11T13:13:57.467 に答える
3

これを試して:

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

そしてあなたのマニフェストで:

android:launchMode="singleTask"
于 2012-05-28T03:46:39.227 に答える
0

以下のように保留中のインテントを作成します。

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);
于 2012-04-11T10:28:02.887 に答える
0

「getActivity」メソッドを呼び出すときに、フラグ「PendingIntent.FLAG_UPDATE_CURRENT」を使用できます。I2mは問題なく使用しています。

于 2012-04-11T10:28:28.240 に答える
0

代わりにこのフラグを使用してください。

new Intent(this,
    getClass()).addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY)
于 2012-04-11T10:28:31.667 に答える