여기 간단한 시계 위젯 제작에 흥미가 있습니다. 그리고 최선의 방법은 무엇일까? 대부분의 경우 잘 작동하지만 일부 사람들은 내 시계 위젯이 뒤처져 있다고 말합니다. 실제 시간은 오전 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를 사용하여 매분마다 시계 위젯을 업데이트 하시겠습니까? 수도 문제에 리드하지만, 대부분의 아마, 서비스 시스템에 의해 살해되는 이유
감사
안녕하세요, 귀하의 설명이 맞는 것 같습니다. 처음에는 업데이트 프로세스에서 widgetID를 설정하지 않는다고 생각했습니다. AlarmManager를 사용할 것을 권장하면 매분마다 실행된다는 것을 의미합니다. 괜찮습니까? 배터리 사용은 어떻습니까? 더 효율적이거나 더 많은 배수가 있습니까? – rxlky
더 많은 물기가 발생했습니다. 그러나 분 안에 일을한다면 그것은 문제가되지 않습니다. – xandy
AlarmManager는 매분마다 업데이트되는 디지털 시계 위젯에 좋습니다. – rxlky