2015-01-24 18 views
5

Mi scusi per una domanda così elementare. Capisco che la classe Application venga istanziata all'avvio del processo della mia app e capisco che quando il telefono è completato, verrà richiamato il mio ricevitore di avvio. Presumo che dal momento che il telefono sappia tramite il manifest che la mia app detiene il filtro di intent BOOT_COMPLETED, il processo di riavvio è. Il telefono si riavvia, il telefono avvia tutti i processi con BOOT_COMPLETED, il telefono attiva la trasmissione BOOT_COMPLETED. La mia preoccupazione derivava dal chiedermi se facessi riferimento alle variabili di istanza della classe Application all'interno del mio ricevitore di avvio se il ricevitore dovesse mai essere chiamato prima che la mia classe Application venisse istanziata.È garantita l'istanza della classe Application prima che venga chiamato un ricevitore di avvio definito

Ancora una volta scusami se questo è ovvio. Non ho mai capito appieno le meccaniche di riavvio.

risposta

5

Un'applicazione viene sempre avviata prima di qualsiasi delle sue attività/servizi/destinatari. Qui ci sono un paio di blog che entrare nei dettagli:

[Edited]

Ma, secondo un commento di @CommansWare:

In base alla registrazione, l'istanza di ContentProvider viene creata dopo l'istanza dell'applicazione. Tuttavia, onCreate() del ContentProvider viene chiamato prima di onCreate() dell'applicazione.

Quindi, probabilmente non è sicuro provare a utilizzare l'istanza dell'applicazione all'interno di un provider onCreate().

+0

Forse mi manca, ma non vedo dove i post del blog eseguono il backup del tuo reclamo. Ad esempio, la stringa "provider" appare una sola volta nel primo post e non nel secondo. L'uso del "provider" da parte del primo post definisce semplicemente ciò che si è. Allo stesso modo, il termine più generico "componente" è usato nel primo post, non nel secondo, e da nessuna parte indica che l'applicazione è stata creata prima di qualsiasi componente. E mentre entrambi i post del blog si riferiscono a "applicazione", non vedo alcuna prova che i riferimenti facciano riferimento all'istanza "Applicazione", ma piuttosto "applicazione" come la forma lunga di "app". – CommonsWare

+2

@CommonsWare: Blog 2 afferma "Questo metodo richiama il metodo makeApplication() che carica in memoria le classi specifiche dell'app." E per essere veramente chiari, guardando il [codice per makeApplication] (http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/4.3_r1/android/app/ LoadedApk.java # LoadedApk.makeApplication% 28boolean% 2Candroid.app.Instrumentation% 29), vediamo che restituisce un'istanza Application. Inoltre, la domanda non ha nemmeno chiesto informazioni sui provider, ma per renderti felice :-), ho modificato la mia risposta per rimuovere quella parola. – cybersam

+2

Sono d'accordo con la tua modifica. 'ContentProvider' è in realtà una borsa mista. In base alla registrazione, l'istanza di 'ContentProvider' viene creata dopo l'istanza di' Applicazione'. Tuttavia, 'onCreate()' di 'ContentProvider' viene chiamato prima di' onCreate() 'dell'applicazione'. – CommonsWare

3

Il telefono si riavvia, il telefono avvia tutti i processi con BOOT_COMPLETED, il telefono attiva la trasmissione BOOT_COMPLETED.

vorrei frase più come "riavvio del telefono, incendi telefono fuori BOOT_COMPLETED trasmissione, e la normale elaborazione di trasmissione si verifica, tra cui l'avvio tutti i processi necessari".

La mia preoccupazione veniva dal chiedermi se faccio riferimento alle variabili di istanza della classe Application all'interno del mio ricevitore di avvio se il ricevente dovesse mai essere chiamato prima che la mia classe Application venisse istanziata.

Non dovrebbe. L'ordine di esemplificazione si suppone che sia:

  • qualsiasi ContentProviders è stato definito nel manifesto, poi

  • l'istanza Application, quindi

  • la componente che ha attivato la necessità che il processo di (in questo caso, il vostro ACTION_BOOT_COMPLETEDBroadcastReceiver)

+0

Grazie a CommonsWare. Ti capita di avere un link di cui si parla su d.android.com? – user1701153

+2

@ user1701153: Non sono a conoscenza del fatto che sia stato discusso su d.android.com. Questo è il tipo di cose che raccogli lavorando su Android per (gulp!) Otto anni, monitorando i commenti dei tecnici di Google e quant'altro. – CommonsWare

+0

Ho aggiunto una risposta con un paio di link ai blog di qualcuno che ha lavorato nel "Team Android Performance di Qualcomm". – cybersam