Oreo 지원 - 배경 작업 편

배경.


Android Oreo의 출시로 인해 백그라운드에서 자주 이동하던 Service는 이동할 수 없으므로 이에 대응합니다.다음은 대응하는 기록이다.
Android Oreo Background Limit

대책


서비스를 직접 사용할 수 없기 때문에, 안드로이드 문서에서 추천하는 JobScheduller를 사용해서 실현하고 싶습니다.
선택 항목에는 다음 프로그램 라이브러리가 있습니다.

그나저나 에버노트android-job가 만든 프로그램 라이브러리도 있지만 워크매니저의 설치는 같다.
이 중 가능하면 API 등급이 낮고 유연하게 대응하는 기준은 WorkManager를 선택하는 것이다.

장점

  • API 14+
  • No require Google Play Service
  • Google 출시
  • 터미널의 OS 버전과 응용된 targetSdkVersion을 통해 유연하게 대응할 수 있음
  • 결점

  • WorkManager는 아직 알파 버전에 있음
  • https://developer.android.com/jetpack/docs/release-notes
  • 이루어지다

  • Worker 설치
  • public class MyWorker extends Worker {
        public static final String TAG = MyWorker.class.getSimpleName();
    
        @NonNull
        @Override
        public Result doWork() {
            LogUtil.debug(TAG, "Start My Worker");
    
            try {
                MYTracking myTracking = MyTracking.getInstance(getApplicationContext());
                myTracking.start();
            }
            catch (Exception e) {
                e.printStackTrace();
                // TODO: deal with exception
                return Result.RETRY;
            }
            return Result.SUCCESS;
        }
    }
    
  • Tracking 클래스 구현
  • public class MyTracking {
    
        private MyTracking() {
    
        }
    
        public static MyTracking getInstance(Context _context) {
            context = _context;
    
            return instance;
        }
    
        public void start() {
            if (ActivityCompat.checkSelfPermission(context, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
                LogUtil.e(TAG, "Need ACCESS_FINE_LOCATION permission to start MyWorker!");
                return;
            }
    
            // 制約を設定する
            Criteria criteria = new Criteria();
            criteria.setSpeedRequired(false);
            criteria.setAltitudeRequired(false);
            criteria.setBearingRequired(false);
            criteria.setCostAllowed(true);
    
            locationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
            String bestProvider = locationManager.getBestProvider(criteria, true);
            LogUtil.debug(TAG, "The best provider is: " + bestProvider);
    
            Looper looper = Looper.getMainLooper();
            MyListener myListener = new MyListener(context);
    
            locationManager.requestSingleUpdate(bestProvider, myListener, looper);
        }
    }
    
  • Main의create 방법에서 Worker
  • 호출
    private void startTracking() {
            Constraints constraints = new Constraints.Builder().setRequiredNetworkType(NetworkType.CONNECTED).build();
            PeriodicWorkRequest request = new PeriodicWorkRequest.Builder(MyWorker.class, REPEAT_INTERVAL, TimeUnit.MINUTES).setConstraints(constraints).addTag(MyWorker.TAG).build();
            // すでにMyWorkerが存在している場合は、入れ替えます。
            WorkManager.getInstance().enqueueUniquePeriodicWork("MyWorker", ExistingPeriodicWorkPolicy.REPLACE, request);
        }
    

    감상


    WorkManager를 사용하면 백그라운드 작업이 상당히 수월해집니다.

    인용하다

  • https://developer.android.com/about/versions/oreo/background?hl=ja
  • https://developer.android.com/jetpack/docs/release-notes
  • https://developer.android.com/jetpack/
  • 좋은 웹페이지 즐겨찾기