differenza e quando utilizzare getApplication (), getApplicationContext (), getBaseContext () e someClass.this


121

Sono nuovo di Android e sto cercando di capire la differenza tra getApplication(), getApplicationContext(), getBaseContext(), getContext()e someClass.thissoprattutto quando utilizzare i questi metodi nei seguenti righe di codice:

Quando lancio un brindisi qual è la differenza tra questi e in quali casi li uso?

Toast.makeText(LoginActivity.this, "LogIn successful", Toast.LENGTH_SHORT).show();
Toast.makeText(getApplication(), "LogIn successful", Toast.LENGTH_SHORT).show();
Toast.makeText(getApplicationContext(), "LogIn successful", Toast.LENGTH_SHORT).show();
Toast.makeText(getBaseContext(), "LogIn successful", Toast.LENGTH_SHORT).show();

lo stesso con gli intenti:

Intent intent = new Intent(getApplicationContext(), LoginActivity.class);
Intent intent = new Intent(MenuPagina., LoginActivity.class);
Intent intent = new Intent(getBaseContext(), LoginActivity.class);
Intent intent = new Intent(getApplication(), LoginActivity.class);


gestiscono solo il contesto e baseContext. ma vorrei capire tutti i loro usi nei 2 contesti. grazie
Pheonix7

Risposte:


215

Toast e Intent , entrambi richiedono un riferimento al contesto . E getApplication , getApplicationContext , LoginActivity.this e getBaseContext , offrono tutti riferimento al contesto.

Ora la cosa che confonde è la dichiarazione di diversi contesti e il loro utilizzo specifico. Per rendere le cose semplici, dovresti contare due tipi di contesto disponibili nel framework Android.

  1. Contesto dell'applicazione
  2. Contesto dell'attività

Il contesto dell'applicazione è collegato al ciclo di vita dell'applicazione e sarà sempre lo stesso per tutta la vita dell'applicazione. Quindi, se si utilizza Toast , è possibile utilizzare il contesto dell'applicazione o anche il contesto dell'attività (entrambi) perché un avviso popup può essere generato da qualsiasi punto dell'applicazione e non è allegato a una finestra.

Il contesto dell'attività è collegato al ciclo di vita dell'attività e può essere distrutto se l'attività onDestroy()viene aumentata. Se si desidera avviare una nuova attività, è necessario utilizzare il contesto dell'attività nel suo Intent in modo che la nuova attività di avvio sia collegata all'attività corrente (in termini di stack di attività). Tuttavia, è possibile utilizzare anche il contesto dell'applicazione per avviare una nuova attività, ma è necessario impostare un flag Intent.FLAG_ACTIVITY_NEW_TASKcon l'intento di trattarla come una nuova attività.

Facendo ora riferimento ai tuoi casi:

LoginActivity.this sebbene si riferisca alla tua classe che estende la classe Activity, ma la classe base (Activity) estende anche la classe Context, quindi può essere utilizzata per offrire il contesto dell'attività.

getApplication() sebbene si riferisca all'oggetto Application, ma la classe Application estende la classe Context, quindi può essere utilizzata per offrire il contesto dell'applicazione.

getApplicationContext() offre il contesto dell'applicazione.

getBaseContext() offre il contesto dell'attività.

Suggerimenti: ogni volta che devi manipolare, Viewsvai su Activity-Context , altrimenti sarebbe sufficiente Application-Context .


11
quindi, se ho capito bene, someClass.this, getBaseContext e getContext () sono contex di attività mentre getApplicationContext () e getApplication () sono contex dell'applicazione?
Pheonix7,

contesto è solo informazione su un ambiente, giusto?
commesso e

Sì, è come la sandbox che ospita l'applicazione
waqaslam

@committedandroidery perché il contesto dell'attività contiene informazioni extra per il tema scelto, quindi quando le viste vengono create nel codice, il tema corretto verrà applicato automaticamente. Per maggiori informazioni, puoi leggere questo
waqaslam

@waqaslam riferito alle classi android sdk, Context-> ContextWrapper-> 1. Application& 2. ContextThemeWrapper-> Activity; ed getBaseContext()è il metodo ContextWrapper, così getBaseContext() offers activity context.comeApplication Context anche ... non è quello?
Bhuro

26

La risposta da Waqas è molto chiara e completa, tuttavia vorrei chiarire ulteriormente la differenza tra l'utilizzo thisvs getBaseContext(), o getApplication()contro getApplicationContext(). Entrambi Activitye Applicationnon si estendono Context, ma ContextWrapper, che è un file

"Il proxy dell'implementazione di Contextquesto delega semplicemente tutte le sue chiamate a un altro Context".

Quel contesto "reale" è ciò che ottieni usando getBaseContext().

Quindi, sebbene this(per Activity) ed getBaseContext()entrambi diano il contesto dell'attività, loro

  • (a) non si riferiscono allo stesso oggetto ( this != getBaseContext()) e
  • (b) la chiamata tramite contesto thisè leggermente meno efficiente, poiché le chiamate passano attraverso un ulteriore livello di riferimento indiretto. Dubito che faccia una differenza pratica, però.

La stessa logica vale a getApplication()vs getApplicationContext().


Per quanto getBaseContext()riguarda gli sviluppatori, gli sviluppatori Android di Google hanno suggerito questo: "Non utilizzare getBaseContext (), utilizza solo il contesto che hai". Quindi, in effetti, ti suggeriscono di utilizzare thisper le attività.
ChuongPham

questa è la spiegazione più chiara che getBaseContextho trovato su Internet. Grazie!!
q126y

6
LoginActivity.this 

la riga sopra è un'Attività che è ovviamente un Contesto .. questo è usato quando crei alcuni AlertDialogs ... In alcuni punti è obbligatorio che tu usi il Contesto dell'Attività ...

getApplication()

Lo stesso qui il metodo make text necessita dell'implementazione del contesto e dell'applicazione stessa Context

getApplicationContext()

questo è il modo più preferito poiché Contextdura fino allo spegnimento dell'applicazione.

getBaseContext()

questo contesto è disponibile per widget e viste ..

Ma tutti danno un oggetto Context e nient'altro ..


quindi in un messaggio di avviso o durante la creazione di un intento, hanno tutti lo stesso effetto anche se l'uso di getApplicationContext () è il più corretto?
Pheonix7,

1
@Hassan Samii: Per Toast, puoi usarlo getApplicationContext()per tutte le situazioni, ma è preferibile che tu lo usi thisquando fai Toast in un'attività.
ChuongPham

0

Class.questo usato se la tua classe si estende Attività getapplication () usato riferisci applicazione e applicazione estende il contesto dell'applicazione getbasecontext () riferisci il tuo contesto del contesto dell'attività si riferisce al tuo contesto del ciclo di vita dell'attività Il contesto dell'applicazione fa riferimento al ciclo di vita della tua app

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.