0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

定期的にバックグラウンドアプリ全リセット(killBackgroundProcessesとJobScheduler)

Last updated at Posted at 2025-01-27

スリープ状態でもある特定条件下で勝手にやって欲しい処理はたくさんある。
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をおすすめするってこと。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?