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?
Hmm - Je ne l'ai pas du tout mis dans le manifeste ... juste dans la classe AppWidgetProvider. – DeNitE
@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
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