この数か月間、私は汎用性の高いリアルタイム ゲーム エンジンを開発してきました。多くのことを学びましたが、アプリケーションのライフ サイクルに関しては、まだ非常にナイーブだと感じています。具体的には、ユーザーがバックグラウンドにシャッフルしてから適切に再開できるアクティビティを実装しようとしています。
私の現在のアーキテクチャは次のとおりです。インテントを使用してリアルタイムのゲーム アクティビティを作成できる XML メニュー ランチャー アクティビティがあります。このゲーム アクティビティの関連データは、静的データ構造と変数を通じて参照されます。Game アクティビティは、SurfaceView オブジェクトの onSurfaceCreate() コールバックでワーカー スレッドを作成します。
ユーザーが戻るボタンを押すと、アクティビティは破棄され、ランチャー アクティビティの XML メニューに戻されます。いいよ、とりあえず。ユーザーがホーム ボタンを押すと、Activity がバックグラウンドに送信されます。わかりました。バックグラウンドに送信された後、ユーザーがゲームアクティビティに戻る方法を見つけようとすると、問題が発生します。ユーザーがランチャー アイコンに触れると、ゲームが破棄され、メニューが再起動されます。また、ユーザーがタスク マネージャーからゲームを再開すると、onSurfaceCreate() コールバックが起動し、ワーカー スレッドが開始されますが、ゲームはフリーズします。
それで、私は2つの質問があります。まず、ゲームを再起動するのではなく、ランチャー アイコンからアクティビティを再開するにはどうすればよいですか? 次に、アクティビティを再開するときに、ゲーム データを保持しながらワーカー スレッドを再開するには、どのようなアクションが必要ですか?
ありがとう!
編集:リクエストにより、以下のコードを含めています。私の onSurfaceCreate は少し複雑です。別のスレッドにメッセージを送信し、別のスレッドがコールバックを実装します。Game アクティビティが再開されると、この実装関数が起動することを確認しました。
protected void surfaceCreate()
{
Log.e(TAG, "surfaceCreate");
Thread gameThread = createGameThread();
gameThread.start();
}
protected final void onResume()
{
super.onResume();
resume();
}
protected final void onPause()
{
super.onPause();
pause();
}
これらの不可解な pause() および resume() メソッドは、一部のゲーム ロジックが実行されないようにするブール変数を設定するだけであり、ループを継続する必要があるワーカー スレッドを妨げることはありません。
編集:私の最初の(小さいながらも)問題を解決してくれたMohammadに感謝します。USB で IDE に接続されていない場合、ランチャー アイコンの動作が異なることが判明しました。2 番目の問題は未解決のままです。
編集:すべての作業! 2 番目の問題は、私のコードに固有の問題であることが判明しました。申し訳ありません。この質問が、ランチャーと IDE を扱う人にとって引き続き役立つことを願っています。