admin管理员组文章数量:1794759
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
版权声明:本文标题:scheduleJob 内容由林淑君副主任自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.xiehuijuan.com/baike/1686479659a72171.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论