【问题标题】:Updating widget at midnight (12 AM) fails在午夜 (12 AM) 更新小部件失败
【发布时间】:2012-08-27 21:53:03
【问题描述】:

我有一个带有小部件的回历日历应用程序。 Hijri 日历的日期应在午夜使用 AlarmManager 更改。问题是尽管使用警报管理器来安排午夜更新,但小部件并未准确地在午夜 12 点更新。它将在 12 点到 1 点之间更新。

我哪里错了?

Java:

private static PendingIntent service = null;
private static long UPDATES_CHECK_INTERVAL = 24 * 60 * 60 * 1000;


    @Override
    public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds)
    {

        schedule(context);
        super.onUpdate(context, appWidgetManager, appWidgetIds);
    }


    protected void schedule(Context context) {
        final AlarmManager m = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);

        final Calendar TIME = Calendar.getInstance();
        Date now = new Date();
        TIME.add(Calendar.DAY_OF_MONTH, 1);
        TIME.set(Calendar.HOUR_OF_DAY, 0);
        TIME.set(Calendar.MINUTE, 0);
        TIME.set(Calendar.SECOND, 0);
        TIME.set(Calendar.MILLISECOND, 0);

        long firstTime = (TIME.getTimeInMillis()-now.getTime());

        final Intent i = new Intent(context, UpdateService.class);

        if (service == null)
        {
            service = PendingIntent.getService(context, 0, i, PendingIntent.FLAG_CANCEL_CURRENT);
        }

        m.setRepeating(AlarmManager.RTC, firstTime, UPDATES_CHECK_INTERVAL, service);
    }

清单:

<receiver android:name="com.example.app.Widget" android:label="Calendar" android:exported="false">
    <intent-filter >
        <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
        <action android:name="android.appwidget.action.APPWIDGET_ENABLED" />
        <action android:name="android.intent.action.TIMEZONE_CHANGED" />
        <action android:name="android.intent.action.TIME_SET" />
        <action android:name="android.intent.action.DATE_CHANGED" />
    </intent-filter>

    <meta-data
        android:name="android.appwidget.provider"
        android:resource="@xml/widget_info" />
</receiver>

【问题讨论】:

  • 你为什么要在TIME.getTimeInMillis()-now.getTime()中做减法?
  • 从当前时间到午夜的毫秒数。

标签: java android date alarmmanager


【解决方案1】:

我认为您需要更改与 Calender 和 AlarmManager 相关的代码。

这个日历代表第二天午夜的准确时间。并且 AlarmManager 将在那个时间每天触发意图。

Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(System.currentTimeMillis());
calendar.set(Calendar.SECOND, 0);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.HOUR, 0);
calendar.set(Calendar.AM_PM, Calendar.AM);
calendar.add(Calendar.DAY_OF_MONTH, 1); 

AlarmManager alarmManager = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), AlarmManager.INTERVAL_DAY, service);

注意:我认为你应该在onEnabled()方法中添加上面的代码。 Here is a highlight of the AppWidgetProvider's related methods.

【讨论】:

  • 这确实改变了 12 点的时间,但是当小部件启用时,它最初什么也不显示。
  • 在小部件实例化时显示 00,在午夜更新并显示当前日期。
  • 你在哪里添加了这段代码?您将更新小部件日期的代码放在哪里?
  • 我在 Update 和 onEnabled 上添加了这段代码,更新 mywidget 的代码是 onUpdate
  • 如果您的更新代码在onUpdate() 中,则应实例化小部件。但是,警报代码应该只输入onEnabled()。因此,请尝试将其从 onUpdate() 中删除。也许这就是问题所在。
猜你喜欢
  • 1970-01-01
  • 2012-02-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多