Как я могу указать конкретную часть схемы в теге данных для фильтра намерений? - PullRequest
1 голос
/ 03 февраля 2010

Я хочу настроить BroadcastReceiver для обработки PACKAGE_REPLACED, но я хочу получать уведомления только при замене моего пакета. Это прекрасно работает, если я укажу тег данных с schema = "package", но затем получаю уведомление, когда какое-либо приложение переустанавливается или обновляется. Я не могу понять, как я должен указать имя пакета, которое входит в специфическую для схемы часть - то есть, когда мой BroadcastReceiver получает намерение в onRecieve (), если я делаю intent.getData (). ), это имя пакета, но есть ли способ, которым я могу фильтровать только это в моем фильтре намерений?

Ответы [ 2 ]

1 голос
/ 24 января 2013

Как используется в Google Search App:

<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. Затем при первом запуске проверьте версию Android во время выполнения и отключите старую версию, если версия 3.1 +.

0 голосов
/ 04 февраля 2010

Проще всего было бы принять любые широковещательные намерения со схемой package, как вы говорите, но выполнять фильтрацию на основе дополнительных данных Intent, которые отправляются с действиями PACKAGE_*.

Если имя пакета в Intent не совпадает с вашим, просто проигнорируйте его.

...