Como posso especificar a peça específica do esquema em uma tag de dados para um filtro de intenção?
-
25-09-2019 - |
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?
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+.