スリープ状態でもある特定条件下で勝手にやって欲しい処理はたくさんある。
JobScheduler使えばできそうだ。
※killBackgroundProcessesはアプリの終了ではなくタスクがKillされた状態をつくりだす。
バックグラウンドで待機状態にしてあったアプリを選択すると最初の画面に戻っていることが確認できる。セキュリティには要注意。
1. 準備
AndroidManifest.xml
<uses-permission android:name="android.permission.KILL_BACKGROUND_PROCESSES" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
</activity>
<service
android:name=".JobIntentService"
android:permission="android.permission.BIND_JOB_SERVICE"
tools:ignore="Instantiatable" />
</application>
2.クラス作成
JobIntentService
class SQLIntentService : JobService(){
override fun onStartJob(params: JobParameters?): Boolean {
//ここには載せないが非同期なども可能なので試してください
Log.d("できてる??", "できてる!!")
val activityM: ActivityManager =this.getSystemService(ACTIVITY_SERVICE) as ActivityManager
val appInfoList: List<ApplicationInfo> =this.packageManager.getInstalledApplications(0)
for (i in appInfoList.indices) {
Log.d("Killあぷり", appInfoList[i].packageName)
//ここで条件付けをすればアプリの取捨選択ができる
activityM.killBackgroundProcesses(appInfoList[i].packageName)
}
return false
}
override fun onStopJob(params: JobParameters?): Boolean {
stopSelf()
return false
}
}
3.実装
mainActivity
private fun alarmSet(){
alarmCancel()
val js = getSystemService(Context.JOB_SCHEDULER_SERVICE) as JobScheduler
val sq = SQLIntentService()
val serviceComponent = ComponentName(this, SQLIntentService::class.java)
val jobInfo = JobInfo.Builder(1, serviceComponent)
//試しに10秒、起動してスリープ状態で確認
.setMinimumLatency(10000)
.setOverrideDeadline(10000)
.build()
js.schedule(jobInfo)
}
private fun alarmCancel(){
val scheduler = getSystemService(Context.JOB_SCHEDULER_SERVICE) as JobScheduler
scheduler.cancelAll()
}
おまけ BroadcastReceiverとJobScheduler
かつてブロードキャストは特定のイベントが発生したときに送信するものであり受信すれば発火点として重宝されていた。
次第に
Android 7.0(API レベル 24)を対象とするアプリは、CONNECTIVITY_ACTION ブロードキャストを受信するようにマニフェストに登録しても受信せず、このブロードキャストに依存するプロセスは開始されません。
--できるだけ早くそれらの依存関係を削除してください。
BroadcastReceiverで行うやり方はあるがこれからはJobSchedulerをおすすめするってこと。