2013-03-29 2 views
1

Я совершенно не знаком с разработкой Android, и я работаю над книгой (практическая разработка игр для Android 4), чтобы сделать игру под названием starfighter. Это проблема на экране меню.Разработка Android, onClickListener не работает

Кнопка выхода используется для работы и закрывает приложение. Поскольку я работал, играя музыку в фоновом режиме, он больше не работает. Нажатие на выход останавливает музыку, но не закрывает приложение, и я не могу понять, почему, пожалуйста, любая помощь? Код ниже:

SFMainMenu.java:

package com.example.starfighter; 

import android.app.Activity; 
import android.content.Intent; 
import android.os.Bundle; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.ImageButton; 

public class SFMainMenu extends Activity { 

    //Called when the activity is first created 
    @Override 
    public void onCreate(Bundle savedInstanceState){ 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     //Fire up background music 
     SFEngine.musicThread = new Thread(){ 
      public void run(){ 
       Intent bgmusic = new Intent(getApplicationContext(), SFMusic.class); 
       startService(bgmusic); 
       SFEngine.context = getApplicationContext(); 
      } 
     }; 
     SFEngine.musicThread.start(); 

     final SFEngine engine = new SFEngine(); 

     //Set menu button options 
     ImageButton start = (ImageButton)findViewById(R.id.btnStart); 
     ImageButton exit = (ImageButton)findViewById(R.id.btnExit); 

     start.getBackground().setAlpha(SFEngine.MENU_BUTTON_ALPHA); 
     start.setHapticFeedbackEnabled(SFEngine.HAPTIC_BUTTON_FEEDBACK); 

     exit.getBackground().setAlpha(SFEngine.MENU_BUTTON_ALPHA); 
     exit.setHapticFeedbackEnabled(SFEngine.HAPTIC_BUTTON_FEEDBACK); 

     start.setOnClickListener(new OnClickListener(){ 
      @Override 
      public void onClick(View v){ 
       //Start the game!!! 
      } 
     }); 

     exit.setOnClickListener(new OnClickListener(){ 
      @Override 
      public void onClick(View v){ 
       boolean clean = false; 
       clean = engine.onExit(v); 
       if(clean){ 
        int pid = android.os.Process.myPid(); 
        android.os.Process.killProcess(pid); 
       } 
      } 
     }); 
    } 

} 

SFEngine.java

package com.example.starfighter; 

import android.view.View; 
import android.content.Context; 
import android.content.Intent; 

public class SFEngine { 

    //Constants that will be used in the game 
    public static final int GAME_THREAD_DELAY = 4000; 
    public static final int MENU_BUTTON_ALPHA = 0; 
    public static final boolean HAPTIC_BUTTON_FEEDBACK = true; 
    public static final int SPLASH_SCREEN_MUSIC = R.raw.looptrouble; 
    public static final int R_VOLUME = 100; 
    public static final int L_VOLUME = 100; 
    public static final boolean LOOP_BACKGROUND_MUSIC = true; 
    public static Context context; 
    public static Thread musicThread; 

    //Kill game and exit 
    public boolean onExit(View v){ 
     try{ 
      Intent bgmusic = new Intent(context, SFMusic.class); 
      context.stopService(bgmusic); 
      musicThread.stop(); 
      return true; 
     }catch(Exception e){ 
      e.printStackTrace(); 
      return false; 
     } 
    } 

} 

Затмение дает предупреждение на линии musicThread.stop() - метод остановки от типа Тема устарела.

Заранее благодарен! :)

РЕДАКТИРОВАТЬ:

Также добавили этот класс, SFMusic, которые могут иметь отношение:

package com.example.starfighter; 

import android.app.Service; 
import android.content.Intent; 
import android.media.MediaPlayer; 
import android.os.IBinder; 
import android.content.Context; 

public class SFMusic extends Service { 

    public static boolean isRunning = false; 
    MediaPlayer player; 

    @Override 
    public IBinder onBind(Intent arg0){ 
     return null; 
    } 

    @Override 
    public void onCreate(){ 
     super.onCreate(); 
     setMusicOptions(this, SFEngine.LOOP_BACKGROUND_MUSIC, SFEngine.R_VOLUME, SFEngine.L_VOLUME, 
       SFEngine.SPLASH_SCREEN_MUSIC); 
    } 

    public void setMusicOptions(Context context, boolean isLooped, int rVolume, int lVolume, int soundFile){ 
     player = MediaPlayer.create(context, soundFile); 
     player.setLooping(isLooped); 
     player.setVolume(rVolume, lVolume); 
    } 

    public int onStartCommand(Intent intent, int flags, int startId){ 
     try{ 
      player.start(); 
      isRunning = true; 
     } catch(Exception e){ 
      isRunning = false; 
      player.stop(); 
     } 
     return 1; 
    } 

    public void onStart(Intent intent, int startId){ 

    } 

    public void onStop(){ 
     isRunning = false; 
    } 

    public IBinder onUnBind(Intent arg0){ 
     //TODO Auto-generated method stub 
     return null; 
    } 

    public void onPause(){ 

    } 

    @Override 
    public void onDestroy(){ 
     player.stop(); 
     player.release(); 
    } 

    @Override 
    public void onLowMemory(){ 
     player.stop(); 
    } 

} 

я попробовал добавление Println в качестве первой строки кода в методе OnClick. На консоль ничего не выводилось, поэтому я не уверен, что метод вызывается. Но потом я смущен, почему музыка все еще останавливается.

+3

Если эта книга, на которой вы работаете, фактически содержала вызов 'killProcess', затем верните его в магазин и верните деньги. – 323go

+1

вам нужно завершить работу приятеля. – zaiff

+0

удалить boolean clean = false; –

ответ

0
Use 

System.exit(0); 

Before that 

stopservice(); 
Thread.stop(); 

should be done 
+0

System.exit (0) - это плохая практика. Finish() - это соответствующий вызов для информирования ОС о том, что ваша деятельность выполнена с тем, что ей нужно делать ... – snowCrabs

+0

Спасибо за ваш ответ, но я забыл добавить - Я не уверен, что метод onclick() для кнопки выхода фактически запущен. Потому что я попытался добавить System.out.println («test») в качестве первой строки, и он не выводился на консоль. Но потом я смущен, почему музыка все еще останавливается. Также попробовал System.exit (0) в инструкции if, несмотря на то, что это была плохая практика, чтобы увидеть, если она сработала, и это не так. – Chris

0

Я предлагаю вам удалить код, который убивает ваш процесс по ID, потому что это плохая практика, и Android может перезапустить убитое приложение. Используйте вместо этого finish();.

Смежные вопросы