2013年3月3日日曜日

アプリの終了の仕方

メモメモ

現在作ってるゲームがACTIVITYを複数枚行き来していて、
その内のひとつがSurfaceViewを使っている。
終了させようとするとヌルポエラーがっ(´・ω・`)

検索して
Activityを終了させるのはfinish()
全体を終了させるのはmoveTaskToBack(true);

プロセスまで終了させるのは
android.os.Process.killProcess(android.os.Process.myPid());
↑でも非推奨らしい。

と分かった。でも、どの方法を試してもエラーが出るー。

と困ってたらThreadの終了の仕方と、
他ACTIVITYでの処理の仕方が間違ってたー。

thread = null
は終了方法でなく「もういらない宣言」なんだって。
そうだったのかー('ω')

SurfaceViewを入れてるACTIVITYのonPauseに
  public void onPause(){
     super.onPause();
     ActionView.finishLoop();
   }

 と書いてLoop終了メソッドを呼び出す。

そのループ終了のメソッドは
 public static void finishLoop() {
   synchronized (thread) {
    // ループを抜ける
    looper = false;
  }
   try{
     // スレッドの終了を待つ
     thread.join();
   } catch( InterruptedException ex ){

 
     Thread.currentThread().interrupt();
   }
 }

 としました。
参考にさせて頂いたどこかの企業様のBlogがURL分からなくなってしもた。
見つけたら追記しまする。

それで各ACTIVITYに戻るボタンを押したらダイアログを表示させるように。
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if(keyCode==KeyEvent.KEYCODE_BACK){
         new AlertDialog.Builder(Activity.this)
         .setMessage("終了してもいいですか?")
         .setCancelable(false)
         .setPositiveButton("はい",new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int id) {
                MySurfaceView.finishLoop();
                moveTaskToBack(true);
             }})
            
         .setNegativeButton("いいえ", new DialogInterface.OnClickListener() {
          public void onClick(DialogInterface dialog, int id) {
           dialog.cancel();}}).show();
          return true;
        }
        return false;
    }
SurfaceViewを含んでいないActivityにはmoveTaskToBack(true);だけ書いた。
(最初は全部にMySurfaceViewにあるthreadを終了させる文も書いてしまったので、
 もうないよ、とNullPointerが出ていたようです。。。。恥ずかしい。)

これで私の望み通りに完成!
うれしー(*´ω`*)

でもどうやら面倒がってstatic変数を多用してしまったせいか
メモリを使いすぎかもしれない・・・・・。

だもんで、現在清書も兼ねて、なるだけstatic変数を使わないよう移行中!
来週中には出来そうです(∩´∀`)∩~♥わーい

0 件のコメント:

コメントを投稿