Pergunta

Se eu registrar um receptor de transmissão, digamos em minha atividade assim,

@Override
protected void onResume() {
    super.onResume();

    myReceiver = new BroadcastReceiver() { ... };
    IntentFilter filter = new IntentFilter("com.example.MY_ACTION");
    registerReceiver(myReceiver, filter);
}

Este receptor é exportado?se outro aplicativo transmitir com.example.MY_ACTION, será recebido por myReceiver?

Se for, presumo que preciso usar a forma de registerReceiver() que aceita uma permissão de string e, em seguida, defina essa permissão em meu manifesto, dando-lhe um alto nível de proteção (como assinatura).Isso está correto?Existe uma maneira mais simples?

Obrigado.

Foi útil?

Solução

Nos documentos da API na API BroadcastReceiver:

Se você não precisar enviar transmissões entre aplicativos, considere usar esta classe com LocalBroadcastManager em vez das instalações mais gerais descritas abaixo.Isso lhe dará muito mais implementação eficiente (sem necessidade de comunicação entre processos) e permitem que você evite pensar em quaisquer problemas de segurança relacionados a outros aplicativos sendo capazes de receber ou enviar suas transmissões.

Dessa forma, pelo menos você pode manter o receptor apenas dentro da sua aplicação.

Outras dicas

Para poupar o trabalho de outros e para meus próprios fins de arquivamento:Sim, receptores registrados no contexto são exportado por padrão.

Não parece haver muito documentação mas você pode validar isso rapidamente executando um aplicativo separado enviando uma transmissão personalizada.Testei isso nas APIs 16-29, o broadcast será recebido e assim todo pacote poderá ser enviado para o seu receptor (o que pode ser uma falha de segurança).


Para resolver o problema sem usar transmissões locais (deve ser usado sempre que possível) você está no caminho certo ao definir uma permissão personalizada e restringindo transmissões para aplicativos que solicitaram essa permissão.Para completar:

Defina e use uma permissão personalizada no manifesto:

<permission android:name="com.example.bcrtest.BROADCAST_PERMISSION"
    android:protectionLevel="signature"/>
<uses-permission android:name="com.example.bcrtest.BROADCAST_PERMISSION" />

Registre o destinatário com permissão:

registerReceiver(mReceiver, new IntentFilter(MY_INTENT_ACTION), "com.example.bcrtest.BROADCAST_PERMISSION", null );
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top