Portanto, não tenho certeza de onde / como implementar esse método para executar meu serviço em primeiro plano. Atualmente, inicio o serviço da seguinte forma em outra atividade:
Intent i = new Intent(context, myService.class);
context.startService(i);
E então no onCreate () de myServices, tento o startForeground () ...?
Notification notification = new Notification();
startForeground(1, notification);
Então, sim, estou um pouco perdido e inseguro de como implementar isso.
Respostas:
Eu começaria preenchendo completamente o arquivo
Notification
. Aqui está um projeto de amostra demonstrando o uso destartForeground()
.fonte
1337
?Na sua atividade principal, inicie o serviço com o seguinte código:
Em seu serviço,
onCreate()
você criaria sua notificação e a definiria como primeiro plano da seguinte maneira:fonte
Este é o meu código para definir o serviço em primeiro plano:
Preciso criar uma notificação usando PendingIntent, para poder iniciar minha atividade principal a partir da notificação.
Para remover a notificação, basta chamar o stopForeground (true);
É chamado no onStartCommand (). Consulte o meu código em: https://github.com/bearstand/greyparrot/blob/master/src/com/xiong/richard/greyparrot/Mp3Recorder.java
fonte
Intent.FLAG_ACTIVITY_NEW_TASK
não é válido no contexto dePendingIntent
.Solução para Oreo 8.1
Encontrei alguns problemas, como RemoteServiceException, devido à identificação de canal inválida nas versões mais recentes do Android. Foi assim que eu resolvi:
Atividade :
BackgroundService:
JAVA EQUIVALENT
fonte
ContextCompat.startForegroundService(Context,Intent)
em sua atividade que fará a coisa certa. ( developer.android.com/reference/android/support/v4/content/… ).setCategory(NotificationCompat.CATEGORY_SERVICE)
, em vez deNotification.CATEGORY_SERVICE
se seu min API é <21Build.VERSION_CODES.P
(nível 28 da API) ou posterior devem solicitar a permissãoManifest.permission.FOREGROUND_SERVICE
para usarstartForeground()
- consulte developer.android.com/reference/android/app/…Além da resposta da RAWA , esta paz de código:
Você pode mudar para:
Se você olhar dentro deste método, poderá ver que esse método faz todas as verificações funcionarem para você.
fonte
Se você deseja tornar o IntentService um serviço em primeiro plano
então você deve substituir
onHandleIntent()
assimComo fazer a notificação?
simples. Aqui está o
getNotification()
métodoCompreensão mais profunda
O que acontece quando um serviço se torna um serviço em primeiro plano
O que é um serviço em primeiro plano?
Um serviço em primeiro plano,
garante que o usuário esteja ciente de que algo está acontecendo em segundo plano, fornecendo a notificação.
(o mais importante) não é eliminado pelo sistema quando fica com pouca memória
Um caso de uso de serviço em primeiro plano
Implementando a funcionalidade de download de músicas em um aplicativo de música
fonte
Adicione o código fornecido Classe de serviço para "OS> = Build.VERSION_CODES.O" em onCreate ()
Adicione esta permissão no arquivo de manifesto:
fonte
Manipule a intenção no startCommand do serviço usando.
Essa chamada removerá o serviço do estado de primeiro plano , permitindo que seja eliminado se for necessária mais memória. Isso não impede a execução do serviço . Para isso, é necessário chamar stopSelf () ou métodos relacionados.
Valor de passagem verdadeiro ou falso indicado se você deseja remover a notificação ou não.
Lide com sua tarefa quando em destruição for chamado por stopSelf () .
Crie uma notificação para manter o serviço em execução em primeiro plano.
Dê um botão de parada na notificação para interromper o serviço quando o usuário precisar.
fonte
Nota: Se o seu aplicativo atingir a API nível 26 ou superior, o sistema impõe restrições ao uso ou criação de serviços em segundo plano, a menos que o próprio aplicativo esteja em primeiro plano.
Se um aplicativo precisar criar um serviço em primeiro plano, ele deverá chamar
startForegroundService()
. Esse método cria um serviço em segundo plano, mas o método sinaliza ao sistema que o serviço se promoverá em primeiro plano.Após a criação do serviço, ele deve chamar seu
startForeground() method within five seconds.
fonte
startForegroundService
métodoNo meu caso, era totalmente diferente, pois eu não estava tendo atividade para lançar o serviço no Oreo.
Abaixo estão as etapas que eu usei para resolver esse problema de serviço em primeiro plano -
E depois disso, para iniciar esse serviço, eu acionei abaixo do cmd -
shell adb -s "+ serial_id +" sou startforegroundservice -n com.test.socket.sample / .SocketService
Portanto, isso me ajuda a iniciar o serviço sem atividade nos dispositivos Oreo :)
fonte
A solução @mikebertiean quase fez o truque, mas eu tive esse problema com um toque adicional - eu uso o sistema Gingerbread e não queria adicionar um pacote extra apenas para executar a notificação. Finalmente encontrei: https://android.googlesource.com/platform/frameworks/support.git+/f9fd97499795cd47473f0344e00db9c9837eea36/v4/gingerbread/android/support/v4/app/NotificationCompatGingerbread.java
então eu acertei um problema adicional - a notificação simplesmente mata meu aplicativo quando ele é executado (como resolver esse problema: Android: como evitar que o clique em uma Notificação chame onCreate () ), portanto, no total, meu código no serviço se parece com isso (C # / Xamarin):
fonte