PACKAGE_REMOVED, а затем PACKAGE_ADDED запускаются вместе с PACKAGE_REPLACED Intent Action.

Все, что я пытаюсь сделать, это обновить свой список при каждой установке и удалении, но не при замене пакета. Таким образом, основная проблема заключается в том, что намерения установки и удаления запускаются при каждом действии замены.

Итак, для этого я реализовал BroadcastReciever, как показано ниже.

<receiver android:name =".IntentReceiverTest.AppReciever">
  <intent-filter>
         <action android:name="android.intent.action.PACKAGE_REMOVED"/>
         <action android:name="android.intent.action.PACKAGE_REPLACED"/>
         <action android:name="android.intent.action.PACKAGE_ADDED"/>
         <data android:scheme="package"/> 
  </intent-filter>
</receiver> 

На каждую замену я получаю 3 трансляции с действиями

  • Сначала с PACKAGE_REMOVED, который запускает AppReciever.
  • затем после PACKAGE_ADDED, который снова запускает AppReciever
  • А затем через несколько секунд PACKAGE_REPLACED снова запускает AppReciever.

Поэтому, пожалуйста, предложите лучший способ поймать только действие «Заменить».

Or

способ остановить ранее запущенные Службы из-за действия PACKAGE_REMOVED и PACKAGE_ADDED.


person 100rabh    schedule 07.03.2011    source источник
comment
Я что-то упустил в вашем вопросе, или ответ просто не фильтрует намерения, которые вам не нужны ...?   -  person Blrfl    schedule 07.03.2011
comment
@Blrfl Мне нужны PACKAGE_REMOVED и PACKAGE_ADDED только тогда, когда пакеты на самом деле установлены/удалены, но не когда они заменены. Прочитайте 3-ю строку моего вопроса.   -  person 100rabh    schedule 07.03.2011
comment
Прочитайте 2-ю строку вашего фильтра намерений, затем прочитайте комментарий Бирфл, затем снова прочитайте 2-ю строку вашего фильтра намерений.   -  person pawelzieba    schedule 31.03.2011
comment
@dziobas Если я не улавливаю действие PACKAGE_REPLACED, все, что я получаю, это действие PACKAGE_REMOVED, а затем действие PACKAGE_ADDED каждый раз при замене приложения. Надеюсь, вы поняли вопрос.   -  person 100rabh    schedule 01.04.2011
comment
Убедитесь, что вы правильно сконструировали элемент приемника. Я забыл поместить тег ‹intent-filter› вокруг тегов действия и данных... не было никаких ошибок, просто никаких трансляций   -  person Nick    schedule 23.07.2012


Ответы (1)


Просто проверьте intent.getBooleanExtra(Intent.EXTRA_REPLACING, false):

if (!intent.getAction().equals(Intent.ACTION_PACKAGE_REPLACED) &&
    intent.getBooleanExtra(Intent.EXTRA_REPLACING, false))
    return;
person ChrOnOs    schedule 07.04.2011
comment
Intent.EXTRA_REPLACING всегда добавляется к action.PACKAGE_REMOVED и action_PACKAGE_ADDED при обновлении приложения. При обычной установке и удалении это неверно. - person suku; 06.07.2016
comment
@suku в моем случае EXTRA_REPLACING не существует ни в PACKAGE_REMOVED, ни в PACKAGE_ADDED… Интересно, почему - person Ashraf Alshahawy; 26.06.2018