Sempre que minha transmissão é executada, quero mostrar um alerta para a atividade em primeiro plano.
android
android-activity
Deepali
fonte
fonte
Respostas:
Sabendo que o ActivityManager gerencia o Activity , podemos obter informações do ActivityManager . Temos o primeiro plano atual executando Activity por
ATUALIZAÇÃO 03/03/10
getRunningTasks () está DEPRECADO. veja as soluções abaixo.
Este método foi descontinuado no nível 21. da API. No Build.VERSION_CODES.LOLLIPOP, esse método não está mais disponível para aplicativos de terceiros: a introdução de recentes centrados em documentos significa que pode vazar informações pessoais para o chamador. Para compatibilidade com versões anteriores, ele ainda retornará um pequeno subconjunto de dados: pelo menos as próprias tarefas do chamador e, possivelmente, algumas outras tarefas, como a casa, que sabidamente não são sensíveis.
fonte
( Nota: Uma API oficial foi adicionada na API 14: consulte esta resposta https://stackoverflow.com/a/29786451/119733 )
NÃO USE resposta anterior (waqas716).
Você terá um problema de vazamento de memória, devido à referência estática da atividade. Para mais detalhes, consulte o link a seguir http://android-developers.blogspot.fr/2009/01/avoiding-memory-leaks.html
Para evitar isso, você deve gerenciar referências de atividades. Adicione o nome do aplicativo no arquivo de manifesto:
Sua classe de aplicativo:
Crie uma nova atividade:
Portanto, agora, em vez de estender a classe Activity para suas atividades, apenas estenda MyBaseActivity. Agora, você pode obter sua atividade atual a partir do aplicativo ou do contexto de atividades assim:
fonte
WeakReferences
no Android o GC os coleta mais rapidamente do que você imagina.WeakReference
não é recomendado para armazenamento em cache, isso não é armazenamento em cache, ou seja,mCurrentActivity
ele só terá uma referência quando estiver vivo, paraWeakReference
que nunca seja coletado enquantoActivity
estiver no topo. No entanto, o que o @NachoColoma sugere está errado, porqueWeakReference
ainda pode fazer referência a uma atividade não retomada (não está ativa / não está no topo) se a variável não for limpa!Application .ActivityLifecycleCallbacks
, o que seria mais central e você não precisaria adicionar nenhum código de gerenciamento em todas as suas atividades. Consulte também developer.android.com/reference/android/app/…Expiro na parte superior da resposta de @ gezdy.
Em todas as atividades, em vez de ter que "se registrar" com
Application
a codificação manual, podemos usar a seguinte API desde o nível 14, para nos ajudar a alcançar um objetivo semelhante com menos codificação manual.http://developer.android.com/reference/android/app/Application.html#registerActivityLifecycleCallbacks%28android.app.Application.ActivityLifecycleCallbacks%29
Em
Application.ActivityLifecycleCallbacks
, você pode obter o queActivity
está "anexado" ou "desanexado" a esteApplication
.No entanto, essa técnica está disponível apenas desde o nível 14 da API.
fonte
implements Application.ActivityLifecycleCallbacks
e adiciona os métodos para implementá-lo. Então, no construtor dessa classe (ou onCreate ou init ou outro método que é executado quando a instância está se tornando ativa / pronta), coloquegetApplication().registerActivityLifecycleCallbacks(this);
como a última linha.Atualização 2 : há uma API oficial adicionada para isso, use ActivityLifecycleCallbacks .
ATUALIZAR:
Como apontado por @gezdy, e sou grato por isso. configure a referência como null também para a atividade atual, em vez de atualizar apenas todos os onResume, defina-os como nulos em cada atividade do onDestroy para evitar problemas de vazamento de memória.
Há um tempo atrás, eu precisava da mesma funcionalidade e aqui está o método como consegui isso. Em todas as suas atividades, substitua esses métodos do ciclo de vida.
Agora, na sua aula de transmissão, você pode acessar a atividade atual para mostrar um alerta nela.
fonte
Application
é criado apenas uma vez e nunca o lixo é coletado exatamente como uma variável estática.clearReferences()
que(this.equals(currActivity))
.@lockwobr Obrigado por atualização
Ter acesso à corrente
Activity
é muito útil. Não seria bom ter uma estáticagetActivity
método retornando a atividade atual sem perguntas desnecessárias?A
Activity
turma é muito útil. Ele fornece acesso ao thread da interface do usuário do aplicativo, visualizações, recursos e muito mais. Inúmeros métodos requerem umContext
, mas como obter o ponteiro? Aqui estão algumas maneiras:ActivityThread
. Esta classe tem acesso a todas as atividades e, o que é ainda melhor, possui um método estático para obter a atualizaçãoActivityThread
. Há apenas um pequeno problema - a lista de atividades tem acesso ao pacote.Fácil de resolver usando reflexão:
Esse método pode ser usado em qualquer lugar do aplicativo e é muito mais conveniente do que todas as abordagens mencionadas. Além disso, parece que não é tão inseguro quanto parece. Ele não apresenta nenhum novo vazamento em potencial ou ponteiros nulos.
O trecho de código acima não possui tratamento de exceção e assume ingenuamente que a primeira atividade em execução é a que estamos procurando. Você pode querer adicionar algumas verificações adicionais.
Postagem no blog
fonte
Map
interfaceHashMap
ouArrayMap
. Eu editei a resposta @AZ_.Eu fiz o seguinte em Kotlin
Edite a classe de aplicativo da seguinte maneira
Crie a classe ActivityLifecycleCallbacks
agora você pode usá-lo em qualquer classe chamando o seguinte:
FTApplication.currentActivity()
fonte
getCurrentActivity () também está em ReactContextBaseJavaModule.
(Como a pergunta foi feita inicialmente, muitos aplicativos Android também possuem o componente ReactNative - aplicativo híbrido.)
A classe ReactContext em ReactNative possui todo o conjunto de lógicas para manter mCurrentActivity retornado em getCurrentActivity ().
Nota: Desejo que getCurrentActivity () seja implementado na classe Aplicativo Android.
fonte
Não consegui encontrar uma solução com a qual nossa equipe ficasse feliz, então criamos a nossa. Usamos
ActivityLifecycleCallbacks
para acompanhar a atividade atual e, em seguida, expô-la através de um serviço. Mais detalhes aqui: https://stackoverflow.com/a/38650587/10793fonte
Para compatibilidade com versões anteriores:
fonte
WeakReference
controlado por umaApplication
classe - enquanto issoComponentName
é necessário para determinar se o desejadoActivity
está no topo da lista de tarefas em execução. E se isso não responder totalmente à pergunta, a resposta aceita também não.topActivity
está disponível apenas no Android QPessoalmente, fiz o que "Cheok Yan Cheng" disse, mas usei uma "Lista" para ter um "Backstack" de todas as minhas atividades.
Crie um aplicativo que estenda "Aplicativo" e faça o seguinte:
No meu caso, usei "Application.ActivityLifecycleCallbacks" para:
Vincular / desvincular a instância Merlin (usada para obter um evento quando o aplicativo perde ou obtém conexão, por exemplo, quando você fecha os dados móveis ou quando os abre). É útil depois que a ação de intenção "OnConnectivityChanged" foi desativada. Para mais informações sobre MERLIN, consulte: MERLIN INFO LINK
Feche minha última instância de região quando o aplicativo for fechado; Vou iniciá-lo dentro de uma BaseActivity que é estendida a todas as outras atividades e que possui uma instância RealmHelper privada. Para mais informações sobre o REALM, consulte: REALM INFO LINK Por exemplo, eu tenho uma instância estática "RealmHelper" dentro da minha classe "RealmHelper", instanciada no meu aplicativo "onCreate". Eu tenho um serviço de sincronização no qual crio o novo "RealmHelper" porque o Realm é "Thread-Linked" e uma Instância de Realm não pode funcionar dentro de um Thread diferente. Portanto, para seguir a Documentação de Região "Você precisa fechar todas as instâncias de região abertas para evitar vazamentos de recursos do sistema", para fazer isso, usei o "Application.ActivityLifecycleCallbacks" como você pode ver acima.
Finalmente, tenho um receptor que é acionado quando eu terminar de sincronizar meu aplicativo e, quando terminar a sincronização, ele chamará o método "IEndSyncCallback" "onEndSync" no qual procuro se tenho uma Classe de Atividade específica na minha Lista de ActivitiesBackStack porque preciso para atualizar os dados na exibição, se a sincronização os atualizou e eu precisar executar outras operações após a sincronização do aplicativo.
Isso é tudo, espero que isso seja útil. Vejo você :)
fonte
A resposta por waqas716 é boa. Criei uma solução alternativa para um caso específico que exige menos código e manutenção.
Encontrei uma solução específica ao fazer com que um método estático busque uma visualização da atividade que suspeito estar em primeiro plano. Você pode percorrer todas as atividades e verificar se deseja ou obter o nome da atividade na resposta de martin
Verifico se a visualização não é nula e obtém o contexto via getContext ().
fonte
getRunningTasks
:"Note: this method is only intended for debugging and presenting task management user interfaces. This should never be used for core logic in an application, ..."
em developer.android.com/reference/android/app/...Não gosto de nenhuma das outras respostas. O ActivityManager não deve ser usado para obter a atividade atual. Super classificar e, dependendo do onDestroy, também é frágil e não é o melhor design.
Honestamente, o melhor que eu criei até agora é apenas manter uma enumeração no meu Aplicativo, que é definida quando uma atividade é criada.
Outra recomendação pode ser evitar o uso de várias atividades, se possível. Isso pode ser feito com o uso de fragmentos ou nas visualizações personalizadas de minha preferência.
fonte
Uma solução bastante simples é criar uma classe de gerenciador singleton, na qual você pode armazenar uma referência a uma ou mais atividades ou qualquer outra coisa à qual deseja acessar em todo o aplicativo.
Ligar
UberManager.getInstance().setMainActivity( activity );
para o onCreate da atividade principal.Ligue para
UberManager.getInstance().getMainActivity();
qualquer lugar do seu aplicativo para recuperá-lo. (Estou usando isso para poder usar o Toast a partir de um thread que não seja da interface do usuário.)Adicione uma chamada para
UberManager.getInstance().cleanup();
quando seu aplicativo estiver sendo destruído.fonte
Estou com 3 anos de atraso, mas responderei de qualquer maneira, caso alguém encontre isso como eu.
Eu resolvi isso simplesmente usando isso:
Observe que "getIntent (). ToString ()" inclui vários outros textos, como o nome do seu pacote e quaisquer filtros de intenção para sua atividade. Tecnicamente, estamos verificando a intenção atual, não a atividade, mas o resultado é o mesmo. Basta usar, por exemplo, Log.d ("test", getIntent (). ToString ()); se você quiser ver todo o texto. Essa solução é um pouco hacky, mas é muito mais limpa no seu código e a funcionalidade é a mesma.
fonte