0

私は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
4

2 に答える 2

0

onStop()Android はバックグラウンドで予告なしにゲームを途中で終了しなければならない場合があるため、呼び出される保証はありませんが、onPause()常に呼び出されます。そのため、onPause()メソッドでは、レンダリング スレッドの終了など、停止している場合に実行するアクションを実行しますが、if ステートメントのようなものを配置if (isFinishing())して、アクティビティが実際に終了している場合に実行するアクションを実行することもできます。

注: メソッドを使用できるのは、アクティビティがクラス (このインスタンスのクラス) をisFinishing()拡張する場合のみです。ActivityActivityMainGame

于 2013-03-11T14:31:28.540 に答える
0

ホーム画面に行くとonPauseとonStopとonDestroyが呼び出されると思います。強制的に閉じた後、logcat を投稿できますか。

于 2013-03-11T14:31:48.450 に答える