AppWidget 每分钟更新一次
AppWidget update once a minute
我有一个 Android AppWidget,我想每分钟更新一次。因此,在 AppWidgetProvider
中,我创建了一个重复警报设置为每 60 秒触发一次。起初它似乎很好。在前 10 分钟左右,它几乎每分钟更新一次。但随后速度变慢,大约每 3-5 分钟才更新一次。我想知道这是否与我设置 AppWidget 的方式有关,或者我是否错误地初始化了计时器。变慢后似乎也没有定期更新。
AppWidgetProvider
private PendingIntent service = null;
@Override
public void onUpdate(Context context,
AppWidgetManager appWidgetManager, int[] appWidgetIds) {
startAlarm(context);
}
@Override
public void onEnabled(Context context) {
startAlarm(context);
}
@Override
public void onDisabled(Context context) {
// TODO: disable alarm
}
private void startAlarm(Context context) {
Log.d(TAG, "Starting alarm");
final AlarmManager m =
(AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
final Intent i = new Intent(context, MyService.class);
if (service == null)
service = PendingIntent.getService(context, 0, i,
PendingIntent.FLAG_CANCEL_CURRENT);
m.setRepeating(AlarmManager.RTC, System.currentTimeMillis() + (1000 * 10),
1000 * 60, service);
}
我的服务
@Override
public void onCreate() {
super.onCreate();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.d(TAG, "Service started");
buildUpdate();
return super.onStartCommand(intent, flags, startId);
}
private void buildUpdate() {
// Do stuff.
}
@Override
public IBinder onBind(Intent intent) {
return null;
}
这是 运行 在我的 Samsung Galaxy S7 API 级别 23 上,如果相关的话。提前致谢!
实际上,如果您需要每 30 分钟更新一次以上的小部件,最好的方法是使用 IntentService 来更新您的小部件(发出警报)。我在我的 library 中使用与我在内部和我的项目中使用的小部件相同的方法(因为它会像一个 模式 ,我可以在每个带有小部件的项目中使用它)。实际上我没有发现你的代码有任何问题(也许你可以用你的代码做一个小的示例项目)。
你的targetSdkVersion是多少?从 API 19 (Kitkat) 开始,警报传递不准确:OS 将转移警报以尽量减少唤醒和电池使用。
精确报警,如果你的targetSdkVersion是19或更高版本,你必须使用setExact(...)
。 setRepeating(...)
没有确切的版本
对于targetSdkVersion早于API19的应用程序,setRepeating(...)
仍然会发出准确的警报。
我有一个 Android AppWidget,我想每分钟更新一次。因此,在 AppWidgetProvider
中,我创建了一个重复警报设置为每 60 秒触发一次。起初它似乎很好。在前 10 分钟左右,它几乎每分钟更新一次。但随后速度变慢,大约每 3-5 分钟才更新一次。我想知道这是否与我设置 AppWidget 的方式有关,或者我是否错误地初始化了计时器。变慢后似乎也没有定期更新。
AppWidgetProvider
private PendingIntent service = null;
@Override
public void onUpdate(Context context,
AppWidgetManager appWidgetManager, int[] appWidgetIds) {
startAlarm(context);
}
@Override
public void onEnabled(Context context) {
startAlarm(context);
}
@Override
public void onDisabled(Context context) {
// TODO: disable alarm
}
private void startAlarm(Context context) {
Log.d(TAG, "Starting alarm");
final AlarmManager m =
(AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
final Intent i = new Intent(context, MyService.class);
if (service == null)
service = PendingIntent.getService(context, 0, i,
PendingIntent.FLAG_CANCEL_CURRENT);
m.setRepeating(AlarmManager.RTC, System.currentTimeMillis() + (1000 * 10),
1000 * 60, service);
}
我的服务
@Override
public void onCreate() {
super.onCreate();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.d(TAG, "Service started");
buildUpdate();
return super.onStartCommand(intent, flags, startId);
}
private void buildUpdate() {
// Do stuff.
}
@Override
public IBinder onBind(Intent intent) {
return null;
}
这是 运行 在我的 Samsung Galaxy S7 API 级别 23 上,如果相关的话。提前致谢!
实际上,如果您需要每 30 分钟更新一次以上的小部件,最好的方法是使用 IntentService 来更新您的小部件(发出警报)。我在我的 library 中使用与我在内部和我的项目中使用的小部件相同的方法(因为它会像一个 模式 ,我可以在每个带有小部件的项目中使用它)。实际上我没有发现你的代码有任何问题(也许你可以用你的代码做一个小的示例项目)。
你的targetSdkVersion是多少?从 API 19 (Kitkat) 开始,警报传递不准确:OS 将转移警报以尽量减少唤醒和电池使用。
精确报警,如果你的targetSdkVersion是19或更高版本,你必须使用setExact(...)
。 setRepeating(...)
对于targetSdkVersion早于API19的应用程序,setRepeating(...)
仍然会发出准确的警报。