Existe alguma maneira simples de determinar se uma determinada atividade está ativa ou não? Quero fazer certas coisas, dependendo de qual atividade está ativa. por exemplo:
if(activityrunning == activity1)
//do this
else if (activityrunning == activity2)
//do something else
android
android-activity
user560571
fonte
fonte
Respostas:
Você pode usar uma
static
variável dentro da atividade.O único problema é que, se você usá-lo em duas atividades que se vinculam,
onStop
o primeiro é chamado às vezesonStart
no segundo. Então, ambos podem ser verdadeiros brevemente.Dependendo do que você está tentando fazer (atualize a atividade atual de um serviço?). Você pode simplesmente registrar um ouvinte estático no serviço no seu
onStart
método de atividade e , em seguida, o ouvinte correto estará disponível quando seu serviço desejar atualizar a interface do usuário.fonte
MyActivity
comMyChildactivity
e quiser verificar se a criança está ativa?Sei que esse problema é bastante antigo, mas acho que ainda vale a pena compartilhar minha solução, pois pode ser útil para outras pessoas.
Esta solução não estava disponível antes do lançamento do Android Architecture Components.
A atividade é pelo menos parcialmente visível
A atividade está em primeiro plano
fonte
Eu acho mais claro assim:
fonte
Uma opção sem usar nenhuma variável auxiliar é:
onde a atividade é fe: this ou getActivity ().
O valor retornado por essa expressão muda em onStart () / onStop (), que são os eventos que iniciam / param de mostrar o layout da atividade no telefone.
fonte
Activity#getWindow().getDecorView().isShown()
?Usei o método MyActivity.class e getCanonicalName e obtive resposta.
fonte
getRunningTasks()
lo, pois foi reprovado: androidxref.com/9.0.0_r3/xref/frameworks/base/core/java/android/…Maneira muito melhor do que usar uma variável estática e seguir o POO
Shared Preferences
pode ser usado para compartilhar variáveis com outrosactivities
e serviços de umapplication
Use preferências compartilhadas. Ele possui as informações mais confiáveis do estado, menos problemas de troca / destruição de aplicativos, economiza a solicitação de mais uma permissão e nos dá mais controle para decidir quando nossa atividade é realmente a mais alta. veja detalhes aqui abd aqui também
fonte
onStop()
Este é um código para verificar se um serviço específico está sendo executado. Tenho certeza de que ele pode funcionar para uma atividade também desde que você altere getRunningServices com getRunningAppProcesses () ou getRunningTasks (). Dê uma olhada aqui http://developer.android.com/reference/android/app/ActivityManager.html#getRunningAppProcesses ()
Altere Constants.PACKAGE e Constants.BACKGROUND_SERVICE_CLASS de acordo
fonte
Existe uma maneira muito mais fácil do que tudo acima e essa abordagem não requer o uso do
android.permission.GET_TASKS
manifesto, ou tem o problema de condições de corrida ou vazamento de memória apontado na resposta aceita.Faça uma variável estática na atividade principal. Estático permite que outras atividades recebam os dados de outra atividade.
onPause()
definir esta variável falsa ,onResume
eonCreate()
definir esta variável verdadeira .Atribua getters e setters dessa variável.
E depois de outra atividade ou serviço
fonte
Dos documentos oficiais:
Atividade # isFinishing ()
Atividade # isDestroyed ()
fonte
obrigado kkudi! Consegui adaptar sua resposta para trabalhar em uma atividade ... eis o que funcionou no meu aplicativo ..
este exemplo fornecerá um valor verdadeiro ou falso se topActivity corresponder ao que o usuário está fazendo. Portanto, se a atividade que você está verificando não está sendo exibida (ou seja, está na Pausa), você não terá uma correspondência. Além disso, para fazer isso, você precisa adicionar a permissão ao seu manifesto.
Eu espero que isso tenha sido útil!
fonte
Eu acho que a resposta aceita é uma maneira terrível de lidar com isso.
Não sei qual é o caso de uso, mas considere um método protegido na classe base
e substitua-o na classe derivada.
Quando o evento ocorrer, basta chamar esse método na classe base. A classe 'ativa' correta irá lidar com isso então. A própria classe pode então verificar se não está
Paused()
.Melhor ainda, use um barramento de eventos como o GreenRobot , o Square , mas esse está obsoleto e sugere o uso do RxJava
fonte
Eu usei um cheque
if (!a.isFinishing())
e parece fazer o que eu preciso.a
é a instância da atividade. Isso está incorreto? Por que ninguém tentou isso?fonte
A respeito
activity.isFinishing()
fonte
ActivityLifecycleCallbacks é uma ótima maneira de acompanhar todas as atividades no App:
ActivityState:
Estenda a classe Application e forneça sua referência no arquivo Android Manifest:
Verifique em qualquer lugar da Atividade o status de outra atividade:
https://developer.android.com/reference/android/app/Application.ActivityLifecycleCallbacks.html
fonte
Não tenho certeza se é uma maneira "adequada" de "fazer as coisas".
Se não há nenhuma maneira API para resolver o (ou a) pergunta que você deve pensar um pouco, talvez você está fazendo algo errado e leia mais docs vez etc.
(Como eu entendi variáveis estáticas é uma forma comumente errado no android. De causa poderia funcionar, mas definitivamente haverá casos em que não funcionará [por exemplo, na produção, em milhões de dispositivos]).
Exatamente no seu caso, sugiro pensar por que você precisa saber se outra atividade está viva? ... você pode iniciar outra atividade para obter a funcionalidade. Ou você pode derivar a classe para obter sua funcionalidade e assim por diante.
Cumprimentos.
fonte
Se você estiver interessado no estado do ciclo de vida da instância específica da atividade, a solução siliconeagle parece correta, exceto que a nova variável "ativa" deve ser uma variável de instância, e não estática.
fonte
Use uma transmissão ordenada. Consulte http://android-developers.blogspot.nl/2011/01/processing-ordered-broadcasts.html
Em sua atividade, registre um receptor no onStart, cancele o registro no onStop. Agora, quando, por exemplo, um serviço precisar lidar com algo que a atividade possa executar melhor, envie uma transmissão ordenada a partir do serviço (com um manipulador padrão no próprio serviço). Agora você pode responder na atividade quando ela estiver em execução. O serviço pode verificar os dados do resultado para ver se a transmissão foi manipulada e se não tomar as medidas apropriadas.
fonte
Além da resposta aceita , se você tiver várias instâncias da atividade, poderá usar um contador:
fonte
Você tentou..
fonte
Foi encontrada uma solução fácil com o seguinte código
fonte
Use a variável isActivity para verificar se a atividade está ativa ou não.
Então verifique
fonte
Se você quiser verificar se a atividade está na pilha de trás, siga as próximas etapas. 1. Declarou um ArrayList na sua classe Application [A classe Application é definida no seu arquivo principal na tag do aplicativo]
E adicione os seguintes métodos públicos para acessar e modificar esta lista.
Na BaseActivity, onde todas as atividades a estendem, substitua os métodos onCreate e onDestroy para que você possa adicionar e remover atividades da pilha traseira como a seguir.
Por fim, se você deseja verificar se a atividade está na pilha de trás ou não, basta chamar esta função comoActivityInBackStack.
Ex: desejo verificar se o HomeActivity está na pilha de trás ou não:
fonte
fonte
Este trabalho se você não tiver a mesma atividade em primeiro plano. Se você abrir a partir da notificação, não funcione, fiz alguns ajustes e viemos com isso:
Isso funciona para mim com várias atividades abertas ao mesmo tempo.
fonte