2012-05-27 2 views
0

Мне интересно создать простой виджет часов здесь. И мне интересно, что лучше всего делать? В большинстве случаев это прекрасно работает, но некоторые говорят, что мой виджет часов отстает. Фактическое время 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 для обновления виджета часов каждую минуту?

С уважением

ответ

0

Довольно много причин, что может приводит к решению этой проблемы, но, скорее всего, является служба убитой системы. Невозможно предотвратить загрузку фонового сервиса в Систему, но в большинстве случаев его предварительный сервис будет безопасным в большинстве случаев, но значок уведомления очень раздражает пользователя.

Я думаю, что использование AlarmManager было бы лучшим, я недавно обновил свой виджет часов, используя эту технику тоже. Поскольку AlarmManager выполняет трансляцию, даже ваше приложение убито, оно будет воссоздавать его перед отправкой.

+0

Привет, xandy, ваше объяснение кажется правильным. Сначала я думал, что никогда не устанавливаю widgetID в процессе обновления. Если вы предлагаете использовать AlarmManager, это означает, что он будет выполняться в каждую минуту. Все в порядке? Как насчет использования батареи? Является ли это более эффективным или более эффективным? – rxlky

+0

Кажется более истощенным. Но если вы делаете это в минуту, это не будет проблемой. – xandy

+0

Итак, чтобы успокоить AlarmManager, отлично подходит для виджета цифровых часов, который обновляется каждую минуту? – rxlky

Смежные вопросы