ELAPSED_REALTIMEアプローチはうまくいくと思いますが、私が作成した小さなテストアプリ用ではありません。基本的に、テストアプリはウィジェットとIntentServiceです。ウィジェットは現在の時刻のみを表示しますが、インテントサービスは現在の時刻を取得し、ウィジェットがonReceive()メソッドで消費して自身を更新するブロードキャストを送信します。ウィジェットはもちろん、カスタムブロードキャストアクションの登録済みレシーバーです。ウィジェットのonEnabled()メソッドで、AlarmManagerのアラームを初期化します。今いくつかのコード:
ウィジェットonEnabled():
@Override
public void onEnabled(Context c) {
super.onEnabled(c);
Intent intent = new Intent(c.getApplicationContext(), SimpleIntentService.class);
PendingIntent intentExecuted = PendingIntent.getService(c.getApplicationContext(), 45451894, intent,
PendingIntent.FLAG_UPDATE_CURRENT);
AlarmManager alarmManager = (AlarmManager) c.getApplicationContext().getSystemService(Context.ALARM_SERVICE);
alarmManager.setInexactRepeating(AlarmManager.ELAPSED_REALTIME, 0, 3000, intentExecuted);
}
ウィジェットonReceive():
@Override
public void onReceive(Context context, Intent intent) {
super.onReceive(context, intent);
if (intent.getAction().equals(ACTION_RESP)) {
AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
ComponentName thisWidget = new ComponentName(context.getApplicationContext(), Widget.class);
int[] allWidgetIds = appWidgetManager.getAppWidgetIds(thisWidget);
for (int appWidgetId : allWidgetIds) {
RemoteViews remoteViews = new RemoteViews(context.getApplicationContext().getPackageName(), R.layout.widget);
String s = "";
if (intent.hasExtra("msg")) s = intent.getStringExtra("msg");
// Set the text
remoteViews.setTextViewText(R.id.textView1, s);
appWidgetManager.updateAppWidget(allWidgetIds, remoteViews);
}
}
}
SimpleIntentService onHandleIntent():
@Override
protected void onHandleIntent(Intent intent) {
Log.w("TestService", "SimpleIntentService onHandleIntent called.");
String msg = new Date().toGMTString();
Intent broadcastIntent = new Intent();
broadcastIntent.setAction(Widget.ACTION_RESP);
broadcastIntent.addCategory(Intent.CATEGORY_DEFAULT);
broadcastIntent.putExtra("msg", msg);
sendBroadcast(broadcastIntent);
}
そこで、Android4.2.1を実行しているNexus4とAndroid4.0.4を搭載したエミュレーターでこれをテストしました。どちらの場合も、手動で表示をオフにしても、SimpleIntentServiceが作成され、onHandleIntent()が3秒ごとに呼び出されます。なぜAlarmManagerがまだアラームをスケジュールしているのか、まったくわかりません。
ありがとうございました!