このチュートリアルに基づいて、独自のウィジェットの修正版を作成しました。問題は、AlarmManager.setRepeating が間隔を置いてインテントを起動していないことです。レシーバーがそのインテントを受け取っていないように思えます。
より正確に言うと、私は
- AppWidgetProvider を拡張する WidgetActivity
- IntentService を拡張する WidgetUpdate
- BroadcastReceiver を拡張する WidgetAlarmReceiver
WidgetActivity は、ウィジェットがアクティブな画面にあるときに、一定間隔 (30 秒) で BroadcastReceiver と通信する必要がある AlarmManager を持つ WidgetUpdate クラスを正しく起動します。
WidgetUpdate.class
public class WidgetUpdate extends IntentService{
public WidgetUpdate() {
super(null);
}
public static int UPDATE_FREQUENCY_SEC = 30;
@Override
public void onCreate() {
super.onCreate();
AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
PendingIntent alarmIntent = alarmIntent();
long timeToRefresh = SystemClock.elapsedRealtime() + UPDATE_FREQUENCY_SEC * 1000;
alarmManager.setRepeating(AlarmManager.ELAPSED_REALTIME,
timeToRefresh,
UPDATE_FREQUENCY_SEC * 1000,
alarmIntent);
}
private PendingIntent alarmIntent() {
Intent intentToFire = new Intent(WidgetAlarmReceiver.ACTION_REFRESH_ALARM);
PendingIntent alarmIntent = PendingIntent.getBroadcast(this, 0, intentToFire, 0);
return alarmIntent;
}
@Override
protected void onHandleIntent(Intent intent) {
PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
if (!pm.isScreenOn()) {
cancel();
}
else {
WidgetActivity widget = new WidgetActivity();
widget.updateWidget(getBaseContext());
}
}
WidgetAlarmReceiver.class
public class WidgetAlarmReceiver extends BroadcastReceiver{
public static final String ACTION_REFRESH_ALARM =
"WidgetAlarmReceiver.ACTION_REFRESH_ALARM";
@Override
public void onReceive(Context context, Intent intent) {
WidgetActivity.startWidgetUpdateService(context);
}
}
BroadcastReceiver はその更新サービスを開始しません。その理由はわかりません。
編集:マニフェストで:
<receiver android:name="WidgetAlarmReceiver">
<intent-filter>
<action android:name="WidgetAlarmReceiver.ACTION_REFRESH_ALARM" />
</intent-filter>
</receiver>