2012-05-27 5 views
0

여기 간단한 시계 위젯 제작에 흥미가 있습니다. 그리고 최선의 방법은 무엇일까? 대부분의 경우 잘 작동하지만 일부 사람들은 내 시계 위젯이 뒤처져 있다고 말합니다. 실제 시간은 오전 10시 다음 내 위젯 오전 9시 48분에게 아마도 내가 내 매니페스트위젯 업데이트 지연

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

에이

을 보여주고있다 그리고 이것은

공용 클래스 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(); 

     } 
    }; 

}  } 

무엇이 누락 되었습니까? 왜 위젯이 뒤처져 있죠? 여기에서 문제를 발견하도록 도와 주시겠습니까? 올바른 접근 방식을 사용하고 있습니까? AlarmManager가 아닌 Service를 사용하여 매분마다 시계 위젯을 업데이트 하시겠습니까? 수도 문제에 리드하지만, 대부분의 아마, 서비스 시스템에 의해 살해되는 이유

감사

답변

0

아주 많이. 백그라운드 서비스가 시스템에 의해 종료되는 것을 막을 수있는 방법이 없으며 대부분의 경우 전경 서비스가 안전 할 뿐이며 알림 아이콘은 사용자에게 매우 성가신 일입니다.

나는 AlarmManager을 사용하는 것이 가장 좋을 것이라고 생각합니다. 최근에이 기술을 사용하여 시계 위젯을 최근에 업데이트했습니다. AlarmManager가 브로드 캐스트를하기 때문에 애플리케이션이 죽어도 전송하기 전에 다시 생성합니다.

+0

안녕하세요, 귀하의 설명이 맞는 것 같습니다. 처음에는 업데이트 프로세스에서 widgetID를 설정하지 않는다고 생각했습니다. AlarmManager를 사용할 것을 권장하면 매분마다 실행된다는 것을 의미합니다. 괜찮습니까? 배터리 사용은 어떻습니까? 더 효율적이거나 더 많은 배수가 있습니까? – rxlky

+0

더 많은 물기가 발생했습니다. 그러나 분 안에 일을한다면 그것은 문제가되지 않습니다. – xandy

+0

AlarmManager는 매분마다 업데이트되는 디지털 시계 위젯에 좋습니다. – rxlky

관련 문제