2015-10-19 1 views
0

J'essaie de développer une application Android qui dessine une superposition flottante sur l'écran, comme cela est fait par Facebook Messenger avec les têtes de chat. J'ai créé un service Android à partir duquel je gère l'interface utilisateur. Tout fonctionne bien, mais sur certains appareils, le service est arrêté très souvent et parfois il est redémarré après plus de 60 secondes.Le service Android est fréquemment arrêté et redémarré

Je sais que c'est un comportement défini par le système Android, mais je me demandais s'il y avait un moyen de donner à mon service la priorité maximale. Est-ce possible? Ce comportement pourrait-il être aggravé par quelque chose dans ma mise en œuvre qui est faux?

Répondre

1

Une option consiste à faire de votre service un "service d'avant-plan" comme expliqué brièvement in Android documentation. Cela signifie qu'il affiche une icône et éventuellement des données d'état dans la barre d'état. Citant:

Un service de premier plan est un service qui est considéré comme quelque chose l'utilisateur est conscient activement et donc pas d'un candidat pour le système à tuer quand de mémoire. Un service de premier plan doit fournir une notification pour la barre d'état, qui est placée sous l'en-tête "En cours", ce qui signifie que la notification ne peut pas être rejetée sauf si le service est arrêté ou supprimé du premier plan.

Dans la pratique, il vous suffit de modifier onStartCommand() du service méthode pour configurer la notification et appeler startForeGround(). Cet exemple est de la documentation Android:

// Set the icon and the initial text to be shown. 
Notification notification = new Notification(R.drawable.icon, getText(R.string.ticker_text), System.currentTimeMillis()); 
// The pending intent is triggered when the notification is tapped. 
Intent notificationIntent = new Intent(this, ExampleActivity.class); 
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0); 
// 2nd parameter is the title, 3rd one is a status message. 
notification.setLatestEventInfo(this, getText(R.string.notification_title), getText(R.string.notification_message), pendingIntent); 
// You can put anything non-zero in place of ONGOING_NOTIFICATION_ID. 
startForeground(ONGOING_NOTIFICATION_ID, notification); 

C'est en fait un moyen désapprouvée de mettre en place une notification, mais l'idée est la même de toute façon, même si vous utilisez Notification.Builder.