更新小部件于午夜(12点)失败。

4
我有一个带小部件的伊斯兰历应用程序。伊斯兰历的日期应该在午夜使用AlarmManager更改。问题是,尽管使用Alarm Manager来安排午夜更新,但小部件并不会准确地在午夜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()中进行减法运算? - iTurki
从当前时间获取距离午夜的毫秒数。 - input
1个回答

4

我认为你需要修改与日历和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() 方法中。 这里是与AppWidgetProvider相关的方法的亮点


这确实会改变12点的时间,但当小部件启用时,它最初不显示任何内容。 - input
你把这段代码加在哪里了?还有,你把更新小部件日期的代码放在哪里了? - iTurki
如果你的更新代码在 onUpdate() 中,那么 Widget 应该被实例化。然而,闹钟代码应该仅放在 onEnabled() 中。因此,尝试将其从 onUpdate() 中移除。也许这就是问题所在。 - iTurki
你在这里想要做什么?calendar.add(Calendar.DAY_OF_MONTH, 1); - coolcool1994
你能提供 "protected void schedule(Context context)" 的完整代码吗?因为你的代码没有更新小部件。 - coolcool1994
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接