私の状況は次のとおりです: Android 用のゲームを構築しています。私のゲームのアクティビティは、ゲーム ロジックとレンダリング用のスレッドを持つカスタム surfaceView で構成されています。アーキテクチャは、Google の Web サイトの LunarLander デモに似ています。
アクティビティが開始されると、surfaceView が作成され、次のメソッドが呼び出されます。
@Override
public void surfaceCreated(SurfaceHolder holder)
{
renderThread.start();
}
ホームボタンを押してゲームを終了すると、onPause() メソッドが呼び出され、それが surfaceDestroyed() を呼び出します。surfaceDestroyed では、次のように呼び出してゲーム スレッドを停止します。
@Override
public void surfaceDestroyed(SurfaceHolder holder)
{
synchronized(holder)
{
renderThread.stop();
}
}
アプリは正常にバックグラウンドになります。次に、アイコンを押してアプリを再起動すると、ログに「スレッドは既に開始されています」というメッセージが表示され、画面に「強制終了」ポップアップが表示されます。このメッセージは、レンダー スレッドで start() を呼び出したときに、アクティビティが「surfaceCreated」メソッドに入ったときに発生します。
今、私は何時間も調べましたが、これがなぜなのかわかりません。アプリを閉じるとスレッドが停止していると思うので、スレッドが既に開始されていると表示される理由がわかりません。