2012-04-23 9 views
3

私は、フォアグラウンドディスパッチ動作に厄介な問題があります。場合によってはonNewIntent()に電話する代わりに、アクティビティを完全に再作成して、アプリケーションのワークフローを破ります。AndroidのNFCフォアグラウンドディスパッチシステムにバグがありますか?

具体的な状況:アクティビティAは、フォアグラウンドディスパッチを使用するMainActivityです。すべてが必要なように機能します。しかし、ブラウザから起動される私のアクティビティB(VIEWアクション)では、フォアグラウンドディスパッチは、いくつかの状況ではもう機能しません。

ワークフロー:

  • 私は、MainActivityは、( MainActivityを閉じず)、ブラウザに切り替えて起動し、起動アクティビティ・Bと私のNFCデバイスを接続 - >それ が新しいアクティビティを作成し、 B.

  • MainActivityを開始してもう一度閉じます。その後、私は、ブラウザに
    を切り替える発射活動Bと私のNFCデバイスを接続 - > すべてがonNewIntent()

で動作するコードは、例えば、正しいです最初のシナリオでNFCデバイスを2回接続すると、2回目と同じように動作しますが、初めて動作しません。 MainActivityとBアクティビティでは、アクティビティのonPause()メソッドでdisableForegroundDispatch()メソッドを確実に呼び出します。

私の特定の問題の解決策はありますか?私にとってはバグのように思える。

編集:

public void resume(Activity targetActivity) { 
    if (nfc != null && nfc.isEnabled()) { 
     // nfc is the default NFC adapter and never null on my devices 

     Intent intent = new Intent(targetActivity, targetActivity.getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); 
     PendingIntent pendingIntent = PendingIntent.getActivity(targetActivity, 0, intent, 0); 
     nfc.enableForegroundDispatch(targetActivity, pendingIntent, null, new String[][] { new String[] { IsoDep.class.getName() } }); 
    } 
} 

public void pause(Activity targetActivity) { 
    if (nfc != null && nfc.isEnabled()) { 
     nfc.disableForegroundDispatch(targetActivity); 
    } 
} 

これらの方法は、各アクティビティに対応する方法で呼び出されます。助けてくれてありがとう!

ソリューション:非常に長い研究の後、私はついにこの問題を発見しました。ログカード印刷:

  • startActivityは非アクティビティコンテキストから呼び出されました。 Intent.FLAG_ACTIVITY_NEW_TASK for:Intent

NotificationoverManagerで同じ問題が発生していたStackoverflowで他の問題が見つかりましたが、すべてのヒントが私を助けませんでした。私の活動BにフラグsingleTaskを追加することは私のためのトリックでしたが、文脈は常に活動であるため、正直言って理解できません。

MainActivityからすべてのコードを削除しましたが、最初のシナリオはまだ機能しませんでした。私はマニフェストからMainActivityを浪費し、それ以降はすべてうまくいった。アプリケーションインスタンスが実行されていて、アクティビティBがブラウザから起動されていることが問題なのでしょうか?知りません。

とにかく、NFCの助けを借りてくれてありがとう!

+0

作成した「PendingIntent」のコードを表示してください。 –

+0

私はそれを追加しました。前もって感謝します。 – vRallev

+0

私は同じ問題を抱えていました...私はあなたにSingleTaskメソッドを使って解決しました。私はまた、その解決策にはあまり満足していません。あなたはそれを解決する別の方法を見つけましたか? 、> – david

答えて

2

enableForegroundDispatchに渡したIntentFilter[]は空です。あなたのNFCインテントは、おそらくマニフェストファイルのIntentFilterのためにあなたのアクティビティに到着します。これは、NFCインテントがこのように配信されると常に新しいインスタンスを作成するため、あなたが観察する動作を説明します。

IntentFilter[] iFilters = new IntentFilter[2]; 
iFilters[0] = new IntentFilter(); 
iFilters[0].addAction("android.nfc.action.TECH_DISCOVERED"); 
iFilters[1] = new IntentFilter(); 
iFilters[1].addAction("android.nfc.action.TAG_DISCOVERED"); 
iFilters[1].addCategory(Intent.CATEGORY_DEFAULT); 

をそしてenableForegroundDispatchにパラメータとしてそれを渡す:

フォアグラウンドディスパッチを有効にするための代わりにあなたのコードにこのような何かを追加します。

更新日: 私は最近、この特定の問題についてもっと知りました。これはAndroidがどのアクティビティで新しいアクティビティを起動するかを決定する方法によって引き起こされます。私が知っているか、または動作する方法の具体的な詳細を理解し、その効果はあるしない:

    活動Bがブラウザから起動すると、それがブラウザのタスクで作成され
  1. するとNFCの意図を新しいアクティビティBがアクティビティAのタスクで作成されるとシステムは判断します。

2.のために、SINGLE_TOPは無視されません。アクティビティBのインスタンスは1つだけです。アクティビティAが閉じられると、タスクは消えたので、アクティビティBはブラウザのタスクで常に作成されます。

この場合、これはAndroidのバグだと思うかもしれませんが(私はそう思います)、タスクの活動をどのように作成するかというこの動作は、多くのアプリがそれに頼っているAndroidにとってとても基本的なものです。だから、これが変わることはほとんどありません。

回避策:アクティビティBをlaunchMode "singleTask"(または "singleInstance")で宣言してください。その後、Bを起動すると新しい(3番目の)タスクが作成されます。

+0

ありません - メインライター活動フォアグラウンド派遣-TAG_DISCOVEREDと:> しかし、そうでない場合 - TAG_DISCOVERED - - フォアグラウンドディスパッチ-TAG_DISCOVEREDと>ライター活動 メイン:ここに同じ – vRallev

0

私はあなたのワークフローを推測するには、以下の通りです:メイン - >タグを検出 - >リーダーの活動 - >ライター活性が検出タグ - >ライト・タグこの問題が発生しているようだ

ときに作家活動( 1つはフォアグラウンドが有効になっている、私はそれが書き込み目的のためだと思う)は、以前のタグ発見から呼び出されたアクティビティスタック(例えばタスク)に属しています。

特に

ワークフローは以下の通りであるならば、それは発生しません: メインライターのアクティビティタグを検出 - >ライト・タグ

私の回避策は、そもそも新しいタスクで作家活動を呼び出すことです。 ライターをlucnhesするアクティビティでは、ライターを開始するインテントに新しいタスクフラグを追加するだけです。

startActivity(new Intent(this,MyTagWriterActivity.class).addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)); 

メイン - >タグを検出 - >リーダーの活動-NEW_TASK->ライター・アクティビティタグを検出 - >ライト・タグ

それは、活動履歴を台無しにしていますが、作家活動がより予測可能なもの。

関連する問題