私はAndroidが初めてです。そして現在、Android 向けのシンプルなゲームを作成しています。
私の問題は、ホームボタンを押すとonPause()が呼び出され、onPause()とonStop()の両方が呼び出されることがあります。ただし、(ホーム画面のアイコンをクリックして) ゲームに戻ろうとすると、onResume() も onRestart() も呼び出されません。ゲームは引き続きレンダリングされますが、ゲームを操作できません。タッチイベントが機能していません。ボタンをタッチしようとしても何も起こらず、数秒後に「応答していません」と表示され、強制的に閉じる必要があります。
ところで。また、ホーム画面に移動すると、MainGamePanel の surfaceDestroyed() 関数が呼び出されることにも気付きました。この関数はスレッドをブロックすると思っていましたが、実際にはホーム画面ではまだスレッドが実行されています。
onRestart() または onResume() が起動しない理由と、ホーム画面からゲームに戻った後にタッチイベントが機能しない理由を教えてもらえますか?
どうもありがとうございました。
関数が呼び出されたときにログにメッセージを出力するために、onStop()、onPause()、onResume、および onRestart() をオーバーライドします。
@Override
protected void onStop() {
Log.d(TAG, "Stopping...");
super.onStop();
}
以下は、私のアクティビティとサーフェス ビューのコードです。私はActivityMainGameがActivityを拡張しています:
public class ActivityMainGame extends Activity
{
private MainGamePanel mainGamePanel;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main_game);
Log.w(TAG, "Creating the game");
//set our MainGamePanel as the view
mainGamePanel = new MainGamePanel(this);
setContentView(mainGamePanel);
}
}
そして、MainGamePanel を作成して SurfaceView を拡張し、SurfaceHolder.Callback を実装します。このクラスはスレッドを開始して、キャンバスに要素をレンダリングします。
public class MainGamePanel extends SurfaceView implements SurfaceHolder.Callback
{
private MainGameThread thread;
public MainGamePanel(Context context)
{
super(context);
// adding the callback (this) to the surface holder to intercept events
getHolder().addCallback(this);
// create the game loop thread
thread = new MainGameThread(getHolder(), this);
// make the GamePanel focusable so it can handle events
setFocusable(true);
}
@Override
public void surfaceCreated(SurfaceHolder holder)
{
if (thread.getState() == Thread.State.NEW)
{
thread.setRunning(true);
thread.start();
}
}
@Override
public void surfaceDestroyed(SurfaceHolder holder)
{
boolean retry = true;
while (retry)
{
try
{
thread.join();
retry = false;
}
catch (InterruptedException e)
{
Log.d(TAG, e.getMessage());
}
}
}
Adil のリクエストとして、エラー メッセージを logcat に入れました。これらは、ゲームが強制的に閉じられたときのメッセージです:
03-11 15:04:21.491: E/ActivityManager(58): ANR in com.myslotgame (com.myslotgame /.ActivityMainGame)
03-11 15:04:21.491: E/ActivityManager(58): Reason: keyDispatchingTimedOut
03-11 15:04:21.491: E/ActivityManager(58): Load: 0.52 / 0.19 / 0.18
03-11 15:04:21.491: E/ActivityManager(58): CPU usage from 551359ms to 51ms ago:
03-11 15:04:21.491: E/ActivityManager(58): system_server: 4% = 3% user + 0% kernel / faults: 5766 minor
03-11 15:04:21.491: E/ActivityManager(58): adbd: 0% = 0% user + 0% kernel / faults: 55 minor
03-11 15:04:21.491: E/ActivityManager(58): m.android.phone: 0% = 0% user + 0% kernel / faults: 17 minor
03-11 15:04:21.491: E/ActivityManager(58): ndroid.launcher: 0% = 0% user + 0% kernel / faults: 1625 minor
03-11 15:04:21.491: E/ActivityManager(58): qemud: 0% = 0% user + 0% kernel
03-11 15:04:21.491: E/ActivityManager(58): events/0: 0% = 0% user + 0% kernel
03-11 15:04:21.491: E/ActivityManager(58): zygote: 0% = 0% user + 0% kernel / faults: 1201 minor
03-11 15:04:21.491: E/ActivityManager(58): id.defcontainer: 0% = 0% user + 0% kernel / faults: 77 minor
03-11 15:04:21.491: E/ActivityManager(58): logcat: 0% = 0% user + 0% kernel
03-11 15:04:21.491: E/ActivityManager(58): rild: 0% = 0% user + 0% kernel
03-11 15:04:21.491: E/ActivityManager(58): ndroid.settings: 0% = 0% user + 0% kernel / faults: 9 minor
03-11 15:04:21.491: E/ActivityManager(58): roid.alarmclock: 0% = 0% user + 0% kernel / faults: 14 minor
03-11 15:04:21.491: E/ActivityManager(58): re-initialized>: 0% = 0% user + 0% kernel / faults: 7 minor
03-11 15:04:21.491: E/ActivityManager(58): d.process.media: 0% = 0% user + 0% kernel / faults: 9 minor
03-11 15:04:21.491: E/ActivityManager(58): com.android.mms: 0% = 0% user + 0% kernel / faults: 16 minor
03-11 15:04:21.491: E/ActivityManager(58): +myslotgame: 0% = 0% user + 0% kernel
03-11 15:04:21.491: E/ActivityManager(58): -myslotgame: 0% = 0% user + 0% kernel
03-11 15:04:21.491: E/ActivityManager(58): TOTAL: 7% = 6% user + 1% kernel + 0% irq + 0% softirq