ともちゃんのアプリ開発日記

組込みC言語プログラマだったともちゃんが、四苦八苦しながら、AndroidのJAVA/Kotlin、iOSのSwiftUIを習得して行きます。ともちゃんの備忘録も兼ねています。

端末がスリープしても動き続けるバックグラウンド処理

HandlerとWakeLockで実現しました。(ソースコードはKotlinで書いています。)

 

AndroidManifest.xml

<uses-permission android:name="android.permission.WAKE_LOCK" />

 

 時間を刻むタイマーサービス

TimerService.kt

class TimerService : Service() {

val handler = Handler()

companion object {
private var wakelock : PowerManager.WakeLock? = null
private var timer : Timer? = null
}

override fun onBind(intent: Intent): IBinder? {
return null
}

override fun onCreate() {
super.onCreate()

val databaseManager = DatabaseManager()
databaseManager.openDatabaseAll(applicationContext)

val myNotification = MyNotification(applicationContext)
myNotification.displayNotification()

val powerManager = applicationContext!!.getSystemService(Context.POWER_SERVICE) as PowerManager
wakelock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "PartialWakelock")
wakelock!!.acquire()

}

override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
super.onStartCommand(intent, flags, startId)

var count = 0L
var timePrevious : Long
var timeNow = System.currentTimeMillis()
var timeDifference : Long

handler.postDelayed(object : Runnable {
override fun run() {
OnOffSetter() // タイマー内の処理
handler.postDelayed(this, 15*1000)

timePrevious = timeNow
timeNow = System.currentTimeMillis()
timeDifference = timeNow - timePrevious
count++
Log.i("TimerService", count.toString()+"/"+timeDifference.toString())

}
}, 15*1000)

return START_STICKY
}

override fun onDestroy() {
super.onDestroy()

handler.removeCallbacksAndMessages(null)

val myNotification = MyNotification(applicationContext)
myNotification.cancelNotification()

if (wakelock != null) {
wakelock!!.release()
}

}
}

 

 タイマーを起動する処理

val intent = Intent(this, TimerService::class.java)
startService(intent)

stopService(intent)

 

 

WakeLockは、バッテリーを消費するので、必要最低限にする必要があります。