1 jobschedulerのアクセスを実現
JobScheduler tm = (JobScheduler) getSystemService(Context.JOB_SCHEDULER_SERVICE);
二つの側面:
- システムは、サービスを開始すると
- そこJobSchedulerServiceクラスかどうかを確認するには
結果:JobSchedulerServiceのが存在
JobSchedulerService extends com.android.server.SystemService implements StateChangedListener, JobCompletedListener
2 AIDL
jobschedulerの追跡できない抽象クラスであり、
それはgetSystemServiceによって得られるので、それらのサービスおよびシステム・サービスが通信する必要がある、それはクロスプロセスのアクセス、プロセス間通信(IPC、バインダー、AIDL)に関連するべきである
JobScheduleServiceにも対応を見つけます。クラス:JobSchedulerStubはIJobScheduler.Stubを拡張
3スケジュール方法
JobScheduler.schedule - > IJobScheduler.Stub.schedule
4上にベリファイ
そして、任意のjobschedulerの実装クラスの独自の実装を探して(最終的にJobSchedulerImplがjobschedulerのを拡張しました)
public class JobSchedulerImpl extends JobScheduler {
IJobScheduler mBinder;
/* package */ JobSchedulerImpl(IJobScheduler binder) {
mBinder = binder;
}
@Override
public int schedule(JobInfo job) {
try {
return mBinder.schedule(job);
} catch (RemoteException e) {
return JobScheduler.RESULT_FAILURE;
}
}
@Override
public int enqueue(JobInfo job, JobWorkItem work) {
try {
return mBinder.enqueue(job, work);
} catch (RemoteException e) {
return JobScheduler.RESULT_FAILURE;
}
}
@Override
public int scheduleAsPackage(JobInfo job, String packageName, int userId, String tag) {
try {
return mBinder.scheduleAsPackage(job, packageName, userId, tag);
} catch (RemoteException e) {
return JobScheduler.RESULT_FAILURE;
}
}
@Override
public void cancel(int jobId) {
try {
mBinder.cancel(jobId);
} catch (RemoteException e) {}
}
@Override
public void cancelAll() {
try {
mBinder.cancelAll();
} catch (RemoteException e) {}
}
@Override
public List<JobInfo> getAllPendingJobs() {
try {
return mBinder.getAllPendingJobs().getList();
} catch (RemoteException e) {
return null;
}
}
@Override
public JobInfo getPendingJob(int jobId) {
try {
return mBinder.getPendingJob(jobId);
} catch (RemoteException e) {
return null;
}
}
@Override
public List<JobInfo> getStartedJobs() {
try {
return mBinder.getStartedJobs();
} catch (RemoteException e) {
return null;
}
}
@Override
public List<JobSnapshot> getAllJobSnapshots() {
try {
return mBinder.getAllJobSnapshots().getList();
} catch (RemoteException e) {
return null;
}
}
}
5 IJobScheduler.Stub.schedule
- > JobSchedulerService.this.scheduleAsPackage
- > startTrackingJobLocked
private void startTrackingJobLocked(JobStatus jobStatus, JobStatus lastJob) {
jobStatus.enqueueTime = sElapsedRealtimeClock.millis();
final boolean update = mJobs.add(jobStatus);
//mJob是一个队列,先进先出
if (mReadyToRock) {
for (int i = 0; i < mControllers.size(); i++) {
StateController controller = mControllers.get(i);
if (update) {
//把之前存在的同样工作移除,重新开启
controller.maybeStopTrackingJobLocked(jobStatus, null, true);
}
controller.maybeStartTrackingJobLocked(jobStatus, lastJob);
}
}
}
プログラムエントリ6
受精卵プロセス-システムプロセスは、開始SystemServer -オープンシステムは、次のような重要なサービスの範囲を処理:AMS / PMS / WMB / JobSchedulerService
メインエントリを
public static void main(String[] args) {
new SystemServer().run();
}
RUN:startOtherServices()
- > startOtherServices:mSystemServiceManager.startService(JobSchedulerService.class);
- > SystemServiceManager.startService:STARTSERVICE( -サービス)//取得JobSchedulerServiceコンストラクタ反射、所与の例による;
- > service.onStart();
7ジョブスケジューラサービス
1)JobSchedulerServiceコンストラクタ
public JobSchedulerService(Context context) {
super(context);
mLocalPM = LocalServices.getService(PackageManagerInternal.class);
mActivityManagerInternal = Preconditions.checkNotNull(
LocalServices.getService(ActivityManagerInternal.class));
mHandler = new JobHandler(context.getMainLooper());
mConstants = new Constants();
mConstantsObserver = new ConstantsObserver(mHandler);
mJobSchedulerStub = new JobSchedulerStub();
mConcurrencyManager = new JobConcurrencyManager(this);
// Set up the app standby bucketing tracker
mStandbyTracker = new StandbyTracker();
mUsageStats = LocalServices.getService(UsageStatsManagerInternal.class);
mUsageStats.addAppIdleStateChangeListener(mStandbyTracker);
// The job store needs to call back
publishLocalService(JobSchedulerInternal.class, new LocalService());
// Initialize the job store and set up any persisted jobs
mJobs = JobStore.initAndGet(this);
// Create the controllers.
mControllers = new ArrayList<StateController>();
mControllers.add(new ConnectivityController(this));
mControllers.add(new TimeController(this));
mControllers.add(new IdleController(this));
mBatteryController = new BatteryController(this);
mControllers.add(mBatteryController);
mStorageController = new StorageController(this);
mControllers.add(mStorageController);
mControllers.add(new BackgroundJobsController(this));
mControllers.add(new ContentObserverController(this));
mDeviceIdleJobsController = new DeviceIdleJobsController(this);
mControllers.add(mDeviceIdleJobsController);
mControllers.add(new QuotaController(this));
// If the job store determined that it can't yet reschedule persisted jobs,
// we need to start watching the clock.
if (!mJobs.jobTimesInflatedValid()) {
Slog.w(TAG, "!!! RTC not yet good; tracking time updates for job scheduling");
context.registerReceiver(mTimeSetReceiver, new IntentFilter(Intent.ACTION_TIME_CHANGED));
}
}
- > JobHandler検査タスク
case MSG_CHECK_JOB:
maybeQueueReadyJobsForExecutionLocked();//看情况执行任务
case MSG_JOB_EXPIRED任务到期了
// runNow can be null, which is a controller's way of indicating that its
// state is such that all ready jobs should be run immediately.
- >コンストラクタに戻っ:
JobStore.initAndGetは永久的なミッション/data/system/job/jobs.xmlのいくつかを読んで
- > StateController
maybeStartTrackingJobLocked
maybeStopTrackingJobLocked
2)JobSchedulerService.onStart方法
publishBinderService(Context.JOB_SCHEDULER_SERVICE, mJobSchedulerStub);
9 ConnectivityController Aケーススタディ
ConnectivityControllerはStateController実装拡張
ConnectivityManager.OnNetworkActiveListenerを
public void maybeStartTrackingJobLocked(JobStatus jobStatus, JobStatus lastJob) {
if (jobStatus.hasConnectivityConstraint()) {
updateConstraintsSatisfied(jobStatus);
ArraySet<JobStatus> jobs = mTrackedJobs.get(jobStatus.getSourceUid());
if (jobs == null) {
jobs = new ArraySet<>();
mTrackedJobs.put(jobStatus.getSourceUid(), jobs);
}
jobs.add(jobStatus);
jobStatus.setTrackingController(JobStatus.TRACKING_CONNECTIVITY);
}
}
- > mTrackedJobs.put(jobStatus.getSourceUid()、ジョブ);リスナーを追加
- > mStateChangedListener.onControllerStateChanged
- > StateController.mStateChangedListener:
- > JobSchedulerService構成mControllers.add(新しい新しい接続コントローラー(本));
- >接続コントローラー:スーパー( -サービス);
- > StateController(JobSchedulerService-サービス):= mStateChangedListener-サービス;従って、 mStateChangedListenerはJobSchedulerServiceがある
(JobSchedulerServiceがStateChangedListener実現)
と呼ばれることonControllerStateChanged:mHandler.obtainMessage(MSG_CHECK_JOB).sendToTarget()> JobSchedulerService - 。