端末がスリープしても動き続けるバックグラウンド処理
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は、バッテリーを消費するので、必要最低限にする必要があります。