2012-06-04 9 views
9

Ho un ricevitore trasmissione registrata in Manifest:PACKAGE_ADDED BroadcastReceiver non funziona

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

E il ricevitore:

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()); 
    } 
} 

E nulla viene ricevuto quando installo APK manualmente o dalla Android Market. Perché?

risposta

22

Hai eseguito l'app che contiene questo broadcastReceiver prima di installare le altre app?

A partire da una versione API, broadcastReceivers non funzionerà finché non si esegue l'app. Metti un'attività e eseguila.

Inoltre, non dimenticare di aggiungere il seguente nella broadcastReceiver:

<data android:scheme="package" /> 

EDIT: Su Android 8 e, soprattutto, se i vostri obiettivi app API 27 o più, funzionerà in parte, quindi devi registrarti a quegli eventi in codice e non in manifest. Ecco una lista di intenti che sono ancora sicuri da usare in manifest: https://developer.android.com/guide/components/broadcast-exceptions.html.

Il resto deve essere utilizzato nel codice. Maggiori informazioni here

+3

Grazie, aggiunto in intent-filter e funziona! – arts777

+0

contento che ti abbia aiutato. –

+0

sviluppatore @android, grazie, ma il problema rimane con PACKAGE_REMOVED durante la rimozione di un'app in visualizzazione DDMS. Hai qualche suggerimento – ArK

5

Stai cercando di ricevere l'intento nell'applicazione che stai installando? The documentation for ACTION_PACKAGE_ADDED dice:

Si noti che il pacchetto appena installato non riceve questa trasmissione.

Un'altra possibilità è che questo scopo potrebbe non essere recapitato ai componenti registrati tramite manifest ma solo manualmente (come descritto in an answer by Mark Murphy to Stack Overflow question Can't receive broadcasts for PACKAGE intents).

+0

L'app con ricevitore viene avviata quando provo a ricevere questo intento – arts777

+0

Questo è un punto importante per la maggior parte degli errori. Grazie. – trante

8

Poiché android.intent.action.PACKAGE_ADDED è un intento di sistema (si noti che la propria app non lo riceverà durante l'installazione), il tuo BroadcastReceiver riceverà messaggi da fonti esterne all'app. Così, controllare non hai messo: Android: esportato = "false"

Potrebbe anche essere necessario aggiungere:

<data android:scheme="package" /> 

Così, il vostro BroadcastReceiver nella vostra AndroidManifest.xml dovrebbe essere simile a questo:

<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> 

Se ancora non funziona, si può tentare di mettere una priorità più alta, come ad esempio: Android: priority = "1000"

Date un'occhiata a: http://developer.android.com/guide/topics/manifest/receiver-element.html

+0

Come menzionato nei documenti, la priorità massima può essere 999 https://developer.android.com/guide/topics/manifest/intent-filter-element.html – Sagar

+0

Per qualche motivo, non funziona ancora per me. Ho più azioni nel mio filtro intent. Tra cui, PACKAGE_FULLY_REMOVED attiva correttamente onCreate sul mio ricevitore, tuttavia, PACKAGE_ADDED semplicemente non lo fa. La mia app è già in esecuzione, ho esportato = "true" per il ricevitore, ho la priorità massima impostata come 999 e ho incluso come da tuo suggerimento. Mi sto perdendo qualcosa qui? – Sagar

0

Se si tenta di ricevere qualche altro pacchetto che deve essere lavorato.

(come notato da @Savvas) Se si tenta di ricevere l'aggiunta del proprio pacchetto, non è possibile riceverlo.Anche se il destinatario della trasmissione ha action.PACKAGE_ADDED, il metodo onReceive del ricevente isn't triggered.

In questo caso, la soluzione migliore è salvare questi dati. Utilizzando sharedPreferences, aggiungi una chiave come "appIsWorkedBefore" e sul metodo onCreate di Activity Launcher imposta questa variabile come "true". E puoi fare i tuoi lavori rispetto a questo booleano.

Problemi correlati