6

私は自分の問題について長い間解決策を探してきましたが、Android のドキュメントはあまり明確ではなく、Web ソリューションは完全には機能しません。

メインのアクティビティ (ゲームが行われる場所) が別の単純なアクティビティを呼び出して戻ることができるゲームを開発しています。次のように機能します。

  1. ユーザーがホームボタンをクリックしてからゲームに戻った場合、アクティビティを停止し、onDestroy を渡さずに再開する必要があります (そうしないと、ゲームの状態が失われます)。
  2. メインのアクティビティが他のアクティビティを呼び出してからゲームに戻る場合と同じ関数。
  3. ユーザーが終了ボタンを押すと、ゲームは完全に終了する必要があります

android:launchMode="singleTask"最初の 2つの点については、メイン アクティビティが 1 つだけ作成されて呼び出されることを確認するために、これを試してみましたandroid:launchMode="singleTop"

問題は次のとおりだと思います。すでにスタックの一番上にあります!)。逆に、singleTask はアクティビティがそのスタック内で一意であることを保証しますが、ユーザーが [ホーム] ボタンをクリックしてアプリケーションに戻った後、他のタスクが呼び出されます。

とにかく、これはスマートな解決策ですか、それともゲームの状態を onStop/onPause に保存してから、onResume で再開する必要がありますか?

3 番目のポイントでは、すべてのアクティビティに を追加しようとしましたandroid:noHistory="true"。次に、ユーザーが終了ボタンをクリックするとfinish()、onCreate のメソッドだけを実行する新しいアクティビティを呼び出します。このアクティビティは with で呼び出されintent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP|Intent.FLAG_ACTIVITY_NEW_TASK);、その launchMode は ですが、そうではsingleInstanceありません。うまくいかない場合は、常にメインのアクティビティに戻るだけです。

4

1 に答える 1

3

あなたは間違いなくを台無しにしたくないlaunchMode. それはこの問題を解決する方法ではなく、より多くの問題を引き起こすだけです。

Android はいつでもプロセスを強制終了できます (また、強制終了します (ただし、アプリケーションがバックグラウンドにある場合は特に))。このため、ゲームの状態を に保存する必要があります。それが保証さonPause()れている唯一の機会だからです。

とにかく、onPause()標準の動作でゲームを保存すると、最初の 2 ポイントがカバーされます。

3 番目のポイントについては、いくつかのオプションがあります。

  1. ここでstartActivityForResult()私の答えを見て、すべての活動を開始できます
  2. 「終了」したい場合は、ルート アクティビティ (アプリケーションを開始するアクティビティ) に戻り、終了することを伝えます。

このような:

Intent intent = new Intent(this, MyRootActivity.class); // this is the starting activity for your application
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); // tells Android to finish all other activities in the stack
intent.addExtra("exit", "true"); // this tells your root activity that you want to exit
startActivity(intent);

ここで、このコードを次のMyRootActivity場所に追加します。onCreate()

Intent intent = getIntent();
if (intent.hasExtra("exit")) {
    // User wants to exit
    finish();
}
于 2012-10-23T20:11:28.363 に答える