2011-09-22 7 views
9

위젯이 있으므로 60 초마다 업데이트하고 싶습니다. 위젯이 홈 화면에 처음 추가되면 업데이트 기능이 제대로 실행됩니다. 그 이상으로 AlarmManager를 시작해야하는데, 60 초마다 update 메소드가 다시 실행됩니다. 그것이 실제로하는 것처럼 보이지 않는 부분입니다.AppWidget alarmmanager가 업데이트되지 않습니다.

public class ClockWidget extends AppWidgetProvider { 

    public static String CLOCK_WIDGET_UPDATE = "com.nickavv.cleanwidget.CLEANCLOCK_UPDATE"; 

    @Override 
    public void onUpdate(Context context, AppWidgetManager appWidgetManager, int appWidgetIds[]) { 
     final int N = appWidgetIds.length; 
     for (int i = 0; i < N; i++) { 
      int appWidgetId = appWidgetIds[i]; 
      RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.clocklayout); 
      appWidgetManager.updateAppWidget(appWidgetId, views); 
      updateAppWidget(context, appWidgetManager, appWidgetId); 
     } 
    } 

    public static void updateAppWidget(Context context, AppWidgetManager appWidgetManager, int appWidgetId) { 
     Log.d("log","Entered update cycle"); 
     //Unimportant for these purposes 
     appWidgetManager.updateAppWidget(appWidgetId, views); 
    } 


    private PendingIntent createClockTickIntent(Context context) { 
     Intent intent = new Intent(CLOCK_WIDGET_UPDATE); 
     PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, 
       intent, PendingIntent.FLAG_UPDATE_CURRENT); 
     return pendingIntent; 
    } 

    @Override 
    public void onEnabled(Context context) { 
     super.onEnabled(context); 
     Log.d("onEnabled","Widget Provider enabled. Starting timer to update widget every minute"); 
     AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); 
     alarmManager.setRepeating(AlarmManager.RTC, System.currentTimeMillis(), 60000, createClockTickIntent(context)); 
    } 

    @Override 
    public void onDisabled(Context context) { 
     super.onDisabled(context); 
     Log.d("onDisabled", "Widget Provider disabled. Turning off timer"); 
     AlarmManager alarmManager = (AlarmManager) context 
     .getSystemService(Context.ALARM_SERVICE); 
     alarmManager.cancel(createClockTickIntent(context)); 
    } 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     super.onReceive(context, intent); 
     Log.d("onReceive", "Received intent " + intent); 
     if (CLOCK_WIDGET_UPDATE.equals(intent.getAction())) { 
      Log.d("onReceive", "Clock update"); 
      // Get the widget manager and ids for this widget provider, then 
      // call the shared 
      // clock update method. 
      ComponentName thisAppWidget = new ComponentName(context.getPackageName(), getClass().getName()); 
      AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context); 
      int ids[] = appWidgetManager.getAppWidgetIds(thisAppWidget); 
      for (int appWidgetID: ids) { 
       updateAppWidget(context, appWidgetManager, appWidgetID); 
      } 
     } 
    } 

} 

그것은, 내가 문제에 발견 한 몇 가지 자습서의 제품 및 안드로이드 내 자신의 지식 : 여기에 내 코드입니다. Logcats에 따르면 Log.d ("onReceive", "Clock update")에 도달하지 않습니다. 선. 그리고 네, 내 매니페스트는 클럭 업데이트의 의도로 설정됩니다. 감사!

편집 : 추가 정보 createClockTickIntent 메소드에 로그 라인을 추가하고 실행합니다. 그래서 이것은 내 응용 프로그램이 alarmManager.setRepeating 행을 실행하고 있다는 것을 의미하며 실제로 반복되지 않는 이유는 알 수 없습니다.

+1

맞춤법 오류를 수정하여 자신의 문제를 해결했지만이를 게시 해 주셔서 감사합니다. AlarmManager를 사용하여 어디에서나 볼 수있는 appwidget을 업데이트하는 방법을 가장 간결하고 간단하게 보여줍니다! 거기에 너무 많은 끔찍하게 복잡한 솔루션이 있지만,이 모든 것을 이해하고 구현하는 방법으로 간단합니다. 감사! – drmrbrewer

답변

3

Arggghhh, 단순한 오타였습니다. 인 텐트 필터는 "com.nickavv.cleanwidgets.CLEANCLOCK_UPDATE"이고 필자는 "com.nickavv.cleanwidget.CLEANCLOCK_UPDATE"를 작성했습니다.

얼마나 아팠지만 지금은 알고 있습니다.

내게 비슷한 문제가있는 사람을위한 이야기의 도덕 : 철자를 확인하십시오. 그것을 두 번 또는 10 번 확인하십시오. 모든 것에!

+2

또는 항상 복사/붙여 넣기 :-) (질문 주셔서 감사합니다, btw! 이) –

-4

appwidget-provider을 작성하고 updatePeriodMillis을 0.6 초로 설정해야합니다. 그러면 60 초마다 업데이트됩니다.

<?xml version="1.0" encoding="utf-8" ?> 
<appwidget-provider 
xmlns:android="http://schemas.android.com/apk/res/android" 
android:minWidth="146dp" 
android:initialLayout="@layout/YourLayout" 
android:updatePeriodMillis="0.6" 
android:minHeight="144dp"/> 
+1

죄송합니다. 정확하지 않습니다. appwidget-provider가 있지만, updatePeriodMillis는 30 분보다 더 낮을 수 없으므로 AlarmManager를 사용해야합니다. 또한 60 밀리 초는 60 초가 아니라 0.6 초가됩니다. – Nick

+0

@ 닉, 당신 말이 맞아요,하지만 대단히 답장을 보내 주셔서 감사합니다.하지만 updatePeriodMillis가 30 분보다 낮지 않도록 할 수 있습니까? 나는 위젯을 만들고 10 분에 그것을 설정하기 때문에 그것은 효과가있다. –

+1

예, 안드로이드 1.6 이후로 30 분으로 제한되었습니다. – Nick

관련 문제