资讯专栏INFORMATION COLUMN

认识 android-job

骞讳护 / 1449人阅读

摘要:对此有一系列方式来实现这些后台任务在中被引入,也是目前实现后台任务最有效的手段。目前已更新为提供的和很相似,支持及以上。但在正式环境下一定要注意间隔时间设置为分钟以上。

简评: 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 主要包含了下面四个类/接口:

Job:所有我们的 Job 都需要继承它,并实现 onRunJob 方法。

JobRequest:用来定义一个具体的任务(Job)。

JobCreator:根据任务的 tag 来创建任务。

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 像弹簧一样动起来

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/74830.html

相关文章

  • 【算法】字节跳动编程题-认识的人

    摘要:题目描述团队在月日搬入了学清嘉创大厦,为庆祝团队的乔迁之喜,字节君决定邀请整个团队,举办一个大型团建游戏字节跳动大闯关。这个人每个人都向字节君提供了自己认识的人的名字,不包括自己。其他所有人均刻意直接或间接的认识,分在同一组。 题目描述 Bytedance Efficiency Engineering团队在8月20日搬入了学清嘉创大厦,为庆祝团队的乔迁之喜,字节君决定邀请整个EE团队,...

    zr_hebo 评论0 收藏0
  • 重新认识定时器

    摘要:重新认识三如果被推迟执行的回调函数是某个对象的方法,那么该方法中的关键字将指向全局环境,而不是定义时所在的那个对象。 重新认识一 一般,setTimeout函数接受两个参数,第一个参数func|code是将要推迟执行的函数名或者一段代码(引擎内部使用eval函数,将字符串转为代码),第二个参数delay是推迟执行的毫秒数。但是,setTimeout 还可以添加更多参数。第二个之后的参数...

    paney129 评论0 收藏0
  • 看了跟不看没区别的文章—摒弃e || window.event旧认识

    摘要:前言今天,为表达我对前端的热爱,特此发了一篇小总结。其实这是一种很笼统的说法,因为绑定监听事件的方式不同,可能情况不一样。但是不论怎样,这么写准没错。监听的绑定方式为了方便描述现象。火狐一般会自动更新为最新版的,所以前的顾虑基本上没有了。前言 今天520,为表达我对前端的热爱,特此发了一篇小总结。实际上你看不看这文章,对你目前来讲,其实也没多大影响,这是我的真心话哈哈 刚学前端的时候,有很多...

    Miyang 评论0 收藏0
  • 好文章必读 - 收藏集 - 掘金

    摘要:方法即为收集器,它接收高阶函数和的后端掘金年的第一天,我坐在独墅湖边,写下这篇文章。正因如此,所以最全系列教程后端掘金是从版本开始引入的一个新的,可以替代标准的。 设计模式之单例模式 - 掘金前言 作为一个好学习的程序开发者,应该会去学习优秀的开源框架,当然学习的过程中不免会去阅读源码,这也是一个优秀程序员的必备素养,在学习的过程中很多人会遇到的障碍,那就是设计模式。很多优秀的框架会运...

    FrozenMap 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<