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相关推荐
- JAVA动态任务SCHEDULEJOB
一.ScheduleJob实体类介绍 public class ScheduleJob implements Serializable { public static String STATUS_RU ...
- SpringBoot中实现quartz定时任务
Quartz整合到SpringBoot(持久化到数据库) 背景 最近完成了一个小的后台管理系统的权限部分,想着要扩充点东西,并且刚好就完成了一个自动疫情填报系统,但是使用的定时任务是静态的,非常不利于 ...
- Java基于Quartz的定时任务调度服务(一)
Quartz的基本用法 一 Quartz的简单介绍 Quartz 是 OpenSymphony 开源组织在任务调度领域的一个开源项目,完全基于 Java 实现,一个优秀的开源调度框架,其特点是:强大的 ...
- nodejs 各种插件
__dirname:全局变量,存储的是文件所在的文件目录 __filename:全局变量,存储的是文件名 代码:dirname.jsconsole.log(__dirname); 运行node dir ...
- Windows API函数大全
1. API之网络函数 WNetAddConnection 创建同一个网络资源的永久性连接 WNetAddConnection2 创建同一个网络资源的连接 WNetAddConnection3 创建同 ...
- 【Quartz】实现接口封装化(二)
原文:[Quartz]实现接口封装化(二) 前言 通过昨天的努力终于算是了解Quartz这个定时器的简单使用,为了更深一步的了解和基于以后希望在项目中能使用他.所有我对他做了一下简单的封装操作 ...
- 将Quartz.NET集成到 Castle中
Castle是针对.NET平台的一个开源项目,从数据访问框架ORM到IOC容器,再到WEB层的MVC框架.AOP,基本包括了整个开发过程中的所有东西,为我们快速的构建企业级的应用程序提供了很好的服务. ...
- 初识Quartz(三)
为什么80%的码农都做不了架构师?>>> 简单作业: package quartz_project.example3;import java.util.Date;import ...
- java timer cron_Java之旅--定时任务(Timer、Quartz、Spring、LinuxCron)
在Java中,实现定时任务有多种方式.本文介绍4种.Timer和TimerTask.Spring.QuartZ.Linux Cron. 以上4种实现定时任务的方式.Timer是最简单的.不须要不论什么 ...
最新文章
- mybatis的资源过滤错误及xml文件编码错误
- 如何正确连接数据库???
- c语言编程取模运算ppt,c语言的取模运算
- virtaulbox视图模式常用切换
- Break,Continue,Return 傻傻分不清楚
- day01 js三种导入html的方法、js书写规范、变量的基本使用、变量提升
- php 统计目录大小,PHP 统计目录大小
- 如何查看服务器gpu性能,ubuntu服务器查看GPU和CPU实时使用情况
- wetech-cms内容管理系统源码
- spring之ControllerAdvice注解
- ApiException
- mysql xtrabackup-v2_MySQL物理备份基础知识(基于xtrabackup2.4版本)
- Linux如何配置DNS服务器
- Diy-Scratch(4) 大家来找茬
- matlab中zeta函数,黎曼zeta函数是什么,具体点
- mysql和JDBC学习
- 国家自然科学基金“十四五”优先发展领域!
- 浅析linux下的回收站以及U盘中的.Trash文件夹
- ¥符号在安卓上显示只有一个横杠的问题
- 设计模式学习(八) 模板方法模式