1

Android アプリに 8 つのアクティビティがあり、以下が必要です。

1) 最初の 7 つのアクティビティで [戻る] ボタンを押すたびに、前のアクティビティ (Act1< Act2< Act3< Act4< Act5< Act6< Act7) に戻りますが、

2) 8 番目のアクティビティにいるときのみ、Android アプリを確実に終了して携帯電話のホーム onBackPressed method画面に移動したい.

8 つのすべてのアクティビティfinish();のすべてのインテントに挿入する Android の実装を見つけましたが、これは私が望むものではありません。finish();)。

どうすればいいですか?

私の 8 番目のアクティビティのこれまでのコードは次のとおりです。

            @Override
            public void onBackPressed()
            {

                   Intent intent = new Intent(Intent.ACTION_MAIN);
                   intent.addCategory(Intent.CATEGORY_HOME);
                   intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                   startActivity(intent);
                   finish();

            }
4

5 に答える 5

0

public static booleanアプリが終了していることを示すクラスの 1 つに a を追加します。アプリを終了させたい場合はアクティビティ 8 でこのブール値を設定し、他のすべてのアクティビティでそれをチェックして、onResume()true の場合はすぐに終了させます。終了する前に、最初のアクティビティがそれをクリアしていることを確認してください。そうしないと、次回アプリを実行したときにまだ設定されている可能性があります。(Android は、最後のアクティビティが終了したときに必ずしも VM を破棄するわけではないため、クラスとその静的メンバーは次回再利用される可能性があります。)

これは「Android 方式」ではなく、単純な方式であることに注意してください。グローバル変数は、Google で検索できる理由から、一般的に嫌われています。onActivityResult(...)これを行う「正しい」方法は、結果の各アクティビティを開始し、アプリが終了しているかどうかを示す結果を返すことです。

于 2015-03-30T23:29:23.123 に答える
0

ブロードキャスト レシーバーを実装し、クローズしたい各アクティビティがブロードキャスト (最後のアクティビティから送信される) を受信したときに、finish() を呼び出すようにすることができます。囲んでいるアクティビティの終了メソッドに簡単にアクセスできるように、ブロードキャスト レシーバー クラスをアクティビティ内の匿名の内部クラスまたはプライベート クラスにする必要があると思います。

ブロードキャスト レシーバーの良い例を次に示します: http://www.tutorialspoint.com/android/android_broadcast_receivers.htm

カスタム インテント セクションを見てください。

このようにすることは、あなたがやろうとしていることを実装するための疎結合の方法です。

于 2015-03-31T05:05:19.020 に答える
0

以下の例のように、インテントでFLAG_ACTIVITY_CLEAR_TOPフラグを使用します。

 Intent intent = new Intent(getApplicationContext(),FirstActivity.class);
  intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
  intent.putExtra("EXIT", true);
  startActivity(intent);

最初のアクティビティでは、以下の条件を確認してください。

if (getIntent().getBooleanExtra("EXIT", false)) {
Intent intent = new Intent(Intent.ACTION_MAIN);
               intent.addCategory(Intent.CATEGORY_HOME);
               startActivity(intent);
               finish();
}

ここで FLAG_ACTIVITY_CLEAR_TOP は以下の例のように機能します

アクティビティ A、B、C、D で構成されるタスクを考えてみましょう。D がアクティビティ B のコンポーネントに解決されるインテントで startActivity() を呼び出す場合、C と D は終了し、B は指定されたインテントを受け取り、結果としてスタックは次のようになります: A, B.

ここでは、 Dを最後のアクティビティ、Aを最初のアクティビティと呼ぶ必要があります。

于 2015-03-31T10:46:04.273 に答える
0

別の方法: 9 番目のアクティビティを作成し、FinishAllActivity などの名前を付けます。このアクティビティの呼び出しfinish()を行い、そのonCreate().

アクティビティ8onBackPressed()で、フラグを使用して FinishAllActivity を開始しますFLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_CLEAR_TASK(詳細については、この質問を参照してください)。アクティビティ 1 ~ 8 がスタックから削除され、9 番目のアクティビティが開始されてすぐに終了し、タスク スタックがクリアされます。アプリを再度開くと、アクティビティ 1 から開始する必要があります。

この方法の利点は、アクティビティ 1 ~ 7 を変更する必要がないことです。

于 2015-03-30T23:47:57.547 に答える
-1

このようにして、8 番目のアクティビティを終了して 7 番目のアクティビティに戻ると同時に、デバイスのホーム ボタンを押す操作をエミュレートするようになります。アプリを再実行すると、画面に 7 番目のアクティビティが表示されます。この場合、8 番目のアクティビティを表示したい場合は、finish()メソッドを削除してください。次回アプリを 1 番目のアクティビティから開始する場合は、1 番目ではなく 8 から 2 番目までのすべてのアクティビティを終了する必要があります。また、FLAG NEW_TASK またはその他のフラグを追加して、最初のアクティビティを起動することもできます。
UPDATE
私のアドバイス(ワークフローを変更せずに迅速な結果を得るため)はstartActivityForResult()、チェーン内のすべてのアクティビティを開始するために使用することです。ユーザーがアプリを終了すると、次を使用して特別なパラメーターを返すだけですsetActivityResult()ネストされたすべてのアクティビティをユーザーの選択について認識させ、ネストされたすべてのアクティビティを実行させますfinish()。このようにして、8 つのアクティビティはすべて適切に終了します。

于 2015-03-30T22:10:00.767 に答える