Como posso especificar a peça específica do esquema em uma tag de dados para um filtro de intenção?

StackOverflow https://stackoverflow.com/questions/2193716

Pergunta

Quero configurar um broadcastreceiver para lidar com o package_replaced, mas só quero ser notificado quando meu pacote for substituído. Funciona bem se eu especificar uma tag de dados com Scheme = "Package", mas sou notificado quando qualquer aplicativo for reinstalado ou atualizado. Não consigo descobrir como devo especificar o nome do pacote que está na parte específica do esquema - ou seja, quando meu BroadCastreceiver obtém a intenção de Onrecieve (), se eu fizer Intent.getData (). ), esse é o nome do pacote, mas existe alguma maneira de filtrar apenas isso no meu filtro de intenção?

Foi útil?

Solução

Mais fácil seria aceitar quaisquer intenções de transmissão com o package esquema como você diz, mas faça a filtragem com base no Intent extras que são enviados com o PACKAGE_* ações.

Se o nome do pacote no Intent Não corresponde ao seu, apenas ignore.

Outras dicas

Conforme usado no aplicativo de pesquisa do Google:

<intent-filter>
  <action android:name="android.intent.action.PACKAGE_REPLACED" /> 
  <data android:scheme="package" android:path="com.google.android.googlequicksearchbox" /> 
</intent-filter>

Mas, de acordo com o meu teste aproximado, isso ainda pode capturar qualquer pacote atualizado, que torna a parte "Android: Path" realmente inútil.

Para o Android 3.1+, você pode usar esta nova ação para responder apenas quando o seu pacote é atualizado:

<intent-filter>
  <action android:name="android.intent.action.MY_PACKAGE_REPLACED" /> 
</intent-filter>

Se você precisar apoiar o Android 2.x, uma prática melhor é declarar 2 receptores separados para PACKAGE_REPLACED e MY_PACKAGE_REPLACED. Depois da primeira execução, verifique a versão do Android de tempo de execução e desative a versão antiga se for 3.1+.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top