私は Android 開発の初心者で、本 (実用的な Android 4 ゲーム開発) を読んで starfighter というゲームを作成しています。これはメニュー画面の問題です。
以前は終了ボタンが機能し、アプリケーションを閉じていました。バックグラウンドで音楽を再生していたため、機能しなくなりました。終了をクリックすると音楽が停止しますが、アプリケーションは閉じず、理由がわかりません。何か助けてください。コードは以下のとおりです。
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;
}
}
}
Eclipse は行 musicThread.stop() で警告を出しています - タイプ Thread からのメソッド 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();
}
}
onClick メソッドのコードの最初の行として println を追加してみました。コンソールに何も出力されなかったので、メソッドが呼び出されているかどうかわかりません。しかし、なぜ音楽がまだ止まっているのか、私は混乱しています。