Мне интересно создать простой виджет часов здесь. И мне интересно, что лучше всего делать? В большинстве случаев это прекрасно работает, но некоторые говорят, что мой виджет часов отстает. Фактическое время 10:00 утра, то мой виджет, возможно, показывает 9.48amЗадержка при обновлении виджета
У меня есть это на мой манифест
<receiver android:name="my.package.name.MyClock" android:label="@string/widget_name"> <intent-filter> <action android:name="android.appwidget.action.APPWIDGET_UPDATE" /> </intent-filter> <meta-data android:name="android.appwidget.provider" android:resource="@xml/my_clock" /> </receiver> <service android:name="MyClock$UpdateService" android:label="UpdateService" > <intent-filter> <action android:name="my.package.name.UPDATE" /> </intent-filter> </service>
И это мой основной класс Java
общественного класса MyClock продолжается AppWidgetProvider {
@Override public void onDisabled(Context context) { super.onDisabled(context); context.stopService(new Intent(context, UpdateService.class)); } @Override public void onEnabled(Context context) { super.onEnabled(context); context.startService(new Intent(UpdateService.ACTION_UPDATE)); } @Override public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { super.onUpdate(context, appWidgetManager, appWidgetIds); context.startService(new Intent(UpdateService.ACTION_UPDATE)); } public static final class UpdateService extends Service { static final String ACTION_UPDATE = "my.package.name.UPDATE"; private final static IntentFilter sIntentFilter; private String mMinuteFormat; private String mHourFormat; private Calendar mCalendar; static { sIntentFilter = new IntentFilter(); sIntentFilter.addAction(Intent.ACTION_TIME_TICK); sIntentFilter.addAction(Intent.ACTION_TIMEZONE_CHANGED); sIntentFilter.addAction(Intent.ACTION_TIME_CHANGED); } @Override public void onCreate() { super.onCreate(); reinit(); registerReceiver(mTimeChangedReceiver, sIntentFilter); } @Override public void onDestroy() { super.onDestroy(); unregisterReceiver(mTimeChangedReceiver); } @Override public void onStart(Intent intent, int startId) { super.onStart(intent, startId); reinit(); update(); } @Override public IBinder onBind(Intent intent) { return null; } private void update() { mCalendar.setTimeInMillis(System.currentTimeMillis()); final CharSequence minute = DateFormat.format(mMinuteFormat, mCalendar); final CharSequence hour = DateFormat.format(mHourFormat, mCalendar); RemoteViews views = null; views = new RemoteViews(getPackageName(), R.layout.main); views.setTextViewText(R.id.HOUR, hour); views.setTextViewText(R.id.MINUTE, minute); //Refresh the widget ComponentName widget = new ComponentName(this, MyClock.class); AppWidgetManager manager = AppWidgetManager.getInstance(this); manager.updateAppWidget(widget, views); } private void reinit() { mHourFormat = "hh"; mMinuteFormat = "mm"; } private final BroadcastReceiver mTimeChangedReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { final String action = intent.getAction(); if (action.equals(Intent.ACTION_TIME_CHANGED) || action.equals(Intent.ACTION_TIMEZONE_CHANGED)) { reinit(); } update(); } }; } }
Что мне не хватает? Почему виджет отстает? Можете ли вы, пожалуйста, помочь мне определить проблему здесь? И делаю ли я правильный подход? Использование Service not AlarmManager для обновления виджета часов каждую минуту?
С уважением
Привет, xandy, ваше объяснение кажется правильным. Сначала я думал, что никогда не устанавливаю widgetID в процессе обновления. Если вы предлагаете использовать AlarmManager, это означает, что он будет выполняться в каждую минуту. Все в порядке? Как насчет использования батареи? Является ли это более эффективным или более эффективным? – rxlky
Кажется более истощенным. Но если вы делаете это в минуту, это не будет проблемой. – xandy
Итак, чтобы успокоить AlarmManager, отлично подходит для виджета цифровых часов, который обновляется каждую минуту? – rxlky