文档章节

认识 android-job

极光开发者服务
 极光开发者服务
发布于 06/05 20:29
字数 1103
阅读 6
收藏 0

【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>

简评: Android 实现后台任务的最佳实践。

对于现在的应用来说,在应用生命周期之外运行一些后台任务可以说已经是一项必不可少的需求了。这些任务可能是在某个时间点提醒用户什么事情或同步本地数据到服务器等等。

对此 Android 有一系列方式来实现这些后台任务:

1. JobSchedular

JobSchedular 在 Lollipop (API level 21) 中被引入,也是目前实现后台任务最有效的手段。其根据条件来执行任务,具体条件可能是「设备连接上了网络」、「正在充电」...

官方文档对此已经讲得很详细了。

2. GCM Network Manager(目前已更新为 FCM

GCM Network Manager 提供的 API 和 JobSchedular 很相似,支持 API 9 及以上。唯一的问题就在于是属于 Google Play Service SDK 的一部分,所以这里就不多说了。

3. AlarmManager

JobSchedular 和 GCM Network Manager 可以基于条件定义任务,比如网络连接状态改变、充电状态改变,这些都不属于会在某个固定时间点触发的后台任务。但有时你的应用可能需要在某个固定时间点触发一个通知、周期性的任务什么的。或者针对 API level 21 以下,又没有集成 Google Play Service SDK 的应用实现一些后台任务功能。这时就可以考虑使用 AlarmManager。

遇见 Android-Job

可以看到三个方案都有各自的优缺点,为了解决这个问题,Evernote 开源了 Android-Job 这个非常出色的项目。

Android-Job 能根据当前系统的版本,是否集成 Google Play Service SDK 和要执行的任务类型调用不同的 API,兼容当前主流版本。

集成:

apply plugin: 'com.android.application'

android {
    ...
}

dependencies {
    ...
    compile 'com.evernote:android-job:1.1.8'
}

使用:

Android-Job 主要包含了下面四个类/接口:

  1. Job:所有我们的 Job 都需要继承它,并实现 onRunJob 方法。
  2. JobRequest:用来定义一个具体的任务(Job)。
  3. JobCreator:根据任务的 tag 来创建任务。
  4. JobManager:android-job 的入口。

示例:

我们来创建一个「展示通知任务」。首先,实现 Job:

class ShowNotificationJob extends Job {

    static final String TAG = "show_notification_job_tag";

    @NonNull
    @Override
    protected Result onRunJob(Params params) {
        PendingIntent pi = PendingIntent.getActivity(getContext(), 0,
                new Intent(getContext(), MainActivity.class), 0);

        Notification notification = new NotificationCompat.Builder(getContext())
                .setContentTitle("Android Job Demo")
                .setContentText("Notification from Android Job Demo App.")
                .setAutoCancel(true)
                .setContentIntent(pi)
                .setSmallIcon(R.mipmap.ic_launcher)
                .setShowWhen(true)
                .setColor(Color.RED)
                .setLocalOnly(true)
                .build();

        NotificationManagerCompat.from(getContext())
                .notify(new Random().nextInt(), notification);

        return Result.SUCCESS;
    }

    static void schedulePeriodic() {
        new JobRequest.Builder(ShowNotificationJob.TAG)
                .setPeriodic(TimeUnit.MINUTES.toMillis(15), TimeUnit.MINUTES.toMillis(5))
                .setUpdateCurrent(true)
                .setPersisted(true)
                .build()
                .schedule();
    }
}

可以看到其中我们通过 JobRequest 来安排一个任务,任务的 tag 作为一个任务的唯一标识。

其中 JobRequest 包含了很多的方法,都在项目的 Github 页面中有详细的说明。

之后,实现 JobCreator 接口:

class DemoJobCreator implements JobCreator {

    @Override
    public Job create(String tag) {
        switch (tag) {
            case ShowNotificationJob.TAG:
                return new ShowNotificationJob();
            default:
                return null;
        }
    }
}

可以看到这里是需要根据 Job 的 tag 来创建任务的。然后,在我们应用的自定义 Application 类里注册 JobCreator :

public class MainApp extends Application {

    @Override
    public void onCreate() {
        super.onCreate();
        JobManager.create(this).addJobCreator(new DemoJobCreator());
    }
}

最后,在需要的地方注册任务:

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        ShowNotificationJob.schedulePeriodic();
    }
}

是不是很简单。不再需要自己去考虑什么情况该用哪种方案了,只需要这样统一的实现就可以啦。

