首先看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相关推荐

  1. JAVA动态任务SCHEDULEJOB

    一.ScheduleJob实体类介绍 public class ScheduleJob implements Serializable { public static String STATUS_RU ...

  2. SpringBoot中实现quartz定时任务

    Quartz整合到SpringBoot(持久化到数据库) 背景 最近完成了一个小的后台管理系统的权限部分,想着要扩充点东西,并且刚好就完成了一个自动疫情填报系统,但是使用的定时任务是静态的,非常不利于 ...

  3. Java基于Quartz的定时任务调度服务(一)

    Quartz的基本用法 一 Quartz的简单介绍 Quartz 是 OpenSymphony 开源组织在任务调度领域的一个开源项目,完全基于 Java 实现,一个优秀的开源调度框架,其特点是:强大的 ...

  4. nodejs 各种插件

    __dirname:全局变量,存储的是文件所在的文件目录 __filename:全局变量,存储的是文件名 代码:dirname.jsconsole.log(__dirname); 运行node dir ...

  5. Windows API函数大全

    1. API之网络函数 WNetAddConnection 创建同一个网络资源的永久性连接 WNetAddConnection2 创建同一个网络资源的连接 WNetAddConnection3 创建同 ...

  6. 【Quartz】实现接口封装化(二)

    原文:[Quartz]实现接口封装化(二)   前言   通过昨天的努力终于算是了解Quartz这个定时器的简单使用,为了更深一步的了解和基于以后希望在项目中能使用他.所有我对他做了一下简单的封装操作 ...

  7. 将Quartz.NET集成到 Castle中

    Castle是针对.NET平台的一个开源项目,从数据访问框架ORM到IOC容器,再到WEB层的MVC框架.AOP,基本包括了整个开发过程中的所有东西,为我们快速的构建企业级的应用程序提供了很好的服务. ...

  8. 初识Quartz(三)

    为什么80%的码农都做不了架构师?>>>    简单作业: package quartz_project.example3;import java.util.Date;import ...

  9. java timer cron_Java之旅--定时任务(Timer、Quartz、Spring、LinuxCron)

    在Java中,实现定时任务有多种方式.本文介绍4种.Timer和TimerTask.Spring.QuartZ.Linux Cron. 以上4种实现定时任务的方式.Timer是最简单的.不须要不论什么 ...

最新文章

  1. mybatis的资源过滤错误及xml文件编码错误
  2. 如何正确连接数据库???
  3. c语言编程取模运算ppt,c语言的取模运算
  4. virtaulbox视图模式常用切换
  5. Break,Continue,Return 傻傻分不清楚
  6. day01 js三种导入html的方法、js书写规范、变量的基本使用、变量提升
  7. php 统计目录大小,PHP 统计目录大小
  8. 如何查看服务器gpu性能,ubuntu服务器查看GPU和CPU实时使用情况
  9. wetech-cms内容管理系统源码
  10. spring之ControllerAdvice注解
  11. ApiException
  12. mysql xtrabackup-v2_MySQL物理备份基础知识(基于xtrabackup2.4版本)
  13. Linux如何配置DNS服务器
  14. Diy-Scratch(4) 大家来找茬
  15. matlab中zeta函数,黎曼zeta函数是什么,具体点
  16. mysql和JDBC学习
  17. 国家自然科学基金“十四五”优先发展领域!
  18. 浅析linux下的回收站以及U盘中的.Trash文件夹
  19. ¥符号在安卓上显示只有一个横杠的问题
  20. 设计模式学习(八) 模板方法模式

热门文章

  1. seo网站整体关键词的布局
  2. 智能守卫媒体库 | 爱莫携手解放军报研发目标人物检索系统
  3. 不知道标题了,一个关于人生的小故事
  4. 机器人科普--AGILOX 叉车
  5. 【克罗地亚】LAGNO
  6. EAUML日拱一卒--类图::对象图(object diagram)
  7. 有关并发和并行的问题解析
  8. linux基础命令整理
  9. 用计算机写数字很,大写一到十怎么写 数字一到十的大写怎么写(开票用的大写)...
  10. c语言程序断点怎么打,C#中如何使用断点操作调试程序