3

startActivity() を呼び出して新しい画面に遷移するたびに、そのアクティビティの新しいインスタンスを作成していることをどこかで読みました。これはすぐに私に赤い旗を上げました。

この問題を回避する方法を探して、FLAG_ACTIVITY_REORDER_TO_FRONT の使用について読みました。ただし、アプリで新しい画面を開くために見たどのチュートリアルでも、この方法が使用されていないことに少し不安を感じています。だから私は何かが欠けているかもしれないと思います。つまり、重複したアクティビティを作成していないことを常に確認したいとは思わないでしょうか? これは大したことではなく、チュートリアルで対処するべきではありませんか?

この問題を正しく理解して対処し、一般的に行われている画面間の移行方法を使用していることを確認したいだけです。

場合によっては、画面を開いて何かを行い、finish() を使用して画面を閉じて戻ることがあります。しかし、アプリに複雑な 4 レベルの階層があり、ユーザーが画面間を移動できる必要がある場合はどうでしょうか。

4

3 に答える 3

2

通常、重複したアクティビティを作成することは避けたいと考えています。私見ですが、デフォルトの動作でそれが許可されるのは Android システムのバグです。

(「ファイル名を取得する」アクティビティを作成した場合など、許可したい場合があり、複数のアプリケーションがそれを呼び出す可能性があります。)

アクティビティの作成は、マニフェストと、それを起動するインテントのフラグの 2 つの場所で制御します。

マニフェストでは、 <activity> タグに属性android:launchModeがあり、次のいずれかになります。

  • "標準" デフォルト。複数回インスタンス化でき、任意のタスクに属することができ、スタックのどこにでも表示できます。FLAG_ACTIVITY_NEW_TASK が使用されていない限り、通常は startActivity() を呼び出したタスクの一部です。新しいインテントごとに応答するために、クラスの新しいインスタンスが作成されます。

  • " singleTop " 標準と同じですが、ターゲット タスクがスタックの一番上にこのアクティビティのインスタンスを既に持っている場合、新しいアクティビティは作成されません。代わりに、既存のアクティビティは onNewIntent() への呼び出しを受け取ります。

  • " singleTask " は 1 つだけです。これは新しいスタックの最初のアクティビティであり、アクティビティ スタックのルートです。さらにインテントがある場合、それらは onNewIntent() に送信されます。

  • " singleInstance " スタック内の唯一のアクティビティであることを除いて、singleTask と同じです。新しいアクティビティを起動しようとすると、新しいアクティビティが新しいタスクを開始します。FLAG_ACTIVITY_NEW_TASK がインテントに含まれている場合と同じです。

于 2013-05-15T04:16:30.170 に答える