4

ウィジェット付きのイスラム暦カレンダー アプリがあります。イスラム暦の日付は、AlarmManager を使用して真夜中に変更する必要があります。問題は、Alarm Manager を使用して真夜中の更新をスケジュールしているにもかかわらず、ウィジェットが正確に真夜中の 12 時に更新されないことです。午前12時から午前1時の間に更新されます。

どこが間違っていますか?

ジャワ:

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>
4

1 に答える 1

4

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()上記のコードをメソッドに追加する必要があると思います。AppWidgetProvider の関連メソッドのハイライトを次に示します

于 2012-08-27T23:28:18.943 に答える