Gostaria de saber qual é a melhor prática / maneira de registrar programaticamente um receptor de transmissão. Quero registrar receptores específicos de acordo com a escolha do usuário.
Como o registro é feito através do arquivo de manifesto, estou pensando se existe uma maneira adequada de conseguir isso no código.
android
broadcastreceiver
CoolStraw
fonte
fonte
Respostas:
Parece que você deseja controlar se os componentes publicados em seu manifesto estão ativos, e não registram dinamicamente um receptor (via Context.registerReceiver ()) durante a execução.
Nesse caso, você pode usar PackageManager.setComponentEnabledSetting () para controlar se esses componentes estão ativos:
http://developer.android.com/reference/android/content/pm/PackageManager.html#setComponentEnabledSetting(android.content.ComponentName, int, int)
Observe que se você estiver interessado apenas em receber uma transmissão enquanto estiver executando, é melhor usar o registerReceiver (). Um componente receptor é útil principalmente para quando você precisa garantir que seu aplicativo seja iniciado toda vez que a transmissão for enviada.
fonte
No seu
onCreate
método, você pode registrar um receptor como este:Lembre-se de executar isso no
onDestroy
método:fonte
onDestroy()
isso será chamado, criando um possível vazamento de memória. É melhor registrar / cancelar o registro emonStart()
/onStop()
.Um ponto importante que as pessoas esquecem de mencionar é o tempo de vida do
Broadcast Receiver
. A diferença de registrá-lo programaticamente de registrar no AndroidManifest.xml é essa. No arquivo de manifesto, não depende do tempo de vida do aplicativo. Enquanto que, ao registrá-lo programaticamente, depende do tempo de vida do aplicativo. Isso significa que, se você se registrar no AndroidManifest.xml , poderá capturar as intenções transmitidas, mesmo quando o aplicativo não estiver em execução.Editar: a nota mencionada não é mais verdadeira a partir do Android 3.1, o sistema Android exclui todos os destinatários de receber intenções por padrão se o aplicativo correspondente nunca tiver sido iniciado pelo usuário ou se o usuário interrompeu explicitamente o aplicativo através do menu Android (em Gerenciar → Aplicativo). https://developer.android.com/about/versions/android-3.1.html
Esse é um recurso de segurança adicional, pois o usuário pode ter certeza de que apenas os aplicativos que ele iniciou receberão intenções de transmissão.
Portanto, pode ser entendido que os receptores registrados programaticamente nos aplicativos
onCreate()
teriam o mesmo efeito com os declarados no AndroidManifest.xml do Android 3.1 acima.fonte
Defina um receptor de transmissão em qualquer lugar em Atividade / Fragmento como este:
Definir IntentFilter em
onCreate()
Agora registre o BroadcastReciever em
onResume()
e cancele o registro emonPause()
[porque não há uso de broadcast se a atividade estiver em pausa].Para um tutorial detalhado, dê uma olhada no receptor de transmissão - duas maneiras de implementar .
fonte
fonte
De acordo com a escuta e a transmissão de mensagens globais e a configuração de alarmes em tarefas comuns e como executá-las no Android :
Dê uma olhada no registerReceiver (receptor BroadcastReceiver, filtro IntentFilter) para obter mais informações.
fonte
context.registerReceiver
mas não está sendo chamado, você pode olhar para esta questão stackoverflow.com/questions/13238600/…É uma prática recomendada sempre fornecer a permissão ao registrar o receptor, caso contrário você receberá qualquer aplicativo que envie uma intenção correspondente. Isso pode permitir que aplicativos maliciosos sejam transmitidos para o seu receptor.
fonte
para LocalBroadcastManager
e registre-se
onResume
e cancele o registro
onStop
e receba ..
onde IntentFilter é
fonte
Duas escolhas
registerReceiver(...
) dentroonStart()
eunregisterReceiver(...)
dentroonStop()
registerReceiver(...)
dentroonCreate(...)
eunregisterReceiver(...)
dentroonDestroy()
Bônus:
Se você não deseja escrever um código padrão para registrar e cancelar o registro de um BroadcastReceiver repetidamente em cada Atividade,
Aqui está o trecho de código:
Veja o código completo:
AQUI
fonte
Crie um receptor de transmissão
[BroadcastReceiver (Ativado = true, Exportado = false)]
Da sua atividade, adicione este código:
fonte