2012-04-11 9 views
5

私はnfc機能でappを作成しようとしています。問題は、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

以下のように自分の保留中の意図を作成します。 "getActivity" メソッドを呼び出している間、あなたが "PendingIntent.FLAG_UPDATE_CURRENT" フラグを使用することができます

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

+0

マニフェストであなたの活動に 'android:launchMode =" singleTop "'を設定しようとしましたか? – waqaslam

+0

私はやったが、うまくいきません。 – user1326288

0

。それを問題なく使用しています。

+0

既にそれを試しても動作しません。 – user1326288

+0

私はIntent.addFlagにあなたのコードと他の答えから見えるものからフラグを入れることを前提としています。 PendingIntent.getActivity – cagla

+0

の最後のフラグ "0"の代わりにputする必要がありますが、動作しません。もう一度提案してください。 – user1326288

0

使用は、このフラグではなく..

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

既にそれを試みますが、動作しません。 – user1326288

7

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

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

+0

私はアンドロイドを試しました:launchMode = "singleTask"しかし、まだ動作せず、NfcAdapter.enableForegroundDispatch()を使用しましたが、動作していないようです。 – user1326288

+0

どのように 'mNdefExchangeFilters'を定義しましたか? –

+0

私はIntentFilter [] mNdefExchangeFiltersを使用します。違いますか? – user1326288

2

このお試しください:私は同様の問題があったが、TabHostを使用していない

android:launchMode="singleTask" 
+1

android:launchMode = "singleTask" 'で十分です – tbruyelle

0

- NFCタグが私のアプリは、新規に立ち上げたスキャンされたすべての時間を:

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

そして、あなたのマニフェストでの私が欲しかったように、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> 
関連する問題