2017-08-16 6 views
1

Il y a un widget horloge dans notre application. Le widget doit être mis à jour chaque minute pour afficher l'heure exacte.Android O: pouvons-nous faire un widget horloge?

Dans Android O, il est conseillé d'utiliser JobScheduler pour les mises à jour en arrière-plan. Malheureusement, il y a des limites.

  1. Les mises à jour périodiques de JobService ne peuvent pas être appelées à intervalles de moins de 15 minutes.
  2. Le moment JobService.onStartJob() est imprévisible. Nous pouvons manquer le moment exact pour mettre à jour le chiffre des minutes (59e seconde).

Avant O nous avions l'habitude d'exécuter un service d'arrière-plan avec Handler.postDelayed() pour mettre à jour l'heure dans le widget. En O, le service d'arrière-plan peut être interrompu par le système.

Comment recommanderiez-vous de mettre en œuvre un widget horloge dans Android O?

Est-ce encore possible maintenant?

enter image description here

+1

Toute idée pourquoi ma question downvoted? – Pavel

+0

Essayez JobIntentService –

+2

Ceci est une question très importante. Il ne devrait pas être downvoted –

Répondre

2

Utilisez le contrôle de widget "TextClock", il est pris en charge par la fonctionnalité RemoteView et il met à jour chaque minute par lui-même, pas besoin d'utiliser ces tâches JobScheduler fantaisie.

Quelque chose comme ça fera l'affaire:

<LinearLayout 
    android:id="@+id/root" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical"> 

    <TextClock 
     android:id="@+id/dateText" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:layout_weight="1" 
     android:format12Hour="@string/date_text_format_12h" 
     android:format24Hour="@string/date_text_format_24h" 
     android:gravity="bottom|center_horizontal" 
     android:textColor="@android:color/black" 
     android:textSize="@dimen/date_text_size_default"/> 

    <TextClock 
     android:id="@+id/timeText" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:layout_weight="1" 
     android:format12Hour="@string/time_text_format_12h" 
     android:format24Hour="@string/time_text_format_24h" 
     android:gravity="top|center_horizontal" 
     android:textColor="@android:color/black" 
     android:textSize="@dimen/time_text_size_default" 
     android:textStyle="bold"/> 

</LinearLayout> 
+1

Je ne m'attendais pas à ce que la solution soit aussi simple. Nous avons même contacté le support développeur Google il y a quelques semaines. Ils n'ont toujours pas fourni de réponse. Merci beaucoup! – Pavel

+1

Le widget TextClock n'est disponible qu'à partir de l'API 17. – Pavel

+0

Cette solution ne fonctionne pas pour les horloges analogiques. Est-ce que quelqu'un sait si les horloges analogiques peuvent être créées dans Android Oreo? –

0

Il est un widget; il n'a pas besoin de mettre à jour tout le temps - seulement quand il est visible. Pourquoi voudriez-vous perdre la batterie en gardant la trace de l'heure actuelle pendant que votre widget ne fonctionne pas?

Lorsque le widget devient visible, recherchez l'heure actuelle et dessinez-la immédiatement. Aussi, calculez quand le sommet de la minute suivante est, et postez un message retardé ou Runnable à un gestionnaire qui se déclenchera à ce moment. Lorsque ce message/Runnable s'exécute, mettez à jour votre affichage de l'heure et renvoyez le message/Runnable pour le début de la minute suivante.

Vous devez également enregistrer un récepteur pour la diffusion Intent.ACTION_TIME_CHANGED que le gestionnaire d'alarmes envoie lorsque l'heure actuelle est modifiée; Vous devez recalculer l'heure affichée et la prochaine mise à jour en réponse à cette diffusion.

+1

Alors, quel événement a-t-il déclenché lorsque le widget devient visible? –

+2

Autant que je sache, il n'y a aucun moyen de détecter le moment où le widget devient visible. – Pavel