Благодаря ответу @ Дерека, а также нескольким изменениям, я получил это на работу. Публикация рабочего решения здесь, на случай, если это кому-нибудь поможет.
PowerConnectionReciever.kt
import android.content.Intent
import android.content.BroadcastReceiver
import android.os.IBinder
import android.content.IntentFilter
import android.app.Service
import android.content.Context
class PowerConnectionService : Service() {
private var connectionChangedReceiver: BroadcastReceiver =
object : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
// This block gets run whenever the power connection state is changed
when {
intent.action == Intent.ACTION_POWER_CONNECTED ->
powerWasConnected()
intent.action == Intent.ACTION_POWER_DISCONNECTED ->
powerWasDisconnected()
}
}
}
override fun onCreate() {
val connectionChangedIntent = IntentFilter()
connectionChangedIntent.addAction(Intent.ACTION_POWER_CONNECTED)
connectionChangedIntent.addAction(Intent.ACTION_POWER_DISCONNECTED)
registerReceiver(connectionChangedReceiver, connectionChangedIntent)
}
override fun onStartCommand(
resultIntent: Intent, resultCode: Int, startId: Int): Int {
return startId
}
override fun onDestroy() {
super.onDestroy()
unregisterReceiver(connectionChangedReceiver)
}
override fun onBind(intent: Intent): IBinder? {
return null
}
private fun powerWasConnected() {
// Do whatever you need to do when the power is connected here
}
private fun powerWasDisconnected() {
// And here, do whatever you like when the power is disconnected
}
}
Затем в моем файле MainActivity.kt добавлена эта функция, которая вызывается в хуке onCreate
.
private fun startPowerConnectionListener() {
val serviceComponent = ComponentName(this, PowerConnectionService::class.java)
val builder = JobInfo.Builder(0, serviceComponent)
builder.setMinimumLatency((200)) // wait time
builder.setOverrideDeadline((200)) // maximum delay
val jobScheduler = this.getSystemService(JobScheduler::class.java)
jobScheduler.schedule(builder.build())
}
Единственные другие изменения, которые мне были нужны, были в AndroidMainifest.xml
Добавлено разрешение FOREGROUND_SERVICE
как элемент первого уровня:
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
И, конечно, также необходимо зарегистрировать новый PowerConnectionService
, это происходит в соответствующем activity
узле
<service
android:name=".PowerConnectionService"
android:permission="android.permission.BIND_JOB_SERVICE"
android:exported="true">
</service>