ランダムな間隔でユーザーに思い出させるサービスを作成しています。このサービスはアクティビティによって開始され、サービスとしてバックグラウンドで実行されます。
私が直面している課題は、ユーザーが電話をスリープ状態(空白の画面)にすると、場合によってはサウンドが再生されないことです。時間がなくなりましたが、サウンドは時間どおりに再生されないか、ユーザーが電話を復帰させたときに再生されます。
ここにいくつかのコードがあります:
/**
* Starts a new thread which is checking every seconds how much time has
* elapsed and if the point of time has come to play the sound.
* Once the time has come, it gets the next ring time and continues
* until it is shut down by the user
*/
private void runCheck() {
Log.i(tag, "starting runCheck");
Thread thread = new Thread() {
public void run() {
Log.i(tag, "starting LogoTimerThread");
while (vRunningFlag) {
try {
// update the notification
makeNotification();
Log.v(tag,
"Next Ring in : ["
+ helper.TimeCalculator
.duration2_hh_MM_SS((vTimerNextRing - System
.currentTimeMillis()) / 1000)
+ " sec.]");
// check if time has run out
if (vTimerNextRing < System.currentTimeMillis()) {
// reset the timer
setNextRingTime();
// update the screen
makeNotification();
// play the sound
playLTimerSound();
}
sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
Log.i(tag, "finished LogoTimerThread");
}
};
thread.start();
}
サービス全体がフォアグラウンドに設定されたリモートサービスとして実行されているため、通知によってユーザーにサービスが通知され、その方法でサービスを停止できます。
コメントアウトするplayLTimerSound()
と、タイマーはカウントダウンします。どういうわけか、音の再生によってスレッドが停止します。
その関数もここにあります:
public void playLTimerSound() {
Log.i(tag, "playLogoTimerSound - volume:" + vVolume);
MediaPlayer mp = MediaPlayer.create(this, R.raw.enterprise);
mp.setVolume(2.0f, 2.0f);
mp.start();
mp.setOnCompletionListener(new OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
// TODO Auto-generated method stub
mp.release();
}
});
}