AppWidget每分钟更新一次

时间:2018-02-05 23:38:52

标签: android widget alarmmanager android-appwidget

我有一个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);
}

为MyService

@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;
}

这是在我的三星Galaxy S7 API级别23上运行,如果这是相关的。提前谢谢!

2 个答案:

答案 0 :(得分:1)

实际上,如果每30分钟需要多次更新小部件,最好使用 IntentService 来更新小部件(警报就可以了)。我在library使用相同的方法来处理我在内部和我的项目中使用的小部件(因为它会像模式一样,我可以在每个带有小部件的项目中使用它)。实际上我没有发现你的代码有任何问题(也许你可以从你的代码中创建一个小样本项目。)

答案 1 :(得分:1)

你的targetSdkVersion是什么?从API 19(Kitkat)开始,警报传递不准确:操作系统将移动警报以最小化唤醒和电池使用。

对于准确的警报,如果您的targetSdkVersion为19或更高,则必须使用setExact(...)。没有setRepeating(...)

的确切版本

对于targetSdkVersion早于API 19 setRepeating(...)的应用程序,仍会提供准确的警报。