フォアグラウンド ディスパッチ動作に厄介な問題があります。を呼び出す代わりにonNewIntent()
、アクティビティを完全に再作成することがあり、アプリのワークフローが中断されます。
私の具体的な状況: アクティビティ A は、フォアグラウンド ディスパッチを使用する MainActivity です。すべてが正常に機能します。ただし、ブラウザーから起動されるアクティビティ B (VIEW アクション) では、状況によってはフォアグラウンド ディスパッチが機能しなくなりました。
ワークフロー:
MainActivity を開始し、(MainActivity を閉じずに) ブラウザーに切り替え、アクティビティ B を起動し、NFC デバイスを接続します --> 新しいアクティビティ B が作成されます。
MainActivity を開始し、もう一度閉じます。その後
、ブラウザに切り替え、アクティビティ B を起動し、NFC デバイスを接続します --> すべてが動作しますonNewIntent()
コードは正しいです。たとえば、最初のシナリオで NFC デバイスを 2 回接続すると、2 回目は正常に動作しますが、最初は動作しません。MainActivity およびアクティビティ BI では、アクティビティの 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。Forcing Intent.FLAG_ACTIVITY_NEW_TASK for: Intent
人々が NotificationManager で同じ問題を抱えていた Stackoverflow で他の問題を見つけましたが、すべてのヒントは役に立ちませんでした。アクティビティ B にフラグ singleTask を追加するとうまくいきましたが、正直なところ、コンテキストは常にアクティビティであるため、理解できません。
MainActivity からすべてのコードを削除しましたが、最初のシナリオはまだ機能しませんでした。マニフェストから MainActivity を奪った後、すべて問題ありませんでした。アプリ インスタンスが実行されていて、アクティビティ B がブラウザーから起動されていることが問題なのでしょうか? 知らない。
とにかく、助けてくれてありがとうNFCガイ!