-
Background process 는 User 가 알 수 없게 cpu, memory, battery 등을 소모한다.
Android 7.0 ( API 24 ) 부터는 다음과 같은 제약이 추가되었다.
targetSdk 24 이상인 앱의 경우 manifest 에 CONNECTIVITY_ACTION 를 등록해도 broadcast 를 받지 못한다. Context.registerReceiver() 를 통한 Runtime receiver 를 등록한 경우에만 받을 수 있다.
앱은 ACTION_NEW_PICTURE 나 ACTION_NEW_VIDEO broadcast 를 보내거나 받을 수 없다. ( 이것은 Android 7.0 target 이 아닌 단말 기준으로 모든 앱에 작동한다. )
-
만약 위에 명시된 Action 들을 사용하고 있었다면 JobScheduler 나 GcmNetworkManager 가 그 대안이 될 수 있다.
JobScheduler 를 이용해 ContentProvider 의 변경에 반응할 수도 있다.
JobInfo 는 JobScheduler 가 사용하는 parameter 들을 캡슐화시킨 것이다.
Job condition 이 만족하면 system 은 JobService 를 수행시켜 해당 job 을 수행한다.
Restrictions on CONNECTIVITY_ACTION
-
무제한 이용가능한 network 를 사용하는 경우는 아래와 같이 대응할 수 있다.
public static void scheduleJob(Context context){
JobScheduler js = (JobScheduler) context.getSystemService(Context.JOB_SCHEDULER_SERVICE);
JobInfo job = new JobInfoBuilder(MY_BACKGROUND_JOB, new ComponentName(context, MyJobService.class))
.setRequirednetworkType(JobInfo.NETWORK_TYPE_UNMETERED)
.setRequiredCharging(true)
.build();
js.schedule(job);
}
JobInfo 의 조건이 충족되면 JobService 의 onStartJob() 이 불린다.
Android 5.0 ( API 21 ) 이하의 앱이나 GMSCore service 를 사용하는 앱은 GcmNetworkManager 와 Task.NETWORK_STATE_UNMETERED 를 이용해서 구현할 수 있다.
-
App 이 Running 중에는 Runtime broadcast 를 이용해서 해당 action 을 listen 할 수도 있지만 ConnectivityManager 의 api 를 이용해서도 listen 할 수도 있다. 그리고 이 방법이 더 추천된다.
NetworkRequest 는 NetworkCapabilities callback 에 관련된 param 들을 담고 있다.
NetworkRequest.Builder 를 이용해서 해당 instance 를 만들고 registerNetworkCallback() 에 전달하면, 조건이 맞을 때 ConnectivityManager.NetworkCallback 의 callback 이 불린다.
NEW_PICTURE, NEW_VIDEO
-
Android 7.0 ( API 24 ) 부터는 JobInfo 에 기능이 추가되었다.
JobInfo.TriggerContentUri()
Uri change 에 의해 trigger 가 되도록 한다.
JobInfo.Builder.addTriggerContentUri()
위의 함수와 동일하지만, Builder 를 통해 한다.
여러 개를 등록 할 수도 있다.
TriggerContentUri.FLAG_NOTIFY_FOR_DESCENDANTS flag 를 주면 Uri 의 descendants 가 변화되었을 때도 불린다.
-
public static void scheduleJob(Context context){
JobScheduler js = (JobScheduler) context.getSystemService(Context.JOB_SCHEDULER_SERVICE);
JobInfo job = new JobInfoBuilder(MY_BACKGROUND_JOB, new ComponentName(context, MediaContentJob.class))
.addTriggerContentUri( new JobInfo.TriggerContentUri(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, JobInfo.TriggerContentUri.FLAG_NOTIFY_FOR_DESCENDANTS))
.build();
js.schedule(job);
}
-
Android 7.0 ( API 24 ) 부터 JobParameters 가 확장되었다.
Uri[] getTriggeredContentUris()
String[] getTriggeredContentAuthorities()
Further Optimizing your App
-
Android 7.0 ( API 24 ) 부터, ADB 를 이용해서 다음을 테스트할 수 있다.
implicit broadcast 와 background service 를 unavailable 하게 만들려면
$ adb shell cmd appops set <package_name> RUN_IN_BACKGROUND ignore
반대로 다시 available 하게 만들려면
$ adb shell cmd appops set <package_name> RUN_IN_BACKGROUND allow
참고 자료
https://developer.android.com/topic/performance/background-optimization.html
끝!
'프로그래밍 놀이터 > 안드로이드, Java' 카테고리의 다른 글
[Android] ART 의 GC 이야기 (0) | 2018.10.10 |
---|---|
Overview of Android Memory Management ( 안드로이드의 메모리 관리 ) (0) | 2018.10.09 |
[android] Gradle Tutorial #2 (0) | 2018.10.05 |
[android] Gradle Tutorial #1 (0) | 2018.10.04 |
[정리] 안드로이드 전문가 되는 법 (0) | 2018.10.03 |
댓글