2016-07-17 2 views
2

J'essaie de créer un widget d'horloge qui se met à jour une fois par minute.Pourquoi mon widget Horloge arrête-t-il de mettre à jour - en utilisant IntentFilter (Intent.ACTION_TIME_TICK)

J'ai essayé d'utiliser le AlarmManager pour envoyer des demandes de mise à jour, mais je pensais que ne serait pas aussi précis que l'utilisation IntentFilter(Intent.ACTION_TIME_TICK)

Les charges widget parfaitement et mises à jour pendant environ 10 minutes ou si l'utilisation du ACTION_TIME_TICK IntentFilter ... mais arrête juste la mise à jour.

Voilà ma classe AppWidgetProvider

public class ClockWidget extends AppWidgetProvider 
{ 
    private final String TAG = "ClockWidget"; 

    private static SharedPreferences sharedPrefs; 
    private static SharedPreferences.Editor prefEditor; 
    private final String SHARED_PREF_NAME = "ClassicBlack_Prefs"; 

    private BroadcastReceiver receiver; 

    @Override 
    public void onEnabled(Context context) 
    { 
     Log.d(TAG, "onEnabled()"); 

     super.onEnabled(context); 
     sharedPrefs = context.getSharedPreferences(SHARED_PREF_NAME, 0); 
     prefEditor = sharedPrefs.edit(); 
     prefEditor.putBoolean("isWatchfaceActive", true).commit(); 

     drawWatch(context); 

     receiver = new BroadcastReceiver() 
     { 
      @Override 
      public void onReceive(Context ctx, Intent intent) 
      { 
       if (intent.getAction().compareTo(Intent.ACTION_TIME_TICK) == 0) 
       { 
        drawWatch(ctx); 
       } 
      } 
     }; 

     context.getApplicationContext().registerReceiver(receiver, new IntentFilter(Intent.ACTION_TIME_TICK)); 
    } 

    @Override 
    public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) 
    { 
     Log.d(TAG, "onUpdate()"); 
     super.onUpdate(context, appWidgetManager, appWidgetIds); 
    } 

    @Override 
    public void onDisabled(Context context) 
    { 
     Log.d(TAG, "onDisabled()"); 

     super.onDisabled(context); 
     sharedPrefs = context.getSharedPreferences(SHARED_PREF_NAME, 0); 
     prefEditor = sharedPrefs.edit(); 
     prefEditor.putBoolean("isWatchfaceActive", false).commit(); 

     if (receiver != null) 
     { 
      context.getApplicationContext().unregisterReceiver(receiver); 
     } 
    } 

    private void drawWatch(Context context) 
    { 
     Log.d(TAG, "drawWatch()"); 

     AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context.getApplicationContext()); 
     ComponentName thisWidget = new ComponentName(context, ClockWidget.class); 

     int[] allWidgetIds = appWidgetManager.getAppWidgetIds(thisWidget); 

     Log.i("ExampleWidget", "Updating widgets " + Arrays.asList(allWidgetIds)); 

     // Perform this loop procedure for each App Widget that belongs to this provider 
     for (int i = 0; i < allWidgetIds.length; i++) 
     { 
      DrawWatchFace drawWatchFace = new DrawWatchFace(context, null, true, 500); 
      drawWatchFace.createWatchWidget(); 

      // Get the layout for the App Widget and attach an on-click listener to the button 
      RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.clock_widget_layout); 
      views.setImageViewBitmap(R.id.widget_canvas_imageView_small, drawWatchFace.getPalletBitmap()); 

      // Tell the AppWidgetManager to perform an update on the current app widget 
      appWidgetManager.updateAppWidget(allWidgetIds[i], views); 
     } 
    } 
} 

Toutes les suggestions?

Répondre

3

Votre processus est en cours. C'est parfaitement normal. Lorsque votre processus se termine, votre récepteur est détruit et vous ne recevrez plus les diffusions.

Vous ne pouvez pas vous inscrire à ACTION_TIME_TICK dans le manifeste, ce qui est la manière typique de gérer cela.

Je vous recommande de revenir à votre approche AlarmManager.

+0

Hmm - Je ne l'ai pas du tout mis dans le manifeste ... juste dans la classe AppWidgetProvider. – DeNitE

+0

@DeNitE: Je comprends cela. Vous appelez 'registerReceiver()'. Cela ne fonctionnera que pendant que votre processus est en cours d'exécution. Votre processus ne fonctionnera pas éternellement, et ne devrait pas le faire. Pour de nombreuses diffusions, vous pouvez les enregistrer dans le manifeste et les recevoir même si vous n'avez pas de processus en cours d'exécution. Ce n'est pas possible pour certaines émissions. 'ACTION_TIME_TICK' est une telle diffusion. – CommonsWare

+0

Intéressant - donc je suppose que la plupart des widgets utilisent juste le AlarmManager pour s'assurer qu'il continue à mettre à jour? Y a-t-il un moyen de synchroniser une alarme avec l'horloge du système chaque minute? – DeNitE