Kuja Posté(e) 2 mars 2011 Share Posté(e) 2 mars 2011 Bien le bonjour à tous ! Je développe un widget horloge classique (car je voulais un truc simple pour commencer le dev sous Android). Donc j'ai réussi à faire mon layout, mon AppWidgetProvider, mon Activity de configuration, etc. Tout marche impec ! Seulement vient le problème du rafraîchissement de celui-ci. Je peux me servir de l'alarm manager et de faire un setRepeating pour rafraichir tout les x temps (je l'ai placé dans le onReceive =>et si l'action est un update) . Le problème c'est qu'il se déclenche alors que je n'ai même pas fini la configuration. Ce qui déclenche un rafraichissement sans fin. Et j'ai beau déclencher un alarm.cancel() (avec une vérification par id) mais rien n'y fait, j'ai toujours un rafraichissement qui ne se finit pas, je dois killer le process de force avec le gestionnaire... Bref, avez-vous une idée d'où ça peut venir ? J'ai mis un flag authUpdate, mais c'est plus une rustine qu'une solution... Et surtout quelle est la meilleure façon de rafraichir un widget horloge sans que ça pompe toute la batterie ? Si vous avez des conseils je suis preneur :) Ps: j'ai mis mes 2 classes : l'AppWidgetProvider et l'Activity de configuration. Ps2: j'ai mis une intervalle de 5 secondes pour mes tests, je sais bien que ce n'est même pas envisageable de laisser tel quel lors du déploiement réel sur smartphone... public class ClockWidget extends AppWidgetProvider { private static final String TAG = "KujaClockDebug"; public static final String URI_SCHEME = "kujaclock_widget"; public static int updateRateSeconds = 60000; public static Boolean authUpdate = false; @Override public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { if (authUpdate) { for (int appWidgetId : appWidgetIds) { // Déclarations des variables Log.d(TAG, "onUpdate"); Calendar now; Date trialTime; double batteryScale; int batteryLevel; int batteryRawLevel; int month; int weekDay; RemoteViews remoteViews; String amPm; String battery; String day; String hours; String minutes; String year; TimeZone thisTimeZone; if (!LocaleTexts.getIsInitiated()) LocaleTexts.initLocaleTexts(); //Set des variables pour le calendrier thisTimeZone = TimeZone.getDefault(); now = new GregorianCalendar(thisTimeZone); trialTime = new Date(); now.setTime(trialTime); hours = now.get(Calendar.HOUR_OF_DAY)+""; if (hours.length() == 1) hours = "0"+hours; minutes = now.get(Calendar.MINUTE)+""; if (minutes.length() == 1) minutes = "0"+minutes; amPm = LocaleTexts.getAmPm(now.get(Calendar.AM_PM)); weekDay = now.get(Calendar.DAY_OF_WEEK)-now.getFirstDayOfWeek(); day = now.get(Calendar.DAY_OF_MONTH)+""; if (day.length() == 1) day = "0"+day; month = now.get(Calendar.MONTH); year = now.get(Calendar.YEAR)+""; battery = "loading..."; Intent batteryIntent = context.getApplicationContext().registerReceiver(null, new IntentFilter(Intent.ACTION_BATTERY_CHANGED)); batteryRawLevel = batteryIntent.getIntExtra(BatteryManager.EXTRA_LEVEL, -1); batteryScale = batteryIntent.getIntExtra(BatteryManager.EXTRA_SCALE, -1); batteryLevel = -1; if (batteryRawLevel >= 0 && batteryScale > 0) batteryLevel = (int) ((batteryRawLevel*100) / batteryScale); battery = batteryLevel + "%"; remoteViews = new RemoteViews(context.getPackageName(), R.layout.widget_clock_layout); remoteViews.setTextViewText(R.id.heure10, hours.substring(0, 1)); remoteViews.setTextViewText(R.id.heure1, hours.substring(1, 2)); remoteViews.setTextViewText(R.id.minute10, minutes.substring(0, 1)); remoteViews.setTextViewText(R.id.minute1, minutes.substring(1, 2)); remoteViews.setTextViewText(R.id.ampm, amPm); remoteViews.setTextViewText(R.id.jourLettre, LocaleTexts.getWeekDay(weekDay)); remoteViews.setTextViewText(R.id.dateJour, day); remoteViews.setTextViewText(R.id.dateMois, LocaleTexts.getMonth(month)); remoteViews.setTextViewText(R.id.dateAnnee, year); remoteViews.setTextViewText(R.id.batterieTitre, LocaleTexts.getBattery()); remoteViews.setTextViewText(R.id.batteriePourcent, battery); remoteViews.setImageViewBitmap(R.id.batterieBar, Bitmap.createBitmap(BitmapFactory.decodeResource(context.getResources(), R.drawable.battery_bar), 0, 0, (int)(70*((double)batteryLevel/100)), 6)); appWidgetManager.updateAppWidget(appWidgetIds, remoteViews); } } } @Override public void onDeleted(Context context, int[] appWidgetIds) { Log.d(TAG, "onDeleted"); authUpdate = false; for (int appWidgetId : appWidgetIds) { // stop alarm Intent widgetUpdate = new Intent(); widgetUpdate.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE); widgetUpdate.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId); widgetUpdate.setData(Uri.withAppendedPath(Uri.parse(URI_SCHEME + "://widget/id/"), String.valueOf(appWidgetId))); PendingIntent newPending = PendingIntent.getBroadcast(context, 0, widgetUpdate, PendingIntent.FLAG_UPDATE_CURRENT); Log.d(TAG, "getId: "+Uri.withAppendedPath(Uri.parse(URI_SCHEME + "://widget/id/"), String.valueOf(appWidgetId))); AlarmManager alarms = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); alarms.cancel(newPending); } super.onDeleted(context, appWidgetIds); } @Override public void onEnabled(Context context) { Log.d(TAG, "onEnabled"); } @Override public void onDisabled(Context context) { Log.d(TAG, "onDisabled"); } @Override public void onReceive(Context context, Intent intent) { final String action = intent.getAction(); final int[] appWidgetIds = intent.getExtras().getIntArray(AppWidgetManager.EXTRA_APPWIDGET_IDS); Log.d(TAG, "onReceive: "+action); if (AppWidgetManager.ACTION_APPWIDGET_DELETED.equals(action)) { final int appWidgetId = intent.getExtras().getInt(AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID); if (appWidgetId != AppWidgetManager.INVALID_APPWIDGET_ID) { this.onDeleted(context, new int[] { appWidgetId }); } } else if (AppWidgetManager.ACTION_APPWIDGET_UPDATE.equals(action)) { Log.d(TAG, "onReceive: update"); if (!URI_SCHEME.equals(intent.getScheme())) { for (int appWidgetId : appWidgetIds) { AlarmManager alarm = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); Intent widgetUpdate = new Intent(context.getApplicationContext(), ClockWidget.class); widgetUpdate.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE); widgetUpdate.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, new int[] { appWidgetId }); widgetUpdate.setData(Uri.withAppendedPath(Uri.parse(URI_SCHEME + "://widget/id/"), String.valueOf(appWidgetId))); Log.d(TAG, "setId: "+Uri.withAppendedPath(Uri.parse(URI_SCHEME + "://widget/id/"), String.valueOf(appWidgetId))); PendingIntent newPending = PendingIntent.getBroadcast(context, 0, widgetUpdate, PendingIntent.FLAG_UPDATE_CURRENT); if (authUpdate) alarm.setRepeating(AlarmManager.ELAPSED_REALTIME, SystemClock.elapsedRealtime(), 5000, newPending); } } super.onReceive(context, intent); } else { super.onReceive(context, intent); } } } public class KujaClockConfigure extends Activity { private static final String TAG = "KujaClockConfDebug"; int kujAppWidgetId = AppWidgetManager.INVALID_APPWIDGET_ID; ToggleButton widgetClockBtn; PendingIntent pendingIntent; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Log.d(TAG, "onCreate"); setContentView(R.layout.main); Intent intent = getIntent(); Bundle extras = intent.getExtras(); if (extras != null) { kujAppWidgetId = extras.getInt(AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID); } if (kujAppWidgetId == AppWidgetManager.INVALID_APPWIDGET_ID) { finish(); } widgetClockBtn = (ToggleButton) findViewById(R.id.toggleButton1); widgetClockBtn.setOnClickListener(new OnClickListener() { public void onClick(View v) { Log.d(TAG, "click"); if (kujAppWidgetId != AppWidgetManager.INVALID_APPWIDGET_ID) { final Context context = getApplicationContext(); RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.widget_clock_layout); AppWidgetManager.getInstance(context).updateAppWidget(kujAppWidgetId, views); Intent result = new Intent(); result.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, kujAppWidgetId); setResult(RESULT_OK, result); Intent widgetUpdate = new Intent(); widgetUpdate.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE); widgetUpdate.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, new int[] { kujAppWidgetId }); // make this pending intent unique widgetUpdate.setData(Uri.withAppendedPath(Uri.parse(ClockWidget.URI_SCHEME + "://widget/id/"), String.valueOf(kujAppWidgetId))); PendingIntent newPending = PendingIntent.getBroadcast(context, 0, widgetUpdate, PendingIntent.FLAG_UPDATE_CURRENT); // schedule the new widget for updating AlarmManager alarm = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); alarm.setRepeating(AlarmManager.ELAPSED_REALTIME, SystemClock.elapsedRealtime(), 5000, newPending); // On quitte et valide une fois la config finie LocaleTexts.initLocaleTexts(); finish(); ClockWidget.authUpdate = true; new ClockWidget().onUpdate(context, AppWidgetManager.getInstance(context), new int[] { kujAppWidgetId }); } } }); } } Lien vers le commentaire Partager sur d’autres sites More sharing options...
Recommended Posts
Archivé
Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.