Android Studioでkotlinにてアプリの開発をしております。
今回、Service()内のTimerが、端末がスリープ状態になった際に、カウントアップの処理が停止してしまう課題があります。
ネットで調べてみるとwakefulBroadcastReceiverが有効では?と書かれており、試みたものの初心者なうえ実装できておりません。
コードはwakefulBroadcastReceiver検討前になりますが、wakefulBroadcastReceiverを使用する場合どのようにコード変更ができるのか、
ご存知の方がおりましたらご教授いただけないでしょうか。
宜しくお願い致します。
kotlin
1package com.example.countuptimer 2 3import android.content.BroadcastReceiver 4import android.content.Context 5import android.content.Intent 6import android.content.IntentFilter 7import androidx.appcompat.app.AppCompatActivity 8import android.os.Bundle 9import android.text.format.Time 10import com.example.countuptimer.R 11import com.example.countuptimer.databinding.ActivityMainBinding 12import kotlin.math.roundToInt 13 14 15class MainActivity : AppCompatActivity() { 16 17 private lateinit var binding: ActivityMainBinding 18 private var timerStarted = false //最初は停止 19 private lateinit var serviceIntent: Intent //serviceクラスを使用するときにもIntentを使う 20 21 private var time = 0.0 //初めの時間はゼロ 22 23 override fun onCreate(savedInstanceState: Bundle?) //onCreateは1回だけ呼ばれる(初期化) 24 { 25 super.onCreate(savedInstanceState) 26 binding = ActivityMainBinding.inflate(layoutInflater) 27 setContentView(binding.root) 28 29 //ボタン処理 30 binding.startStopButton.setOnClickListener { startStopTimer() } //startボタン押されたとき 31 binding.resetButton.setOnClickListener { resetTimer() } //resetボタンが押されたとき 32 33 //(バックグラウンド処理)serviceクラスを使用するときにもIntentを使う 34 serviceIntent = Intent(applicationContext, TimerService::class.java) //第2引数にはserviceクラスを指定 35 registerReceiver(updateTime, IntentFilter(TimerService.TIMER_UPDATED)) //????? 36 } 37 38 39 //ボタンの処理/////////////////////////////////////////////////////////////////// 40 //resetボタン処理 41 private fun resetTimer() 42 { 43 stopTimer() //stopTimerの監査うう呼び出し 44 time = 0.0 //時間をゼロにする 45 binding.timeTV.text = getTimeStringFromDouble(time) //時間の表示をする 46 } 47 48 //startstopボタンが押されたとき 49 private fun startStopTimer() 50 { 51 if(timerStarted) //動作しているとき 52 stopTimer() 53 else //停止しているとき 54 startTimer() 55 } 56 ///////////////////////////////////////////////////////////////////////////////// 57 58 //時間処理////////////////////////////////////////////////////////////////////////// 59 private fun startTimer() 60 { 61 serviceIntent.putExtra(TimerService.TIME_EXTRA, time) //TimerService.Time_extraに timeの値を送る 62 startService(serviceIntent) //serviceメソッドの実行 63 binding.startStopButton.text = "Stop" 64 binding.startStopButton.icon = getDrawable(R.drawable.ic_baseline_pause_24) 65 timerStarted = true 66 } 67 68 private fun stopTimer() 69 { 70 stopService(serviceIntent) 71 binding.startStopButton.text = "Start" 72 binding.startStopButton.icon = getDrawable(R.drawable.ic_baseline_play_arrow_24) 73 timerStarted = false 74 } 75 //////////////////////////////////////////////////////////////////////////////// 76 77 78 //バックグラウンド処理 79 private val updateTime: BroadcastReceiver = object : BroadcastReceiver() 80 { 81 override fun onReceive(context: Context, intent: Intent) 82 { 83 time = intent.getDoubleExtra(TimerService.TIME_EXTRA, 0.0) //sendBroadcastで時間を受け取っている 84 binding.timeTV.text = getTimeStringFromDouble(time) //その時間を表示 85 binding.timeTVNext.text = time.toString() 86 } 87 } 88 89 //時間を取得して時間、分、秒に振り分け 90 private fun getTimeStringFromDouble(time: Double): String 91 { 92 val resultInt = time.roundToInt() 93 val hours = resultInt % 86400 / 3600 94 val minutes = resultInt % 86400 % 3600 / 60 95 val seconds = resultInt % 86400 % 3600 % 60 96 97 return makeTimeString(hours, minutes, seconds) 98 } 99 100 //数字を 文字列に変換 101 private fun makeTimeString(hour: Int, min: Int, sec: Int): String = String.format("%02d:%02d:%02d", hour, min, sec) 102}
TimeService.kt
1package com.example.countuptimer 2 3import android.app.Service 4import android.content.Intent 5import android.os.IBinder 6import java.util.* 7 8class TimerService : Service() { //Service()バックグラウンド動作 9 override fun onBind(p0: Intent?): IBinder? = null //onBind(抽象メソッド)を必ず実装する必要がある 10 11 private val timer = Timer() //timer暮らす 12 13 //バックグラウンドでの処理する内容 14 override fun onStartCommand(intent: Intent, flags: Int, startId: Int): Int 15 { 16 val time = intent.getDoubleExtra(TIME_EXTRA, 0.0) //intentを受け取り 変数timeに代入 17 timer.scheduleAtFixedRate(TimeTask(time), 0, 1000) //指定したタスクを、指定した時間に開始し 固定頻度毎に実行される 18 return START_NOT_STICKY //強制終了されても自動で再起動しない 19 } 20 21 override fun onDestroy() //サービスが破棄されたときの処理 22 { 23 timer.cancel() //現在のタスクを廃棄してタイマー終了する 24 super.onDestroy() 25 } 26 27 // 28 private inner class TimeTask(private var time: Double) : TimerTask() //カウントアップ専用のTimerTaskライブラリ 29 { 30 override fun run() //実行されるアクション 31 { 32 val intent = Intent(TIMER_UPDATED) 33 time++ 34 intent.putExtra(TIME_EXTRA, time) //intentに 時間timeを格納して、送る 35 sendBroadcast(intent) 36 } 37 } 38 39 companion object 40 { 41 const val TIMER_UPDATED = "timerUpdated" //文字列 42 const val TIME_EXTRA = "timeExtra" 43 } 44 45}
あなたの回答
tips
プレビュー