GcmNetworkManager使って21未満でもJobSchedulerっぽいことする
Motivation
存在はよくJobSchedulerの説明と一緒に現れるので知ってたけど、後回しにしてしまってたので。
JobSchedulerの使い方の記事と一緒にどうぞ。
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
おいときます。参考にどうぞ。