Как я могу указать специфическую часть схемы в теге данных для фильтрации Intent-Filter?
-
25-09-2019 - |
Вопрос
Я хочу настроить широкообразование, чтобы обрабатывать Package_Reacted, но я только хочу быть уведомлен, когда моя посылка заменена. Он отлично работает, если я указываю тег данных со схеме = «Пакет», но тогда я получаю уведомление, когда любое приложение переустановлено или обновлено. Я не могу выяснить, как я должен указывать имя пакета, которое находится в специфической части схемы - то есть, когда мой широкоструйный корабль получает намерение в Onrecieve (), если я делаю Intent.getData (). GetschemeSpecificpart ), это имя пакета, но есть ли, я могу отфильтровать только то, что в моем намерении фильтра?
Решение
Проще всего будет принимать какие-либо широковещательные намерения с package
Схема, как вы говорите, но сделайте фильтрацию на основе Intent
дополнения, которые отправляются с PACKAGE_*
Действия.
Если имя пакета в Intent
Не соответствует вашему, просто игнорируйте это.
Другие советы
Как использовано в приложении поиска Google:
<intent-filter>
<action android:name="android.intent.action.PACKAGE_REPLACED" />
<data android:scheme="package" android:path="com.google.android.googlequicksearchbox" />
</intent-filter>
Но согласно моим грубым тестам, это все еще может уловить любой обновленный пакет, который делает часть «Android: Path» на самом деле бесполезной.
Для Android 3.1+ вы можете использовать это новое действие, чтобы ответить только тогда, когда ваш пакет обновляется:
<intent-filter>
<action android:name="android.intent.action.MY_PACKAGE_REPLACED" />
</intent-filter>
Если вам придется поддержать обратно на Android 2.x, лучшая практика - объявить 2 отдельных приемника для PACKAGE_REPLACED
а также MY_PACKAGE_REPLACED
. Отказ Затем после первого запуска проверяйте версию Runtime Android и отключите старую, если версия 3.1+.