Android Dev Guide に記載されているように、ウィジェットをより頻繁に更新する場合は、 を使用しAlarmManager
て、デバイスを復帰させないアラームを設定する必要があります。
原則として、クラスによって提供される標準メカニズムAppWidgetProvider
と、xml ファイルの android:updatePeriodMillis を使用した簡単なセットアップを使用しないでください。
申し訳ありませんが、ガイドには「AlarmManager を使用する、RTC
またはELAPSED_REALTIME
... を使用する」と記載されていますが、ウィジェットを更新するだけのインテントを正確に送信するにはどうすればよいですか?
PendingIntent
デフォルトの動作を模倣するために必要なコードを誰か教えてください。ウィジェット ID を取得する方法や、どのアクションを使用すればよいかなどの手がかりがありません...悲しいことに、開発者ガイドはその時点で説明を停止します! どのアクションのエキストラとして何が必要ですか?
なぜ私が 30 分よりも頻繁に更新したいのか興味がある人のために: 私のウィジェットは次のバスがいつ駅を出発するかを示します。バスは 20 分おきに運行されているので、次のバスの出発時刻を表示するウィジェットを 1 分ごとに更新する (これが私が望んでいることです!!) か、次のバスの出発時刻を表示するかの 2 つのオプションがありました。少なくとも20分ごとに更新する必要があります!
さて、もちろん、デバイスがスリープ状態のときは、これでスリープ状態から復帰することはありません。したがって、開発者ガイドのこのセクションに関する私の理解では、これが正しい実装方法であるということです。誰かが私が間違っていると思いますか?ああ、もう 1 つ確認したいことがあります。ウィジェットを更新する必要があるときにデバイスがスリープ状態で、デバイスがスリープ状態になっているためにアラームが発行されない場合、デバイスが起動するとすぐに更新されますか?
ご協力いただきありがとうございます!!
PS: ウィジェット プロバイダーの xml 定義では、ブール スイッチによって単純に「デバイスを起動しない」ことを許可しないのはなぜなのか、本当に疑問に思っています。とにかくデバイスを起動するには、どのような種類のウィジェットが必要ですか??? ;-)
これは私が今までやってきたところですが、うまくいきません - 何も起こりません:
private void startAlarm(Context pContext) {
Log.d(TAG, "startAlarm");
AlarmManager am = (AlarmManager) pContext.getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent("android.appwidget.action.APPWIDGET_UPDATE");
intent.setClass(pContext, getClass());
PendingIntent pi = PendingIntent.getBroadcast(pContext, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT);
am.set(AlarmManager.ELAPSED_REALTIME, SystemClock.elapsedRealtime() + 1000, pi);
}