首先看AndroidManifest文件admin管理员组文章数量:1567757
<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 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://www.elefans.com/dongtai/1725782095a1042310.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论