このページを正しく表示するにはJavascriptを有効にしてください。
Androidで毎日定時に実行するプログラムを作る
毎朝4:00にアプリ起動的な事をやりたかったのでメモ。
目覚ましとかよく使われそうな処理なので簡単に扱えると
思ったのですが、割と面倒くさかったです。
やり方としてはAlermManagerというものを利用します。
こいつに「今から起動スタートまでの時間」「起動後の実行間隔」「何を起動するか」
といった情報を与えてあげると自動起動してくれるようになります。
つまり定時に実行しようとしたら、
「今から定時までの時間」「1日間隔」「起動するサービス名」
を渡してあげればよいことになります。
一つ一つ見て行きましょう。
まずは「今から起動スタートまでの時間」。
「今から定時までの時間」は自分で計算する必要があります。
これがちょっと面倒です。
カレンダーインスタンスに時刻を渡してあげればそのUNIXタイムが取れます。
問題はその時刻は今日のものであるという事です。
もしその時間を過ぎていると過去の時刻を指定している事になり、
ALertManagerによって即座に実行されてしまいます。
目覚ましがセットした瞬間なったら困りますよね。
なので、今の時刻を取得して、それより前か後で条件分岐する必要があります。
今より前だったら明日のその時刻を取得します。
つぎに「起動後の実行間隔」。
これは AlarmManager.INTERVAL_DAY という定数が定義されているのでそのまま使えばOKです。
他にも30分とか1時間とかの起動も出来ます。
最後に「何を起動するか」です。
これにはPendingIntentというものを使います。
後で起動する的な用途に使うためのインテント拡張みたいです。
今回はIntentServiceで作ったサービスを立ち上げることにしました。
Activity起動とかも出来そうです。
で、これらをまとめてみると以下の様なソースになります。
定時実行の部分だけをまとめたクラスです。
サービス限定と決め打ちな部分もありますが、
コピペして書き換えればいろいろ使えるようになってます。
使い方としては
IntentServiceやServiceを作ってあげて、(HogeService)
DailyScheduler scheduler = new DailyScheduler(getApplicationContext());
scheduler.setByTime(HogeService.class, 4, 0, -1);
みたいにすれば毎日4時にhogeServiceが立ち上がるようになります。
なお、電源を消したりするとAlertManagerがリセットされてしまうようなので、
アプリケーションでこまめに再登録したり、電源起動を検知して登録したり
なんかをする必要があります。
アプリ起動時に都度登録してあげれば、アプリ使っている限りちゃんと動くのでいいかもしれません。