techium

このブログは何かに追われないと頑張れない人たちが週一更新をノルマに技術情報を発信するブログです。もし何か調査して欲しい内容がありましたら、@kobashinG or @muchiki0226 までいただけますと気が向いたら調査するかもしれません。

GcmNetworkManager使って21未満でもJobSchedulerっぽいことする

Motivation

存在はよくJobSchedulerの説明と一緒に現れるので知ってたけど、後回しにしてしまってたので。
JobSchedulerの使い方の記事と一緒にどうぞ。

techium.hatenablog.com

GcmNetworkManagerは21まではplay-servicesを使ってJobSchedulerのバックポートを、 21以上ではframeworkのJobSchedulerを使うように振る舞う。
つまり、これだけ押さえておけば問題無しぽい。

プロジェクトの設定

PlayServicesを利用することになるので、そのためのモジュールを読み込む。

app/build.gradleのdependenciesに以下を追記

 compile 'com.google.android.gms:play-services-gcm:9.0.0'

タスクを実装する

JobSchedulerの場合は、JobServiceを継承したサービスがジョブだったが、 GcmNetworkManagerを利用する場合はGcmTaskServiceを継承したサービスを用意する。 onRunTask()がタスク処理として呼び出されるところになる。
JobServiceと異なり、この部分は非MainThreadで呼び出される。 また、WakeLockを取得した状態で呼び出されるが、3分でタイムアウトするので処理はそれ以内に納めるのがよさそう。

また、play-servicesから呼び出す際に利用するIntent-FilterをManifestに追記しておく

タスクを登録する

タスクは、GcmNetworkManager.schedule()を利用して登録する。 GcmNetworkManagerのインスタンスは下記で生成する。

タスクとして指定できる項目も、ほぼJobSchedulerと変わらない。 大きく異なるのは、一度限りのタスクかインターバルを持って実行するタスクかでBuilderが異なる点。 それぞれの生成方法を以下に分けてコメント厚めに実装したので、参考にどうぞ。

一度限りのタスク(One-Off)

インターバル持ちのタスク(Periodic)

Sample Code

おいときます。参考にどうぞ。

GitHub - ShinjiKobayashi/GcmNetworkServiceSample