2012-06-04 2 views
9

У меня есть вещательный приемник, зарегистрированный в манифесте:PACKAGE_ADDED BroadcastReceiver не работает

<application ...> 
    <receiver android:name="com.some.pkg.NewAppReceiver" > 
     <intent-filter> 
      <action android:name="android.intent.action.PACKAGE_ADDED" /> 
     </intent-filter> 
    </receiver> 
</appcication> 

И приемник:

public class NewAppReceiver extends BroadcastReceiver { 

    private static final String TAG = "NewAppReceiver"; 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     Log.d(TAG, "Intent: " + intent.getAction()); 
    } 
} 

И ничего не получил, когда я устанавливаю APK вручную или с Android Market. Зачем?

ответ

22

Вы запустили приложение, которое содержит этот широковещательный приемник, перед установкой других приложений?

Начиная с некоторой версии API, broadcastReceivers не будут работать, пока вы не выполните приложение. Поместите действие и выполните его.

Кроме того, не забудьте добавить следующее в BroadcastReceiver:

<data android:scheme="package" /> 

EDIT: На Android 8 и выше, если ваши цели приложений API 27 или больше, он будет работать частично, поэтому вам нужно зарегистрироваться на эти события в коде, а не в манифесте. Вот список намерений, которые по-прежнему безопасны в манифесте: https://developer.android.com/guide/components/broadcast-exceptions.html.

Остальное должно использоваться в коде. Больше информации here

+3

Спасибо, добавил в фильтр намерений, и он работает! – arts777

+0

рад, что это вам помогло. –

+0

@android разработчик, спасибо, но проблема остается с PACKAGE_REMOVED при удалении приложения в представлении DDMS. У вас есть какие-либо предложения – ArK

5

Вы пытаетесь получить намерение в приложении, которое вы устанавливаете? The documentation for ACTION_PACKAGE_ADDED говорит:

Обратите внимание, что недавно установленный пакет не получает эту трансляцию.

Другая возможность заключается в том, что это намерение не может быть доставлено компонентам, зарегистрированным через манифест, но только вручную (как описано в an answer by Mark Murphy to Stack Overflow question Can't receive broadcasts for PACKAGE intents).

+0

Приложение с приемником запускается, когда я пытаюсь получить это намерение. – arts777

+0

Это важный момент для большинства ошибок. Благодарю. – trante

8

С android.intent.action.PACKAGE_ADDED является системным намерением (обратите внимание, что ваше собственное приложение не получит его при его установке), ваш BroadcastReceiver получит сообщения из источников за пределами вашего приложения. Таким образом, проверьте Вы не поставили: андроида: экспортироваться = "ложь"

Вы также можете добавить:

<data android:scheme="package" /> 

Итак, ваш BroadcastReceiver в вашем AndroidManifest.xml должен выглядеть следующим образом:

<application ...> 
    <receiver android:name=".NewAppReceiver" android:exported="true"> 
     <intent-filter> 
      <action android:name="android.intent.action.PACKAGE_ADDED" /> 
      <data android:scheme="package" /> 
     </intent-filter> 
    </receiver> 
</appcication> 

Если он все еще не работает, вы можете попытаться поставить более высокий приоритет, такие как: андроида: приоритет = «1000»

Взгляните: http://developer.android.com/guide/topics/manifest/receiver-element.html

+0

Как указано в документах, максимальный приоритет может быть 999 https://developer.android.com/guide/topics/manifest/intent-filter-element.html – Sagar

+0

По какой-то причине он по-прежнему не работает для меня. У меня есть несколько действий в моем целевом фильтре. Среди которых PACKAGE_FULLY_REMOVED корректно запускает onCreate моего получателя, однако PACKAGE_ADDED просто нет. Мое приложение уже находится в рабочем состоянии, я экспортировал = «true» для получателя, у меня максимальный приоритет установлен как 999, и я включил в соответствии с вашим предложением. Я что-то упустил? – Sagar

0

Если вы пытаетесь получить какой-то другой пакет он должен был быть осуществлен.

(Как отметил @Savvas) Если вы попытаетесь получить дополнение своего собственного пакета, вы не сможете его получить.Даже если ваш широковещательный приемник имеет action.PACKAGE_ADDED, метод приемника onReceiveisn't triggered.

В этом случае наилучшим вариантом является сохранение этих данных. Используя sharedPreferences, добавьте ключ что-то вроде «appIsWorkedBefore», а в методе onCreate вашего запуска запускается эта переменная как «истина». И вы можете делать свои работы в отношении этого булева.