O que é uma transmissão fixa?

89

Eu encontrei esse termo na documentação do Android com a definição que o acompanha

Esses são broadcasts cujos dados são mantidos pelo sistema após serem concluídos, para que os clientes possam recuperar rapidamente esses dados sem ter que esperar pelo próximo broadcast.

O que isso significa? Alguém pode elaborar seu uso com um exemplo particular? Acredito que devemos solicitar permissão para usar esta intenção Por quê então?

<uses-permission android:name="android.permission.BROADCAST_STICKY"/> - Allows an application to broadcast sticky intents.
Shouvik
fonte
3
08 / fevereiro / 2019, para quem está procurando uma transmissão Sticky broadcasts should not be used. They provide no security (anyone can access them), no protection (anyone can modify them), and many other problems. The recommended pattern is to use a non-sticky broadcast to report that something has changed, with another mechanism for apps to retrieve the current value whenever desired.
fixa

Respostas:

110

Se uma atividade ligar onPausecom uma transmissão normal, a recepção da transmissão pode ser perdida. Uma transmissão persistente pode ser verificada após ter sido iniciada em onResume.

Atualização 23/06/2020

As transmissões fixas estão obsoletas.

Veja a sendStickyBroadcastdocumentação .

Este método foi descontinuado na API de nível 21.

Transmissões fixas não devem ser usadas. Eles não fornecem segurança (qualquer pessoa pode acessá-los), nenhuma proteção (qualquer pessoa pode modificá-los) e muitos outros problemas. O padrão recomendado é usar uma transmissão não aderente para relatar que algo mudou, com outro mecanismo para os aplicativos recuperarem o valor atual sempre que desejado.

Implemento

Intent intent = new Intent("some.custom.action");
intent.putExtra("some_boolean", true);
sendStickyBroadcast(intent);

Recursos

Paul Burke
fonte
Olá, estou a ficar confuso com transmissão fixa com o registo estático da transmissão. Acabei de ler em algum lugar que a diferença entre registrar uma transmissão no arquivo de manifesto e registrar programaticamente é apenas que o outro não cancela o registro da transmissão, mas permanece lá, enquanto o último cancela o registro da transmissão no método onPause ().
Shaista Naaz
Nota: na maioria dos casos, transmissões fixas devem ser evitadas. Veja o link na resposta de @Nikhil_Katre para mais informações
gMale
@Shaista: os receptores de manifesto operam mesmo quando seu aplicativo está inativo, enquanto um receptor programático só responde quando o aplicativo no qual está registrado está em execução
gMale
@gmale Então, se estamos em atividade e estamos em onPause () e chamamos unregisterReceiver () .. Obteremos a transmissão quando voltarmos em onResume ()
Kushal
1
@PaulBurke Não encontrei o nome Mark Murphy no link fornecido acima. Este link me redireciona para a pergunta não sobre a resposta exata. Você pode atualizar o URL ?.
Vishal Chhodwani
11

sendStickyBroadcast()executa um sendBroadcast(Intent)conhecido como pegajoso, ou seja, o Intent que você está enviando permanece após a conclusão da transmissão, para que outros possam recuperar rapidamente esses dados por meio do valor de retorno de registerReceiver(BroadcastReceiver, IntentFilter). Em todas as outras formas, ele se comporta da mesma forma que sendBroadcast(Intent). Um exemplo de transmissão persistente enviada por meio do sistema operacional é ACTION_BATTERY_CHANGED. Quando você chama registerReceiver()essa ação - mesmo com um nulo BroadcastReceiver- você obtém o intent que foi transmitido pela última vez para essa ação. Portanto, você pode usar isso para encontrar o estado da bateria sem necessariamente registrar todas as mudanças futuras de estado da bateria.

Narendra Motwani
fonte
8

O valor de uma transmissão permanente é o valor que foi transmitido pela última vez e atualmente é mantido no cache permanente. Este não é o valor de uma transmissão que foi recebida agora. Suponho que você possa dizer que é como um cookie do navegador que você pode acessar a qualquer momento. A transmissão persistente agora está obsoleta, de acordo com os documentos para métodos de transmissão fixa ( por exemplo ):

Este método foi descontinuado na API nível 21. Broadcasts aderentes não devem ser usados. Eles não fornecem segurança (qualquer pessoa pode acessá-los), nenhuma proteção (qualquer pessoa pode modificá-los) e muitos outros problemas. O padrão recomendado é usar uma transmissão não aderente para relatar que algo mudou, com outro mecanismo para os aplicativos recuperarem o valor atual sempre que desejado.

Lou Morda
fonte
3

Um Intent de transmissão normal não está mais disponível após ser enviado e processado pelo sistema. Se você usar o método sendStickyBroadcast (Intent), o Intent ficará fixo, o que significa que o Intent que você está enviando permanece após a conclusão da transmissão.

você se refere ao meu blog: insira a descrição do link aqui

Arul Pandian
fonte
1
Eu adicionei a divulgação obrigatória de sua autoria do blog para o qual você está criando um link. Você deve fazer isso sozinho a partir de agora, ou suas postagens estarão sujeitas a serem excluídas como spam.
Andrew Barber,