7

Alarm Managerでウィジェットを更新するために を使用していますService。2 つの異なる質問があります。

最初の質問: アラーム マネージャーの意図でサービスを呼び出しています。このような:

alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
Intent i = new Intent(context, MyService.class);
pi = PendingIntent.getService(context, 0, i, PendingIntent.FLAG_UPDATE_CURRENT);

context.startService(new Intent(context, MyService.class));

Long repeat = Long.parseLong(prefs.getString("update_preference", "600"));
alarmManager.setInexactRepeating(AlarmManager.RTC_WAKEUP, Calendar.getInstance().getTimeInMillis(), 1000*repeat, pi);

違いますか?

それは正しく見え、正しく機能します。しかし、稼働中のサービスを見てみると、自分のサービス名がリストに表示されません。おそらく、単一/個別のサービスとして実行されていません。アプリケーション名を見ただけです(サービスとしてではありません)。分離する方法がわかりませんか、それとも問題ですか?

別の質問: 長い間、ウィジェットの更新を制御する実行中のアプリケーションが何らかの理由で (手動またはタスク キラーによって)閉じられています。もちろんAlarm Manager停止しますし、ウィジェットの機能も停止します。たとえば、ボタンのクリック。

しかし、Twitterはこの問題を解決しました。ウィジェットがアクティブなときに、ウィジェットをクリックするよりもウィジェットを制御するメインアプリケーション (Twitter) を閉じると、どういうわけかウィジェットがアプリケーションをトリガーし、正常に再起動します。したがって、ボタンは正常に機能します。そんなことがあるものか?

どんな助けでも大歓迎です。

4

2 に答える 2

3

保留中のインテントの目的を実行する必要はありcontext.startserviceません。サービスを最初にすぐに実行する場合は、現在の時刻に実行するように設定してから、現在の時刻からの間隔を設定します。

また、必要のないときに2種類の繰り返しを設定していますが、そうでないsetRepeating場所は厳密でsetInexactあり、起動時にOSによって調整できるため、不正確です。両方ではなく、どちらか一方が必要です。

また、これらの間隔は非常に短く、バッテリーを大幅に消費します。

これだけあればいい

alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
Intent i = new Intent(context, MyService.class);
pi = PendingIntent.getService(context, 0, i, PendingIntent.FLAG_UPDATE_CURRENT);

Long repeat = Long.parseLong(prefs.getString("update_preference", "600"));
alarmManager.setInexactRepeating(AlarmManager.RTC_WAKEUP,
                      Calendar.getInstance().getTimeInMillis(), 1000*repeat, pi);
于 2012-05-08T20:26:44.933 に答える
1

アプリケーション/サービスが常に実行されていないのは良いことです。実際、ウィジェットを更新するために常に実行する必要はありません。AlarmManagerを使用してインテントをスケジュールすると、インテントが閉じられている場合、インテントが起動されたときにアプリケーションが開始されます。

于 2012-05-08T20:23:19.770 に答える