Android 절전 의 비밀의 JobScheduler

JobScheduler 는 Android L 버 전에 새로 도 입 된 API 로,JobScheduler 는 말 그대로 스케줄 링 작업 에 사용 된다.작업 이 배 치 된 조건 은 네트워크 변화,충전 플러그,주기 집행 등 을 포함한다.사용 장면 은 와 이 파이 조건 에서 데이터 다운로드 업로드 등 을 포함한다.구 글 은 왜 이 새로운 API 를 도입 하려 고 합 니까?전 기 를 절약 하기 위해 제 정 된 규범 이다.모든 개발 자가 이 API 를 이용 하여 와 이 파이 네트워크 에서 데 이 터 를 업로드 하면 데이터 업로드 작업 이 같은 시간 대 에 통일 되 고 대량으로 처리 되 어 많은 응용 프로그램 이 단독으로 깨 우 는 것 보다 전 기 를 절약 할 수 있 습 니 다.
다음은 작은 예 를 보 여 드 리 겠 습 니 다.
메 인 활동
builder.setRequiredNetworkType(JobInfo.NETWORK_TYPE_UNMETERED); 무료 인터넷

public class MainActivity extends Activity {
 JobScheduler js;
 JobInfo.Builder builder;
 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  js=(JobScheduler) getSystemService(Context.JOB_SCHEDULER_SERVICE);
  builder=new Builder(1, new ComponentName(this, DemoService.class));
  builder.setRequiredNetworkType(JobInfo.NETWORK_TYPE_UNMETERED);
  js.schedule(builder.build());
 }
}
스케줄 러 가 필요 한 Job
와 이 파이 가 사용 가능 할 때 이 DemoService 는 onStartJob 을 실행 합 니 다.

public class DemoService extends JobService{
 @Override
 public boolean onStartJob(JobParameters params) {
  // TODO Auto-generated method stub
  final JobParameters mJobParameters=params;
  AsyncTask<Void, Void, Void> mTask = new AsyncTask<Void, Void, Void>() {
  @Override
  protected Void doInBackground(Void... params) {
   // TODO Auto-generated method stub
   return null;
  }
  @Override
  protected void onPostExecute(Void result) {
   // TODO Auto-generated method stub
   Toast.makeText(wenfengService.this, "hello", 1000).show();
   jobFinished(mJobParameters, true);
   super.onPostExecute(result);
  }
  };
  mTask.execute();
  return true;
 }
 @Override
 public boolean onStopJob(JobParameters params) {
  // TODO Auto-generated method stub
  Toast.makeText(this, "bye", 1000).show();
  return true;
 }
}
리스트

<service
 android:name=".DemoService "
android:permission="android.permission.BIND_JOB_SERVICE"
 android:exported="true"/>

onStartJob.png
onStartJob 함수 에는 항상 두 가지 장면 이 있 습 니 다.
1.시간 이 걸 리 지 않 는 동작,이 때 는 false 로 돌아 가 야 합 니 다.
2.시간 이 걸 리 는 작업,예 를 들 어 데이터 다운로드 등 은 새로운 스 레 드 를 열 어야 합 니 다(JobService 는 메 인 스 레 드 에서 뛰 기 때 문 입 니 다).그리고 true 로 돌아 갑 니 다.
만약 스케줄 링 이 임무 수행 에 실패한다 면 어떻게 합 니까?
작업 이 실패 한 경우 가 많 습 니 다.예 를 들 어 다운로드 에 실 패 했 습 니 다.예 를 들 어 다운로드 과정 에서 와 이 파이 가 끊 겼 습 니 다.
문제 없습니다.구 글 은 재 조정 에 편리 한 방법 을 제공 합 니 다.
예 를 들 어 다운로드 과정 에서 와 이 파이 가 끊 기 면 JobService 는 onStopJob 함 수 를 되 돌려 줍 니 다.이것 은 함수 의 반환 값 을 true 로 설정 하면 됩 니 다.와 이 파이 가 다시 연결 되면 JobService 는 onStartJob 함 수 를 다시 바 꿉 니 다.
다운로드 에 실 패 했 습 니 다.예 를 들 어 위의 예 에서 AsyncTask 가 실 패 했 습 니 다.어떻게 해 야 합 니까?우 리 는 AsyncTask 의 onPost Execute 에서 job Finished(mJobParameters,true)를 실행 해 야 합 니 다.이곳 의 true 대표 임 무 는 와 이 파이 조건 이 다시 만족 하 는 상황 에서 재 조정 해 야 합 니 다.경전의 쓰 기 는 다음 과 같다.
스케줄 링 시작

@Override
public boolean onStartJob(final JobParameters params) {
 mDownloadArtworkTask = new DownloadArtworkTask(this) {
 @Override
 protected void onPostExecute(Boolean success) {
  jobFinished(params, !success);
 }
 };
 mDownloadArtworkTask.execute();
 return true;
}
스케줄 을 정지 하 다

@Override
public boolean onStopJob(final JobParameters params) {
 if (mDownloadArtworkTask != null) {
 mDownloadArtworkTask.cancel(true);
 }
 return true;
}
만약 스케줄 러 의 임무 가 늘 실 패 를 한다 면 어떻게 합 니까?
전 기 를 절약 하기 위해 실패 한 임 무 는 집행 조건 이 만족 하 는 상황 에서 일정 시간 을 연기 해 야 집행 할 수 있다.그리고 실패 횟수 가 늘 어 나 면서 지연 시간 이 길어진다.예 를 들 어 와 이 파이 가 끊 겨 실패 한 작업 은 와 이 파이 가 연 결 된 후 바로 수행 되 지 않 고 일정 시간 지연 되 어야 수행 할 수 있 습 니 다.
지연 시간=30s*실패 횟수.
아래 그림 은 JobScheduler 가 framework 층 에 있 는 순서 그림 입 니 다.다음 장 은 adb 명령 으로 JobScheduler 의 상황 을 직관 적 으로 볼 것 입 니 다.놓 치지 마 세 요.문제 가 있 으 면 메 시 지 를 남 겨 도 됩 니 다.모두 함께 토론 합 시다!

JobScheduler 내부 순서 도
이상 은 본 고의 모든 내용 입 니 다.본 고의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 도움 이 되 기 를 바 랍 니 다.또한 저 희 를 많이 지지 해 주시 기 바 랍 니 다!

좋은 웹페이지 즐겨찾기