Je ne sais donc pas où / comment implémenter cette méthode pour que mon service s'exécute au premier plan. Actuellement, je démarre mon service par ce qui suit dans une autre activité:
Intent i = new Intent(context, myService.class);
context.startService(i);
Et puis dans onCreate () de myServices j'essaye le startForeground () ...?
Notification notification = new Notification();
startForeground(1, notification);
Alors oui, je suis un peu perdu et je ne sais pas comment mettre en œuvre cela.
Réponses:
Je commencerais par remplir complètement le fichier
Notification
. Voici un exemple de projet démontrant l'utilisation destartForeground()
.la source
1337
?Depuis votre activité principale, démarrez le service avec le code suivant:
Ensuite, dans votre service pour
onCreate()
vous, vous construiriez votre notification et la définiriez comme premier plan comme ceci:la source
Voici mon code pour mettre le service au premier plan:
J'ai besoin de créer une notification à l'aide de PendingIntent, afin de pouvoir démarrer mon activité principale à partir de la notification.
Pour supprimer la notification, appelez simplement stopForeground (true);
Il est appelé dans onStartCommand (). Veuillez vous référer à mon code à: https://github.com/bearstand/greyparrot/blob/master/src/com/xiong/richard/greyparrot/Mp3Recorder.java
la source
Intent.FLAG_ACTIVITY_NEW_TASK
n'est pas valide dans le contexte dePendingIntent
.Solution pour Oreo 8.1
J'ai rencontré des problèmes tels que RemoteServiceException en raison d'un identifiant de canal invalide avec les versions les plus récentes d'Android. Voici comment je l'ai résolu:
Activité :
Service d'arrière-plan:
ÉQUIVALENT JAVA
la source
ContextCompat.startForegroundService(Context,Intent)
dans votre activité ce qui fera la bonne chose. ( developer.android.com/reference/android/support/v4/content/… ).setCategory(NotificationCompat.CATEGORY_SERVICE)
au lieu deNotification.CATEGORY_SERVICE
si votre API min est <21Build.VERSION_CODES.P
(niveau d'API 28) ou version ultérieure doit demander l'autorisationManifest.permission.FOREGROUND_SERVICE
pour pouvoir utiliserstartForeground()
- voir developer.android.com/reference/android/app/...En plus de la réponse RAWA , cette paix de code:
Vous pouvez changer pour:
Si vous regardez à l'intérieur de cette méthode, vous pouvez voir que cette méthode fait tout le travail de vérification pour vous.
la source
Si vous souhaitez faire d'IntentService un service de premier plan
alors tu devrais remplacer
onHandleIntent()
comme çaComment faire une notification?
Facile. Voici la
getNotification()
méthodeCompréhension plus approfondie
Que se passe-t-il lorsqu'un service devient un service de premier plan
Qu'est-ce qu'un service de premier plan?
Un service de premier plan,
s'assure que l'utilisateur est activement conscient que quelque chose se passe en arrière-plan en fournissant la notification.
(le plus important) n'est pas tué par le système lorsqu'il manque de mémoire
Un cas d'utilisation du service de premier plan
Implémentation de la fonctionnalité de téléchargement de chanson dans une application musicale
la source
Ajouter une classe de service de code donnée pour "OS> = Build.VERSION_CODES.O" dans onCreate ()
Ajoutez cette autorisation dans le fichier manifeste:
la source
Gérez l' intention sur startCommand du service à l'aide de.
Cet appel supprimera le service de l'état de premier plan , ce qui lui permettra d'être tué si plus de mémoire est nécessaire. Cela n'empêche pas le service de s'exécuter. Pour cela, vous devez appeler stopSelf () ou des méthodes associées.
La transmission de la valeur true ou false indique si vous souhaitez supprimer la notification ou non.
Gérez votre tâche lorsque la destruction est appelée par stopSelf () .
Créez une notification pour maintenir le service en cours d'exécution au premier plan.
Donnez un bouton d'arrêt sur la notification pour arrêter le service lorsque l'utilisateur en a besoin.
la source
Remarque: si votre application cible le niveau d'API 26 ou supérieur, le système impose des restrictions sur l'utilisation ou la création de services d'arrière-plan, sauf si l'application elle-même est au premier plan.
Si une application doit créer un service de premier plan, l'application doit appeler
startForegroundService()
. Cette méthode crée un service d'arrière-plan, mais la méthode signale au système que le service se promouvra au premier plan.Une fois le service créé, le service doit appeler son
startForeground() method within five seconds.
la source
startForegroundService
méthodeDans mon cas, c'était totalement différent puisque je n'avais pas d'activité pour lancer le service à Oreo.
Voici les étapes que j'ai utilisées pour résoudre ce problème de service de premier plan -
Et après cela, pour lancer ce service, j'ai déclenché ci-dessous cmd -
adb -s "+ serial_id +" shell am startforegroundservice -n com.test.socket.sample / .SocketService
Cela m'aide donc à démarrer le service sans activité sur les appareils Oreo :)
la source
La solution @mikebertiean a presque fait l'affaire, mais j'ai eu ce problème avec une torsion supplémentaire - j'utilise le système Gingerbread et je ne voulais pas ajouter de package supplémentaire juste pour exécuter la notification. Enfin, j'ai trouvé: https://android.googlesource.com/platform/frameworks/support.git+/f9fd97499795cd47473f0344e00db9c9837eea36/v4/gingerbread/android/support/v4/app/NotificationCompatGingerbread.java
puis je rencontre un problème supplémentaire - la notification tue simplement mon application lorsqu'elle s'exécute (comment résoudre ce problème: Android: Comment éviter que cliquer sur une notification appelle onCreate () ), donc au total, mon code en service ressemble à ceci (C # / Xamarin):
la source