2010-09-06 11 views
18

Sto cercando di capire le principali differenze tra la registrazione di un BroadcastReceiver nel Manifesto e la registrazione a livello di codice ...differenza principale tra manifesto programmatico e la registrazione di BroadcastReceiver

La mia comprensione è sostanzialmente la seguente (apprezzerebbe qualcuno correggendo la mia indica se mi manca qualcosa).

  • Registrato nel manifesto:

    1. Il sistema operativo sarà magicamente trovare e istanziare la classe, se necessario, chiamare il metodo OnReceive(), a prescindere quello che lo stato in esecuzione della vostra applicazione era
    2. vostro ricevono verrà chiamato una sola volta per trasmissione (cioè puoi considerare che registrarsi nel manifest è come registrare la tua 'classe' per ricevere la trasmissione - e la trasmissione istanzia la tua classe come necessario) (??)
  • registrato a livello di programmazione:

    1. registrazione in codice indica che si sta registrando istanze della tua classe per ricevere i messaggi broadcast (vale a dire se il tuo codice è un po 'sciatto e riesci a registrarti più volte, ti ritroverai con più istanze di BroadcastReceiver tutte con il loro onReceive() chiamato per una trasmissione
    2. per annullare la registrazione, è necessario annullare la registrazione dell'istanza di BroadcastReceiver specifica che precedentemente registrato
    3. se l'applicazione viene distrutta dal sistema operativo, il metodo vostra OnReceive() non sarà chiamato per una trasmissione

grazie

risposta

18

l'hai fondamentalmente corretto.

Si noti che un oggetto ricevitore registrato manifest viene utilizzato una sola volta. Una nuova istanza di BroadcastReceiver viene creata per ogni trasmissione. L'uso principale dei ricevitori registrati manifest è per le trasmissioni che possono continuare mentre il codice non è in memoria (ad es., BOOT_COMPLETED, gli allarmi programmati tramite AlarmManager).

+0

E suppongo che se il servizio si arresta in modo anomalo in cui il tuo broadcastreceiver è dichiarato nel manifest, il destinatario riceverà comunque i messaggi ... – Boy

+0

@ Boy: Sì, dovrebbe. – CommonsWare

+0

per favore puoi cercare se quello relativo al mio problema: http://stackoverflow.com/questions/29728000/wifi-changed-status-affecting-my-app –

0

La tua comprensione è corretta secondo la mia.

Un'altra differenza rilevante (e oscura) è che alcuni specifici intenti di sistema attivano il ricevitore solo se è registrato a livello di programmazione. I ricevitori definiti solo nel manifest non verranno chiamati. Esempi sono: ACTION_SCREEN_ON, ACTION_SCREEN_OFF, ACTION_BATTERY_CHANGED, ACTION_HEADSET_PLUG

Mi raccomando questo text che cita vari dettagli circa gli intenti e ricevitori.

+0

Beh, sono riuscito a registrare un ricevitore per ACTION_SCREEN_ON tramite manifest e funziona – jonney

4

Quando utilizzare il metodo per registrare

Quale metodo da utilizzare per la registrazione del BroadcastReceiver dipende da ciò che la vostra applicazione fa con l'evento di sistema.Penso che ci sono fondamentalmente due ragioni per cui la vostra applicazione vuole sapere sugli eventi a livello di sistema:

  1. tua applicazione offre qualche tipo di servizio intorno a questi eventi

  2. La vostra applicazione vuole reagire gentilmente ai cambiamenti di stato

Esempi per la prima categoria sono applicazioni che hanno bisogno di lavorare non appena il dispositivo viene avviato o che deve iniziare un certo tipo di lavoro ogni volta che viene installato un app. Battery Widget Pro o App2SD sono buoni esempi per questo tipo di app. Per questo tipo è necessario registrare BroadcastReceiver nel file Manifest.

Gli esempi per la seconda categoria sono eventi che segnalano un cambiamento delle circostanze su cui l'app può fare affidamento. Supponiamo che la tua app dipenda da una connessione Bluetooth stabilita. Devi reagire a una modifica dello stato, ma solo quando la tua app è attiva. In questo caso non è necessario un ricevitore di trasmissione registrato staticamente. Uno registrato dinamicamente sarebbe più ragionevole.

Ci sono anche alcuni eventi ai quali non è nemmeno permesso registrarsi staticamente. Un esempio è l'evento Intent.ACTION_TIME_TICK che viene trasmesso ogni minuto. È una decisione saggia perché un ricevitore statico esaurirebbe inutilmente la batteria.

Problemi correlati