참고
https://developer.android.com/topic/performance/background-optimization.html
Implicit Broadcast Intent 제한
Broadcast를 날렸다고 했을 때 전달 대상이 한정되어있지 않으므로 문제가 됨. 이는 차를 빼기 위하여 아파트 전체에 방송을 하는 것과 마찬가지이다.
이러한 Intent들은 가능한 빨리 제거해야한다.
이에 대한 솔루션은 JobScheduler 와 new WorkManager가 있으며 원하는 조건에 맞게 네트워크 관련 처리를 스케쥴링 하여준다.
targetSDK ≥ 26 경우에만 적용이 가능하다
하지만 targetSDK에 따른 코드구현으로만 안심을 하면 안된다. 참조 _ https://developer.android.com/about/versions/oreo/background#broadcasts
그래서 JobScheduler란?
백그라운드 동작을 최적화, 작업에 필요한 조건 및 인자를 JobInfo에, 해당 조건의 동작을 JobService에 등록하여 적절한 실행 시점에 제어되는 백그라운드 실행기능
공식
JobScheduler - https://developer.android.com/reference/android/app/job/JobScheduler.html#cancel(int)
JobInfo - https://developer.android.com/reference/android/app/job/JobInfo.html
JobInfo.Builder - https://developer.android.com/reference/android/app/job/JobInfo.Builder.html
JobService - https://developer.android.com/reference/android/app/job/JobService.html#onStopJob(android.app.job.JobParameters)
Intent intent = new Intent(this, MyJobService.class);
startService(intent);
private void setUpdateJob(Context context) {
JobInfo job = new JobInfo.Builder(JOB_ID_UPDATE, new ComponentName(this, MyJobService.class))
.setRequiresCharging(true)
.setPersisted(true)
.build();
jobScheduler = (JobScheduler) context.getSystemService(Context.JOB_SCHEDULER_SERVICE);
jobScheduler.schedule(job);
}
public class MyJobService extends JobService {
boolean start = true;
@Override
public void onCreate() {
super.onCreate();
Log.d("TEST", "onCreate JobService");
}
@Override
public boolean onStartJob(JobParameters params) {
Log.d("TEST", String.valueOf(params.getJobId()));
Toast.makeText(this, "Start JobService", Toast.LENGTH_SHORT).show();
return false;
}
@Override
public boolean onStopJob(JobParameters params) {
start = false;
Toast.makeText(this, "Stop JobService", Toast.LENGTH_SHORT).show();
Log.d("TEST", String.valueOf(params.getJobId()));
Log.d("TEST", "Stop JobService");
return false;
}
}