2010-11-08 16 views
168

Questo mi ha messo in difficoltà, stavo usando questo Android 2.1-r8 SDK:Differenza tra Contesto attività e alle situazioni Applicazione

ProgressDialog.show(getApplicationContext(), ....); 

e anche in

Toast t = Toast.makeText(getApplicationContext(),....); 

utilizzando getApplicationContext() crash sia ProgressDialog e Toast .... che mi portano a questa domanda:

Quali sono le reali differenze tra un contesto di attività e contesto applicativo, nonostante sh la dicitura "Contesto"?

+0

Questo è quello che ho trovato http: //stackoverflow.com/questions/1561803/android-progressdialog-show-crashes-with-getapplicationcontext .... – t0mm13b

+11

Questo dovrebbe aiutare a chiarire alcune cose: [Contesto, Cosa contesto?] (http://www.doubleencore.com/2013/06/context/) – toobsco42

+0

possibile duplicato del [Quando chiamare contesto attività o contesto di applicazione?] (http://stackoverflow.com/questions/7298731/when -to-call-activity-context-or-application-context) – n611x007

risposta

189

Sono entrambe le istanze di Context, ma l'istanza dell'applicazione è legata al ciclo di vita dell'applicazione, mentre l'istanza di attività è legata al ciclo di vita di un'attività. Pertanto, hanno accesso a diverse informazioni sull'ambiente dell'applicazione.

Se si leggono i documenti su getApplicationContext, si nota che è necessario utilizzarlo solo se è necessario un contesto il cui ciclo di vita è separato dal contesto corrente. Questo non si applica in nessuno dei tuoi esempi.

Il contesto dell'attività presenta presumibilmente alcune informazioni sull'attività corrente necessaria per completare tali chiamate. Se mostri l'esatto messaggio di errore, potresti essere in grado di indicare esattamente ciò di cui ha bisogno.

Ma in generale, utilizzare il contesto dell'attività a meno che non si abbia una buona ragione per non farlo.

+1

Ho ottenuto un 'java.lang.reflect.InvocationTargetException' quando uso 'getApplicationContext', abbastanza interessante, quando ho cambiato in' this', non si è bloccato e funziona come previsto .... quindi se sono entrambe le istanze di Context perché uno non funziona e l'altro no? Questa informazione sarà di aiuto agli altri, spero ... :) grazie per la tua pronta risposta ... – t0mm13b

+2

Avrei bisogno di vedere lo stacktrace completo delle eccezioni per poter dire qualcosa. Tuttavia, come ho detto le istanze di contesto hanno informazioni diverse. Presumibilmente per mostrare una finestra di dialogo o un brindisi sullo schermo sono necessarie informazioni sull'attività che solo l'istanza di attività ha. –

+0

Grazie ... ho scritto il mio commento sotto la domanda che punta al problema che sto avendo ... :) – t0mm13b

18

Questo ovviamente è carente del design dell'API. In primo luogo, contesto di attività e contesto dell'applicazione sono oggetti completamente diversi, quindi i parametri del metodo in cui viene utilizzato il contesto devono utilizzare direttamente ApplicationContext o Activity anziché utilizzare il contesto della classe padre. In secondo luogo, il doc dovrebbe specificare quale contesto usare o meno esplicitamente.

+7

Completamente d'accordo. Google ha lasciato cadere la palla su questo. È un disastro completo. –

8

Il motivo che penso è che ProgressDialog è collegato all'attività che puntella il ProgressDialog come il dialogo non può rimanere dopo l'attività viene distrutta in modo che deve essere passato this (ActivityContext) che viene anche distrutto con l'attività mentre il ApplicationContext rimane anche dopo che l'attività viene distrutta.

+0

Buona risposta .... –

1

Penso che quando tutto ha bisogno di uno schermo per mostrare (pulsante, finestra di dialogo, layout ...) dobbiamo usare l'attività di contesto, e tutto non ha bisogno di uno schermo per mostrare o elaborare (brindisi, servizio telelphone, contatto. ..) potremmo utilizzare un contesto applicativo

0

Non è possibile visualizzare una finestra di applicazione/dialogo attraverso un contesto che non è un'attività. Prova a passare un riferimento un'attività valida

94

Ho trovato questa tabella super utile per decidere quando utilizzare diversi tipi di contesti:

enter image description here

  1. un'applicazione può avviare un'attività da qui, ma richiede che deve essere creata una nuova attività. Questo può adattarsi a casi d'uso specifici, ma può creare comportamenti di stack back non standard nell'applicazione e generalmente non è raccomandato o considerato una buona pratica.
  2. Questo è legale, ma l'inflazione verrà eseguita con il tema predefinito per il sistema su cui si sta eseguendo, non ciò che è definito nella propria applicazione.
  3. ammessi se il ricevitore è nullo, che viene utilizzato per ottenere il valore corrente di un broadcast permanenti, su Android 4.2 e superiori.

Articolo originale here.

+1

Archiviato di articoli https://web.archive.org/web/20150329210012/https://possiblemobile.com/2013/06/context/ – nmu

+0

cosa dire ottenere le risorse? Penso che sia meglio aggiungerlo al tuo tavolo. e puoi accedere alle risorse con il contesto di applciazione. –

0

Utilizzare getApplicationContext() se è necessario qualcosa legato a un Contesto che avrà un ambito globale.

Se si utilizza Attività, la nuova istanza dell'attività avrà un riferimento, che ha un riferimento implicito alla vecchia attività e la vecchia attività non può essere raccolta.

Problemi correlati