admin管理员组

文章数量:1794759

scheduleJob

scheduleJob

首先看AndroidManifest文件  <application         android:icon="@drawable/ic_launcher"         android:label="@string/app_name"         android:theme="@style/AppTheme" >         <activity             android:name=".MainActivity"             android:label="@string/app_name"             android:windowSoftInputMode="stateHidden" >             <intent-filter>                 <action android:name="android.intent.action.MAIN" />                 <category android:name="android.intent.category.LAUNCHER" />             </intent-filter>         </activity>         <service             android:name=".service.TestJobService"             android:permission="android.permission.BIND_JOB_SERVICE"             android:exported="true"/>     </application> 这个application中只包含一个Activity 和 一个service。 在Activity的onCreate函数中通过Intent 启动一个service,需要注意的是通过putExtra 携带一个Message对象给service     @Override     public void onCreate(Bundle savedInstanceState) {          // Start service and provide it a way to communicate with us.         Intent startServiceIntent = new Intent(this, TestJobService.class);         startServiceIntent.putExtra("messenger", new Messenger(mHandler));         startService(startServiceIntent);     } 在service的onStartCommand函数中行,接收Intent发送过来的message,并想Activity 发送一个MSG_SERVICE_OBJ message .   public int onStartCommand(Intent intent, int flags, int startId) {         Messenger callback = intent.getParcelableExtra("messenger");         Message m = Message.obtain();         m.what = MainActivity.MSG_SERVICE_OBJ;         m.obj = this;         try {             callback.send(m);         } catch (RemoteException e) {             Log.e(TAG, "Error passing service object back to activity.");         }         return START_NOT_STICKY;     } activity 中的handleMessage 如下:     Handler mHandler = new Handler(/* default looper */) {         @Override         public void handleMessage(Message msg) {             switch (msg.what) {                 case MSG_SERVICE_OBJ:                     mTestService = (TestJobService) msg.obj;                     mTestService.setUiCallback(MainActivity.this);             }         }     }; 又call service的的setUIcallback函数,主要是在service这边保存这个Activity     public void setUiCallback(MainActivity activity) {         mActivity = activity;     } 初始化就结束了,主要是在Activity中启动一个service,service这边保存Activity的实例. 在layout文件中,定义一个button,当用户按这个button后其回调函数是scheduleJob         <Button             android:id="@+id/schedule_button"             android:layout_width="match_parent"             android:layout_height="wrap_content"             android:layout_marginTop="20dp"             android:layout_marginLeft="40dp"             android:layout_marginRight="40dp"             android:onClick="scheduleJob"             android:text="@string/schedule_job_button_text"/> 我们看看scheduleJob的实现     public void scheduleJob(View v) {        JobInfo.Builder builder = new JobInfo.Builder(kJobId++, mServiceComponent);         mTestService.scheduleJob(builder.build());     } 主要是新建一个jobinfo,并调用service的shedulejob开始运行这个job     /** Send job to the JobScheduler. */     public void scheduleJob(JobInfo t) {         Log.d(TAG, "Scheduling job");         JobScheduler tm =                 (JobScheduler) getSystemService(Context.JOB_SCHEDULER_SERVICE);         tm.schedule(t);     } 通过得到JobScheduler ,然后通过其schedule 函数调用onStartJob开始运行这个job。     @Override     public boolean onStartJob(JobParameters params) {         // We don't do any real 'work' in this sample app. All we'll         // do is track which jobs have landed on our service, and         // update the UI accordingly.         jobParamsMap.add(params);         if (mActivity != null) {             mActivity.onReceivedStartJob(params);         }         Log.i(TAG, "on start job: " + params.getJobId());         return true;     } service的实现很简单,就是调用Activity的onReceivedStartJob     public void onReceivedStartJob(JobParameters params) {         mShowStartView.setBackgroundColor(startJobColor);         Message m = Message.obtain(mHandler, MSG_UNCOLOUR_START);         mHandler.sendMessageDelayed(m, 1000L); // uncolour in 1 second.         mParamsTextView.setText("Executing: " + params.getJobId() + " " + params.getExtras());     }  Handler mHandler = new Handler(/* default looper */) {         @Override         public void handleMessage(Message msg) {             switch (msg.what) {                 case MSG_UNCOLOUR_START:                     mShowStartView.setBackgroundColor(defaultColor);                     break;        }; 其实就是改变的背景颜色mShowStartView 其实可以在onStartJob 做任何事情,这边只是演示一下.         <Button             android:id="@+id/cancel_button"             android:layout_width="match_parent"             android:layout_height="wrap_content"             android:layout_marginLeft="40dp"             android:layout_marginRight="40dp"             android:onClick="cancelAllJobs"             android:text="@string/cancel_all_jobs_button_text"/> 如果按这个取消按键的话     public void cancelAllJobs(View v) {         JobScheduler tm =                 (JobScheduler) getSystemService(Context.JOB_SCHEDULER_SERVICE);         tm.cancelAll();     } 直接调用JobScheduler 的cancelAll方法取消所有的jobs         <Button             android:id="@+id/finished_button"             android:layout_width="match_parent"             android:layout_height="wrap_content"             android:padding="20dp"             android:layout_marginBottom="5dp"             android:onClick="finishJob"             android:text="@string/finish_job_button_text"/> 还有一个finishJob的按键,     public void finishJob(View v) {         if (!ensureTestService()) {             return;         }         mTestService.callJobFinished();         mParamsTextView.setText("");     } 调用service的callJobFinished方法     public boolean callJobFinished() {         JobParameters params = jobParamsMap.poll();         if (params == null) {             return false;         } else {             jobFinished(params, false);             return true;         }     } 主要是调用jobFinished方法,所以用户一般要override onStopJob方法     @Override     public boolean onStopJob(JobParameters params) {         // Stop tracking these job parameters, as we've 'finished' executing.         jobParamsMap.remove(params);         if (mActivity != null) {             mActivity.onReceivedStopJob();         }         Log.i(TAG, "on stop job: " + params.getJobId());         return true;     } 调用Activity的onReceivedStopJob(),设成另外一种颜色. 要是用jobshedule的话,一般要实现jobService的子类,jobService 有下面三个方法 final void jobFinished(JobParameters params, boolean needsReschedule) abstract boolean onStartJob(JobParameters params) abstract boolean onStopJob(JobParameters params) 实现jobService的子类后,新建一个Jobinfo,然后直接调用JobScheduler的schedule方法就行了,剩下的Android framework会搞定.这样做的好处就是onStartjob函数中做的事情会被放到backgroud中进行.

本文标签: scheduleJob