気が向いたらなんか書く

そんな感じです

Android4.2のロック画面Widgetと自動更新系の話

AndroidWidgetの話

私、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してやる必要があります。サンプルは適当に探してください(ぇ