Android で ActivityIntent の明示的なジャンプが失敗する理由の概要

シーンの再構成

アプリには A と B という 2 つのページがあり、Intent を使用すると、ページ A からページ B にジャンプしますが、結局ジャンプは実現せず、ブレークポイントの後に、対応するコードが実行されていることがわかります。

考えられる原因

1. タスクスタックはシステムによってリサイクルされます

この質問のタイトルは間違っているかもしれませんが、一般的な意味は、ターゲットがジャンプする必要があるタスクスタックがシステムによってリサイクルされているということであり、 setFlags(Intent.FLAG_ACTIVITY_NEW_TASK)を設定することでジャンプを実現できます
原理:

この状態を設定するには、まず、開始されたアクティビティと同じアフィニティを持つタスク スタックがあるかどうかを確認します (つまり、taskAffinity、同じアプリケーション内のアクティビティのアフィニティは同じであることに注意してください)。存在する場合、このスタックは次のようになります。直接全体を最前面に移動し、スタック内のステータスを変更しない、つまり、スタック内のアクティビティの順序は変更されません。そうでない場合は、アクティブ化されたアクティビティを保存する新しいスタックを作成します。記事より引用: https
: / /blog.csdn.net/u010389391/article/details/78558475

2. 起動モードの競合

この問題は、まさに前のポイントで Intent.FLAG_ACTIVITY_NEW_TASK を設定したことが原因で発生します。
原則: Intent.FLAG_ACTIVITY_NEW_TASK は、 singleTask
にジャンプするターゲット アクティビティの起動モードを設定します。ターゲット アクティビティの起動モードが singleTop の場合、起動モードで競合が発生します。

3. Parcelable シリアル化エラー

インテント オブジェクトでオブジェクトを渡すと、オブジェクトのシリアル化で競合が発生する可能性があり、インテントはジャンプをキャンセルします。具体的な状況は、データ Bean 内に内部クラスがあり、ben だけが Parcelable シリアル化されていますが、その内部クラスは Parcelable シリアル化されていません。
対応する Data Bean のシリアル化に問題がないか確認する必要があります。
さらに、シリアル化でエラーが発生した場合、ジャンプ失敗の問題は発生しない可能性がありますが、ジャンプ後に正しいデータが取得されなくなります。

結論

ページ ジャンプが失敗する状況は他にもたくさんあるはずです。私が知っている 3 つの状況を列挙しました。また、私が説明したこれら 3 つの状況の原則は正しくない可能性もありますので、間違いがあればご指摘ください。他の人に誤解を与えないように修正していただきありがとうございます。その他のインテントジャンプ失敗の種類や原因についても知りたいです ご存知の方がいらっしゃいましたらアドバイスを頂ければ幸いです 今後他の種類についても分かりましたら随時更新していきたいと思います よろしくお願いしますまたか!

おすすめ

転載: blog.csdn.net/qq_39734865/article/details/102266737