Android4.2のロック画面Widgetと自動更新系の話
AndroidのWidgetの話
私、Nexus7持ってるんですが(ドヤァ)、最近JB4.2に更新しました。新しい機能としてまあいろいろあるんですが、その内の一つに「LockScreen Widget」ってのがあります。要するにロック画面上にWidgetを表示するやつです。
で、これがなんというか、ダサいんですよ。sleepから復帰した時に両サイドにWidgetのフレームが一瞬表示されたり、そもそも時計Widgetのフォントが格好悪い。マジでこれですかぁ?って感じなんですよね。
で、これが嫌でとりあえず今まで避けてきた…いや手をつけてこなかったWidgetに手を出してみようかと、そういう話です。
AppWidgetの基本形
今回はとりあえずお試しで、時刻をTextViewに表示させるだけのWidgetを作ってみます。このへんの話はいろいろググれば出てくるんですが、一番簡単なのはAppWidgetProviderを継承したクラスで完結させちゃうのが一番簡単なんですかね。
とりあえずソースは以下を参照してください。
https://github.com/misty-rc/RonnClockRepeat
ポイント
初期設定
まずAndroidManifest.xmlにreceiverの設定が必要になります
ここにintent-filterとしてandroid.appwidget.action.APPWIDGET_UPDATEを設定してやることで、receiverはWidget更新をintentから認識することができます。meta-dataタグには基本設定を記述したxmlをしてします。
ここで重要なのが、新しく導入されたLockScreenでWidgetを使うためにはandroid:widgetCategory属性に"keyguard"という値を設定する必要があります。keyguardとは要するにロック画面のことですね。またkeyguardを指定した場合、ホーム画面用のレイアウトとは別にkeyguard用のレイアウト指定が必要になります。それがandroid:initialKeyguardLayout属性です。
ぶっちゃけて言ってしまうと、普通のWidgetを作ってappwidget-providerに上記属性を加えてやればロック画面上で使えるようになる…はずです。
コード的な
Widgetを作る場合に利用するAppWidgetProviderを継承したクラスでonUpdateをoverrideし、まずここで必要なことを済ませてしまいます。
まずintentを作成し、そこに更新用のオレオレアクションをセットします。次にgetBroadcastでPendingIntentを用意し、それをAlarmManagerに登録するします。getBroadcastで返されたPendingIntentがAlarmManagerによって一定時間ごとにbroadcastし、それをonReceiveで受けるという感じになります。
今回はAlarmManager.setRepeatingを使ってます。これはintervalの時間毎に処理を繰り返す関数ですが、AlarmManager.setを使い、一定Intervalを自前で用意する方法もあります。ググってよく見かけるのはこの方法ですね。
この場合、まずonUpdateで初期表示を行った後で、一定時間後にbroadcastするようにAlarmManagerにsetします。AlarmManager.setは1回こっきりなので、onReceiveしたタイミングで再度setしてやる必要があります。サンプルは適当に探してください(ぇ