2011-09-22 10 views
9

ウィジェットがあるので、60秒ごとに更新したい。ウィジェットが最初にホームスクリーンに追加されると、更新機能がうまく動作します。それを超えると、60秒ごとに更新メソッドを再実行するAlarmManagerを起動することになっています。それは実際にやっているようではない部分です。ここに私のコードです: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); 
      } 
     } 
    } 

} 

それは私が問題で見つけたいくつかのチュートリアルの産物であり、自分のAndroidの知識です。私のlogcatsによると、Log.d( "onReceive"、 "Clock update")には決して行きません。ライン。そして、はい、私のマニフェストは時計の更新の意図で設定されています。ありがとう!

EDIT:追加情報私は、createClockTickIntentメソッドにログ行を置くと、それが発生します。だから私はこれは、私のアプリケーションがalarmManager.setRepeating行を実行していることを意味しているのではないでしょうか。

+1

スペルミスを修正して自分の問題を解決しましたが、これを投稿してくれてありがとうございます。これは、AlarmManagerを使ってどこでも見たappwidgetを更新する方法の最も簡単で簡単なデモンストレーションです。そこには恐ろしく複雑なソリューションがたくさんありますが、これはすべてを理解し、理解して実装する方法が簡単です。ありがとう! – drmrbrewer

答えて

3

アグフグ、それは単純なタイプミスです。インテントフィルタは、「com.nickavv.cleanwidgets.CLEANCLOCK_UPDATE」だった、と私は「com.nickavv.cleanwidget.CLEANCLOCK_UPDATE」

何の痛みを書いていたが、ちょっと、今私が知っています。

私にとって似たような問題を抱えている人のためのストーリーの道徳的:スペルをチェックしてください!それを2回、または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

@Nick、ありがとうございます。しかし、updatePeriodMillisが30分未満ではないことは確かですか?私はウィジェットを作って10分後に設定するので、うまくいきます。 –

+1

ええ、Android 1.6以降は30分に制限されています – Nick

関連する問題