Windows10, Android Studio3.5.2(Java)で時間制限のあるゲームを作っています。
ゲーム開始と同時にタイマーのカウントダウンが始まり、BGMが流れるのですが、
スマホをスリープ状態にしたりホーム画面に戻ってもBGMが流れっぱなしになり、
カウントダウンも止まらず動き続けてしまいます(再度アプリ画面に戻るとカウントが進んでいる)。
スリープ状態にしたりホーム画面に戻ったりしたときに、BGM、タイマーのカウントダウンが止まり、
アプリの画面に戻った時に再び開始するようにするにはどうしたらいいでしょうか?
ソースコードすべてのせると長いので、該当部分をのせます↓
Java
1 2public class MainActivity extends AppCompatActivity { 3 4 Button playAgainButton; 5 6 7 TextView timerTextview; 8 int score = 0; 9 int numberOfQusetions = 0; 10 11 12 13 //ゲーム開始時のカウントダウンタイマーの残り時間を表す定数 14 final int remainingTime = 21; 15 //カウントダウンタイマーのカウントダウンの間隔を表す定数 16 final int countDownInterval = 1000; 17 18 MediaPlayer bgm; 19 20 21 TextView scoreTextView; 22 23 24 25 //playaAgainボタンを押したときの挙動を定義 26 public void playAgain(View view) { 27 score = 0; 28 numberOfQusetions = 0; 29 bgm = create(getApplicationContext(), R.raw.startshort); 30 31 //残り何秒か表示 32 timerTextview.setText(remainingTime + "s"); 33 34 //何問中何問正解しているか表示 35 scoreTextView.setText("0/0"); 36 37 //playAgainButtonを見えなくする 38 playAgainButton.setVisibility(View.INVISIBLE); 39 40 //新しい問題と選択肢を表示 41 newQuetion(); 42 43 44 45 //BGM再生開始 46 bgm.start(); 47 48 //4つのボタン(選択肢)出現 49 buttonShow(); 50 51 52 53 //カウントダウンタイマーをスタートさせる 54 new CountDownTimer(remainingTime * 1000, countDownInterval) { 55 56 //CountDownTimerクラスのメソッドを上書き 57 @Override 58 //カウントダウンしている間の挙動 59 public void onTick(long millisUntilFinished) { 60 61 //残り何秒か表示 62 timerTextview.setText(String.valueOf(millisUntilFinished / 1000) + "s"); 63 64 } 65 66 @Override 67 //カウントダウンが0になった時の挙動 68 public void onFinish() { 69 70 bgm.stop(); 71 72 73 //playAgainButton出現 74 playAgainButton.setVisibility(View.VISIBLE); 75 76 } 77 78 }.start(); 79 80 } 81
追記
コードが長いので、機能を絞ったアプリを新たに作り、
コメントで教えていただいたCountDownTimerを拡張したクラスを新しいファイルにコピペしてつかってみました。
MainActivity.Javaに
Java
1 //BGM 2 MediaPlayer bgm; 3 //効果音 4 MediaPlayer se1; 5 6 CountDownTimer timer; 7 8 //BGMが流れているか 9 boolean bgmPaused =false; 10 11 12 //アプリ中断時、BGMとカウントダウンを止める 13 @Override 14 public void onPause() { 15 super.onPause(); 16 bgm.stop(); 17 bgmPaused = true; 18 bgm.release(); 19 20 timer.pause(); 21 22 } 23 24 25 @Override 26 public void onResume() { 27 super.onResume(); 28 29 if(bgmPaused) { 30 bgm.start(); 31 bgmPaused = false; 32 timer.resume(); 33 } 34 } 35 36
アプリ中断時onPauseメソッドだけであれば、BGM、カウントダウンの停止ができるようになったのですが、
アプリを再び開いたときにBGM、カウントダウンを再開させようとonResumeメソッドを書いたところ、
アプリを再び開くとアプリが「繰り返し停止しています」と表示されるようになってしまいました。
(bgmをpauseしたところから再生再開するメソッドがなさそうだったのでbgm.pauseではなくbgm.stopを使っています)
どのように書いたらアプリ再開時にうまく動作するでしょうか?
↓MainActivity全体
Java
1package com.example.countdowntimer1; 2 3import androidx.appcompat.app.AppCompatActivity; 4 5import android.media.MediaPlayer; 6import android.os.Bundle; 7import android.view.View; 8import android.widget.Button; 9import android.widget.TextView; 10 11import static android.media.MediaPlayer.create; 12 13public class MainActivity extends AppCompatActivity { 14 15 TextView timerTextView; 16 Button playAgainButton; 17 18 //BGM 19 MediaPlayer bgm; 20 //効果音 21 MediaPlayer se1; 22 23 CountDownTimer timer; 24 25 //BGMが流れているか 26 boolean bgmPaused =false; 27 28 29 30 public void playAgain(View view) { 31 bgm = create(getApplicationContext(), R.raw.startshort); 32 bgm.start(); 33 34 //シャキーンを効果音に設定 35 se1 = create(getApplicationContext(), R.raw.shakin1); 36 37 38 timer = new CountDownTimer(10000,1000) { 39 40 41 @Override 42 public void onTick(long millisUntilFinished) { 43 timerTextView.setText(String.valueOf(millisUntilFinished / 1000) + "s"); 44 45 } 46 47 @Override 48 public void onFinish() { 49 timerTextView.setText("Finish!"); 50 se1.start(); 51 bgm.stop(); 52 } 53 }; 54 55 timer.start(); 56 57 58 } 59 60 //ここから追加したコード 61 //アプリ中断時、BGMとカウントダウンを止める 62 @Override 63 public void onPause() { 64 super.onPause(); 65 bgm.stop(); 66 bgmPaused = true; 67 bgm.release(); 68 69 timer.pause(); 70 71 } 72 73 @Override 74 public void onResume() { 75 super.onResume(); 76 77 //BGMが停止していたら 78 if(bgmPaused) { 79 bgm.start(); 80 bgmPaused = false; 81 timer.resume(); 82 83 } 84 } 85 //ここまで 86 87 @Override 88 protected void onCreate(Bundle savedInstanceState) { 89 super.onCreate(savedInstanceState); 90 setContentView(R.layout.activity_main); 91 92 timerTextView = findViewById(R.id.timerTextView); 93 playAgainButton = findViewById(R.id.playAgainButton); 94 95 96 } 97} 98 99 100
回答1件
あなたの回答
tips
プレビュー