質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

Q&A

0回答

2049閲覧

Android Service()内のTimerが、端末スリープ状態で停止してしまう

kakashi55

総合スコア25

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

0グッド

0クリップ

投稿2021/08/29 07:21

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}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問