2012-04-11 45 views
5

我試圖用nfc函數製作應用程序。問題是當nfc標籤被發現時,掛起的意圖總是產生一個已經存在的新活動。我正在使用標籤主機。 如何在不進行新活動的情況下進行pendingintent。 非常感謝。等待意圖總是做出新的活動

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

回答

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); 
+0

已經嘗試過,但它不起作用。 – user1326288 2012-04-11 12:58:50

+0

你是否也嘗試在清單中設置'android:launchMode =「singleTop」'你的活動?我剛剛做了 – waqaslam 2012-04-11 13:03:02

+0

,但它不起作用。 – user1326288 2012-04-11 13:08:19

0

可以使用標誌 「PendingIntent.FLAG_UPDATE_CURRENT」,而調用 「getActivity」 的方法。 I2m使用它沒有問題。

+0

已經嘗試,但它不起作用。 – user1326288 2012-04-11 13:03:55

+0

我假設你把Intent.addFlag中的標誌從我的代碼和其他答案中看到。它應該放在PendingIntent.getActivity – cagla 2012-04-11 13:47:57

+0

而不是最後一個標誌「0」仍然不起作用。 – user1326288 2012-04-12 05:10:47

0

使用此標誌,而不是..

new Intent(this, 
    getClass()).addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY) 
+0

已經嘗試過,但不起作用。 – user1326288 2012-04-11 13:01:49

7

android:launchMode="singleTask"您在清單活動(或活動)。這就是訣竅。無論何時由系統發送NFC意圖,總會創建一個新的活動。這對NFC意圖是獨一無二的。因此設置android:launchMode="singleTop"將不起作用,也不會在PendingIntent中設置標誌。

另一種解決方案是在所有活動中使用NfcAdapter.enableForegroundDispatch()。這樣你的應用程序就可以直接處理所有的NFC意圖(通過onNewIntent())。

+0

我試過android:launchMode =「singleTask」,但仍然無法使用NfcAdapter.enableForegroundDispatch(),但似乎沒有工作。 – user1326288 2012-04-11 13:18:21

+0

你是如何定義'mNdefExchangeFilters'的? – 2012-04-11 13:30:42

+0

我只是使用IntentFilter [] mNdefExchangeFilters。這是錯的嗎? – user1326288 2012-04-12 05:11:58

2

試試這個:

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

而在你的清單:

android:launchMode="singleTask" 
+1

'android:launchMode =「singleTask」'就夠了 – tbruyelle 2014-01-14 21:55:33

0

我也有類似的問題,但沒有使用TabHost - 每一個NFC標籤進行掃描我的應用程序正在啓動一個新的時間而不是像我想要的那樣開火onNewIntent。我試圖在清單中設置android:launchMode="singleTask",並在我的活動onResume方法中使用NfcAdapter.enableForegroundDispatch()。相反,我放棄使用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>