8

オンラインゲームの場合、AndroidActivityのonDestroy()が呼び出されるのは、Androidがそれを再作成するため(デバイスの回転など)であるのか、ユーザーがゲームを終了することを選択したのかを知ることは素晴らしいことです。

Activity私の計画は、Androidがおそらく:onSaveInstanceState()を再作成しているときにフラグを設定することでした。Activity

private boolean mDestroyedForReCreation;
...
protected void onSaveInstanceState() {
    ...
    mDestroyedForReCreation = true;
}

これを行った場合は、チェックインできmDestroyedForReCreationますonDestroy()

  • フラグが設定されている(true)場合は、ユーザーをオンラインゲームから退けないでください。
  • フラグが設定されていない(false)場合は、ユーザーが自発的にゲームを終了したため、ユーザーをオンラインゲームから退けます。

それは正しいアプローチですか?はいの場合、それは推奨されますか、それともより良い解決策がありますか?私はその解決策が本当に好きではないのでそう願っています...

4

6 に答える 6

5

このようなゲームロジックをアクティビティのライフサイクルから削除することをお勧めします。サービスを作成します。誰も拘束されていない場合-すべてのアクティビティが停止しています。誰かが拘束されていますか-働き続けます。

サービスを作成したくない場合は、onRetainNonConfigurationInstanceメソッドを使用できます。これが例です。

onRetainNonConfigurationInstanceを使用する必要があります。これは、新しい構成に対して新しいインスタンスがすぐに作成されることがわかっている場合に、構成の変更によるアクティビティの破棄の一部として、システムによって呼び出されるためです。onSaveInstanceStateは、Androidがアクティビティを強制終了し、場合によっては復元する場合としない場合に呼び出されます)。

于 2013-01-23T10:06:17.590 に答える
3

この構成変更をコードで処理することにより、ローテーションでの再起動を簡単に回避できます。あなたはこのManifest.xmlようにあなたの中でこれを行うことができます:

<activity
    android:name=".MainActivity"
    android:configChanges="orientation|screenSize|keyboard|keyboardHidden"
    android:label="@string/app_name" >

そのため、回転時やキーボードが開閉した場合でもアプリは再起動しません。

この解決策ははるかに簡単だと思います。

この場合onSaveInstanceState()、ゲームの状態を保存する必要がある別のインテント/アクティビティを開始する場合を除いて、終了するために処理する必要はほとんどありません。電話でもコードが中断されることに注意してください。時間がリセットされるがスコアがリセットされない、面白いバグのあるゲームをいくつか知っています。

于 2013-01-23T12:44:06.060 に答える
2

全体を単純化して、ユーザーがゲームを終了するときに切り替えられるフラグを設定します。たとえば、次のようになります。

void exitGame() {
   mUserExited = true;
   finish();
}

(または、複数のアクティビティを破棄する必要がある場合は、より多くのロジックが必要になる場合があります)

次に、onDestroy()でフラグを確認します。

構成の変更(ローテーションなど)に関するロジックが何であれ、ゲーム終了フラグとは何の関係もありません。

また、「戻る」ボタンのデフォルトの動作は、現在のアクティビティをfinish()することであることに注意してください(その上に他に何もない場合)。この場合、「終了」としてカウントされません。ここでの動作はあなた次第です。

于 2013-01-29T13:14:05.720 に答える
2

Activityおそらくあなたが探しているものであるisFinishing()と呼ばれるメソッドがあります。

参照:https ://stackoverflow.com/a/9621078/445348

于 2013-01-29T20:39:21.863 に答える
1

これを知る必要がある場合は、システムに処理させるのではなく、ローテーションやその他の構成変更イベントを自分で処理することを検討する必要があります。マニフェストでアクティビティがconfigChangesを処理するように設定した場合、アクティビティを破棄して再作成するのではなく、ローテーション時にonConfigChangeを呼び出します。大量のアプリがこれを実行します。Androidが実行するローテーションでの破壊と再作成は完全に遅延します。

于 2013-01-21T05:14:47.607 に答える
0

onRestoreInstanceState()は、復元/再作成時に呼び出されます。Androidによって強制終了された場合、アクティビティのUI状態と一部の値が保存され、onSaveInstanceStateをオーバーライドできますが、onSaveInstanceState()の呼び出しは保証されていないため、これを使用する必要があります。アクティビティの一時的な状態(UIの状態)を記録するためだけに使用します。永続的なデータを保存するために使用しないでください。代わりに、onPause()を使用して、ユーザーがアクティビティを離れたときに永続データ(データベースに保存する必要があるデータなど)を保存する必要があります。また、onRestartは、現在のアクティビティがユーザーに再表示されているときにonStop()の後に呼び出されます。したがって、おそらくonPauseに状態を保存できます。onRestartが呼び出された場合は再表示されているように見えますが、onCreateがonRestartなしで呼び出された場合は再作成されます。

于 2013-01-25T10:36:41.407 に答える