2012-02-02 8 views
18

Posso utilizzare ApplicationContext per lavorare con SharedPreferences e iniziare, ad esempio, RemoteService?Contesto dell'applicazione per SharedPreferences?

Logicamente, penso di poterlo fare. Ci sono delle sfumature in questo approccio?

+3

Cosa c'è di sbagliato in questa domanda? È troppo fittizio? – user1074896

+0

Pensa che non ci sono persone viste la domanda a chi può dare una risposta :( –

+0

Guarda questo, può aiutare: http://stackoverflow.com/questions/987072/using-application-context-everywhere –

risposta

1

Sì, è possibile utilizzare getApplicationContext() per quello. È possibile utilizzare getApplicationContext() ovunque si usi getBaseContext() o la parola chiave this in un'attività o in un servizio, ad eccezione di casi molto specifici come l'aggiunta di viste o finestre di dialogo all'interfaccia utente.

Here è un eccellente articolo su cosa è il contesto e cosa fa, che consiglio vivamente di passare.

10

si dovrebbe utilizzare il Activity o ServiceContext, vale a dire 'this', se non avete un motivo chiaro e forte di non farlo. Utilizzare solo ApplicationContext se si ha chiaramente bisogno di un riferimento allo stato globale della propria applicazione.

da parte degli sviluppatori di Android API docs su ContextWrapper'sgetApplicationContext() metodo:

questo genere dovrebbe essere utilizzato solo se avete bisogno di un contesto il cui ciclo di vita è separata dal contesto attuale, che è legata alla durata del processo, piuttosto che il componente corrente.

e

usando l'ApplicationContext (...) [a differenza ad esempio un contesto di attività o servizio] può facilmente portare a perdite gravi se si dimentica di annullare la registrazione, slegare, ecc

Ad esempio, per recuperare SharedPreferences in un Activity per esempio modificare i dati visualizzati all'utente, utilizzare this.getSharedPreferences(...) poiché non vi è alcuna ragione chiara per cui è necessario attingere al ciclo di vita dell'applicazione. Lo stesso, in un Service, utilizzare this.getSharedPreferences(...). (Si noti che l'attività e il servizio sono contesti in cui indirettamente estendono android.content.Context.)

CommonsWare ha scritto una risposta approfondita: When to call activity context OR application context? dove fa il caso che chiama getApplicationContext() "is almost always wrong" e delinea le poche eccezioni quando usarlo :

  • associazione a un servizio da un'attività.
  • qualcosa deve essere legato a un contesto con ambito globale.

CommonsWare collega anche a un answer da Ingegnere quadro Android Dianne Hackborn:

La prima regola che darebbe: se non si conosce il motivo per cui è necessario [contesto di applicazione], probabilmente don ne abbiamo bisogno (...) L'unica volta che vuoi usare getApplicationContext() è quando hai bisogno di un contesto che esista al di fuori del ciclo di vita di una classe di attività (o di un altro componente).

più risposte sul medesimo argomento con discussioni sulle questioni relative alla ApplicationContext:

10

come Gunnar Karlsson menzionato getApplicationContext() utilizzo di ContextWrapper sua abbastanza chiaro che si dovrebbe usare solo Activity o ServiceContesto-registro/unregister il ricevitore, si legano/svincolare i propri servizi (meno che non sia veramente necessario per la registrazione con i dati statici, non un particolare componente) al fine di evitare perdite di memoria incerti e di essere al sicuro anche se si dimentica a volte per annullare la registrazione, il sistema lo cancellerà con avvisi.

Tuttavia, per getSharedPreferences(...) è sempre possibile utilizzare qualsiasi ApplicationContext o Context senza intoppi. Il reason è, è stato chiaramente menzionato

Per ogni particolare insieme di preferenze (qui SharedPreferences), v'è una singola istanza di questa classe che tutti i client parti.

Ottenere solo un riferimento tramite il contesto dell'applicazione non manterrà il riferimento per sempre. È solo un riferimento alle preferenze tramite il contesto dell'applicazione come qualsiasi altro. Quindi verrà cancellato non appena l'utente avrà finito.

Si prega di notare, la registrazione di un ricevitore tramite il contesto dell'applicazione verrà mantenuta come stato globale associato alla propria applicazione. Quindi non sarà mai chiarito per te.

Per favore qualcuno mi corregga se sbaglio.

Spero che questo ti possa aiutare.

+2

Mi piacerebbe crederlo, spero che sia corretto –

+0

@Toro, per favore aggiungi i risultati a supporto del commento. Alla fine, tutti gli utenti dovrebbero sapere perché pensi che la risposta sopra non è corretto. –