顺便分享一个 debug 的小 tip。当我们在 debug 的时候,往往会把间隔时间调短从而可以马上看到效果。但是在 Android N 中,规定了定时任务间隔最少为 15 分钟,如果小于 15 分钟会得到一个错误:intervalMs is out of range

这时,可以调用 JobManager 的 setAllowSmallerIntervalsForMarshmallow(true) 方法在 debug 模式下避免这个问题。但在正式环境下一定要注意间隔时间设置为** 15 分钟以上**。

public class MainApp extends Application {

    @Override
    public void onCreate() {
        super.onCreate();
        JobManager.create(this).addJobCreator(new DemoJobCreator());
        JobManager.instance().getConfig().setAllowSmallerIntervalsForMarshmallow(true); // Don't use this in production
    }
}

原文链接:Easy Job Scheduling with Android-Job 推荐阅读:Android - Spring Animation,让应用的 View 像弹簧一样动起来

© 著作权归作者所有

极光开发者服务

极光开发者服务

粉丝 43
博文 240
码字总数 257306
作品 1
深圳
个人站长
私信 提问
【武汉/重庆/北京/上海】IT500强诚聘Android Software Engineer

联系方式:jinxiaohuat@yahoo.cn(email) jinxiaohuat@hotmail.com(msn) 薪资水平:20W-30W(具体视各城市薪资水平定) 本科以上学历,有学士学位证书,英文流利。 Job Description: Devel...

amanda
2011/07/01
586
1
上海--IC service公司--软件工程师(android)

以下职位来自一家IC service公司,有外商service公司技术和资金入股,职位要求有熟悉cortex A8/A9或者有android开发经验,薪资具体面议,预计薪资12W-25W。有兴趣请联系,邮箱:software2@k...

chrisz
2011/06/10
868
0
Android 3即将发布 Google下周举办发布会

本周早些时候Google发布了Android 3.0蜂巢系统的预览版SDK软件开发工具包,让大家对这款新系统有一个初步的认识。为了让更多人对Android 3有更进一步的认识,Google计划在2月2日举办一次发布...

米狗族
2011/01/30
736
0
Android笔记五-intent

intent最主要的特点是它是一个用户概念。像所有其它ANDROID概念一样,不能从系统的角度去理解它。应该从用户的角度去理解它。意思是,当我们要解释某一个东西的时候,不是说,这个在系统中的...

刘小兵2014
2012/10/27
168
0
Manpower代招-Android-framework、kernel层高级开发@北京

该公司是一财富500强IT公司,kernel、framework层开发工作地点在北京上地。 以上职位均为正式职位,与公司直接签合同,非外派性质。 联系人:J0nas 联系方式:010-85②542⑦7 简历投递邮箱:...

Jonas-Manpower
2011/12/21
460
1

没有更多内容

加载失败,请刷新页面

加载更多

类比思想歪解Java线程

在操作系统的概念里,有内核态,用户态。其实,操作系统的最小执行单位是进程,而进程是分类型的,有两种类型,内核进程,用户进程。 内核进程由操作系统启动时创建,用户进程是由用户程序启...

萧默
49分钟前
2
0
Git推送错误“ [[远程拒绝]主机->主机(分支当前已签出)”)

昨天,我发布了一个有关如何将Git存储库从我的一台计算机克隆到另一台计算机的问题 , 如何从另一台计算机“ git clone”? 。 现在,我可以成功地将Git存储库从源(192.168.1.2)克隆到目标...

javail
59分钟前
4
0
Selenium 4.0 Alpha更新日志

早在2018年8月,整个测试自动化社区就发生了一件重大新闻:Selenium的创始成员Simon Stewart在班加罗尔Selenium会议上正式确认了Selenium 4的发布日期和一些重要更新。 Selenium 4.0 Alpha版...

八音弦
今天
7
0
2、编写程序求Sn=a+aa+aaa+…+aa…aa的值,其中a是1—9之间的一位数字,n表示 a的位数

//编写程序求Sn=a+aa+aaa+…+aa…aa的值,其中a是1-9之间的一位数字, //n表示 a的位数 #include<stdio.h> int main() { int a,n,i,Sn=0,Z=0; printf("please intput a:\n"); scanf("%d",&a......

201905021729吴建森
今天
5
0
Git中的HEAD是什么?

您会看到Git文档说出类似 分支必须在HEAD中完全合并。 但是到底什么是Git HEAD ? #1楼 了解正确答案的一种好方法是运行git reflog HEAD ,您可以获得HEAD所指向的所有位置的历史记录。 #2楼...

技术盛宴
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部