Desejo ter um aplicativo que seja executado em segundo plano, que saiba quando qualquer um dos aplicativos integrados (mensagens, contatos, etc) está em execução.
Então, minhas perguntas são:
Como devo executar meu aplicativo em segundo plano.
Como meu aplicativo em segundo plano pode saber o que é o aplicativo atualmente em execução em primeiro plano.
As respostas de pessoas com experiência seriam muito apreciadas.
Respostas:
Com relação a "2. Como meu aplicativo em segundo plano pode saber o que é o aplicativo atualmente em execução em primeiro plano."
NÃO use o
getRunningAppProcesses()
método, pois isso retorna todos os tipos de lixo de sistema da minha experiência e você obterá vários resultadosRunningAppProcessInfo.IMPORTANCE_FOREGROUND
. Use aogetRunningTasks()
invésEste é o código que uso em meu serviço para identificar o aplicativo de primeiro plano atual, é realmente fácil:
É isso, então você pode acessar facilmente os detalhes do aplicativo / atividade em primeiro plano:
Isso requer uma permissão adicional em manifesto de atividade e funciona perfeitamente.
fonte
getRunningTasks()
está obsoleto na API 21 (Lollipop) - developer.android.com/reference/android/app/…Tive que descobrir a solução certa da maneira mais difícil. o código abaixo é parte do cyanogenmod7 (os ajustes do tablet) e é testado no Android 2.3.3 / gingerbread.
métodos:
espero que isso responda a este problema em todas as extensões (:
fonte
mActivityManager.getRunningTasks(1).get(0).topActivity
?Experimente o seguinte código:
O nome do processo é o nome do pacote do aplicativo em execução em primeiro plano. Compare-o com o nome do pacote do seu aplicativo. Se for o mesmo, seu aplicativo está sendo executado em primeiro plano.
Espero que isso responda sua pergunta.
fonte
De pirulito em diante, isso mudou. Encontre o código abaixo, antes que o usuário acesse Configurações -> Segurança -> (Role para baixo até o último) Aplicativos com acesso de uso -> Conceda as permissões para nosso aplicativo
fonte
Para casos em que precisamos verificar em nosso próprio serviço / thread de segundo plano se nosso aplicativo está em primeiro plano ou não. É assim que eu implementei, e funciona bem para mim:
Agora, para verificar em outras classes, se o aplicativo está em primeiro plano ou não, basta chamar:
Atualização (conforme apontado por SHS ):
Não se esqueça de se registrar para os callbacks no
onCreate
método de sua classe de aplicativo .fonte
Para determinar o aplicativo de primeiro plano, você pode usar para detectar o aplicativo de primeiro plano, você pode usar https://github.com/ricvalerio/foregroundappchecker . Ele usa métodos diferentes dependendo da versão do Android do dispositivo.
Quanto ao serviço, o repo também fornece o código de que você precisa. Essencialmente, deixe o android studio criar o serviço para você e, em seguida, onCreate adicione o trecho que usa o appChecker. Você precisará solicitar permissão no entanto.
fonte
Levando em consideração que
getRunningTasks()
está obsoleto egetRunningAppProcesses()
não é confiável, tomei a decisão de combinar 2 abordagens mencionadas no StackOverflow:fonte
A classe ActivityManager é a ferramenta apropriada para ver quais processos estão em execução.
Para executar em segundo plano, normalmente você deseja usar um serviço .
fonte
Isso funcionou para mim. Mas fornece apenas o nome do menu principal. Ou seja, se o usuário abriu Configurações -> Bluetooth -> tela Nome do dispositivo, RunningAppProcessInfo o chama apenas de Configurações. Não é capaz de perfurar furthur
fonte
Faça algo assim:
fonte
Em pirulito e para cima:
Adicionar ao festival principal:
E faça algo assim:
fonte
É assim que estou verificando se meu aplicativo está em primeiro plano. Note que estou usando AsyncTask conforme sugerido pelo Android oficial documentação .
`
e execute AsyncTask assim.
new CheckIfForeground().execute();
fonte
Combinei duas soluções em um método e funciona para mim para API 24 e API 21. Outras que não testei.
O código em Kotlin:
e em manifesto
fonte