1

私は 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 を追加してみました。コンソールに何も出力されなかったので、メソッドが呼び出されているかどうかわかりません。しかし、なぜ音楽がまだ止まっているのか、私は混乱しています。

4

2 に答える 2

0

ID でプロセスを強制終了するコードを削除することをお勧めします。これは悪い習慣であり、Android が強制終了したアプリを再起動する可能性があるためです。finish();代わりに使用してください。

于 2013-03-29T13:57:26.017 に答える
0
Use 

System.exit(0);

Before that 

stopservice();
Thread.stop();

should be done
于 2013-03-29T13:15:36.497 に答える