Come dichiarare le variabili globali in Android?


595

Sto creando un'applicazione che richiede l'accesso. Ho creato l'attività principale e quella di accesso.

Nel onCreatemetodo di attività principale ho aggiunto la seguente condizione:

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    ...

    loadSettings();
    if(strSessionString == null)
    {
        login();
    }
    ...
}

Il onActivityResultmetodo che viene eseguito al termine del modulo di accesso è simile al seguente:

@Override
public void onActivityResult(int requestCode,
                             int resultCode,
                             Intent data)
{
    super.onActivityResult(requestCode, resultCode, data);
    switch(requestCode)
    {
        case(SHOW_SUBACTICITY_LOGIN):
        {
            if(resultCode == Activity.RESULT_OK)
            {

                strSessionString = data.getStringExtra(Login.SESSIONSTRING);
                connectionAvailable = true;
                strUsername = data.getStringExtra(Login.USERNAME);
            }
        }
    }

Il problema è che il modulo di accesso a volte appare due volte (il login()metodo viene chiamato due volte) e anche quando la tastiera del telefono fa scorrere il modulo di accesso appare di nuovo e immagino che il problema sia la variabile strSessionString.

Qualcuno sa come impostare la variabile globale al fine di evitare che compaia il modulo di accesso dopo che l'utente ha già autenticato con successo?


un buon tutorial su come gestire uno stato di attività usando il bundle di stato di istanza salvato quicktips.in/…
Deepak Swami

Risposte:


954

Ho scritto questa risposta nel '09, quando Android era relativamente nuovo e c'erano molte aree non ben consolidate nello sviluppo di Android. Ho aggiunto un lungo addendum in fondo a questo post, affrontando alcune critiche e descrivendo in dettaglio un disaccordo filosofico che ho con l'uso di Singletons piuttosto che con la sottoclasse Application. Leggilo a tuo rischio e pericolo.

RISPOSTA ORIGINALE:

Il problema più generale che stai riscontrando è come salvare lo stato in diverse attività e in tutte le parti dell'applicazione. Una variabile statica (ad esempio un singleton) è un modo Java comune per raggiungere questo obiettivo. Ho scoperto, tuttavia, che un modo più elegante in Android è associare il tuo stato al contesto dell'applicazione.

Come sapete, ogni attività è anche un contesto, ovvero informazioni sul suo ambiente di esecuzione in senso lato. La tua applicazione ha anche un contesto e Android garantisce che esisterà come una singola istanza in tutta l'applicazione.

Il modo per farlo è creare la tua sottoclasse di android.app.Application e quindi specificare quella classe nel tag dell'applicazione nel manifest. Ora Android creerà automaticamente un'istanza di quella classe e la renderà disponibile per l'intera applicazione. È possibile accedervi da qualsiasi contextutilizzo del Context.getApplicationContext()metodo ( Activityfornisce anche un metodo getApplication()che ha lo stesso effetto esatto). Di seguito è riportato un esempio estremamente semplificato, con le avvertenze da seguire:

class MyApp extends Application {

  private String myState;

  public String getState(){
    return myState;
  }
  public void setState(String s){
    myState = s;
  }
}

class Blah extends Activity {

  @Override
  public void onCreate(Bundle b){
    ...
    MyApp appState = ((MyApp)getApplicationContext());
    String state = appState.getState();
    ...
  }
}

Questo ha essenzialmente lo stesso effetto dell'utilizzo di una variabile statica o singleton, ma si integra abbastanza bene nel framework Android esistente. Tieni presente che questo non funzionerà tra i processi (se la tua app è una delle rare che ha più processi).

Qualcosa da notare dall'esempio sopra; supponiamo di aver invece fatto qualcosa del tipo:

class MyApp extends Application {

  private String myState = /* complicated and slow initialization */;

  public String getState(){
    return myState;
  }
}

Ora questa lenta inizializzazione (come colpire il disco, colpire la rete, qualsiasi blocco, ecc.) Verrà eseguita ogni volta che l'applicazione viene istanziata! Potresti pensare, beh, questo è solo una volta per il processo e dovrò comunque pagare il costo, giusto? Ad esempio, come indicato di seguito da Dianne Hackborn, è del tutto possibile che il processo venga istanziato -solo- per gestire un evento di trasmissione in background. Se l'elaborazione della trasmissione non ha bisogno di questo stato, potenzialmente hai appena fatto un'intera serie di operazioni complicate e lente per niente. Un'istanza pigra è il nome del gioco qui. Di seguito è riportato un modo leggermente più complicato di utilizzare l'applicazione che ha più senso per qualsiasi cosa tranne che per gli usi più semplici:

class MyApp extends Application {

  private MyStateManager myStateManager = new MyStateManager();

  public MyStateManager getStateManager(){
    return myStateManager ;
  }
}

class MyStateManager {

  MyStateManager() {
    /* this should be fast */
  }

  String getState() {
    /* if necessary, perform blocking calls here */
    /* make sure to deal with any multithreading/synchronicity issues */

    ...

    return state;
  }
}

class Blah extends Activity {

  @Override
  public void onCreate(Bundle b){
    ...
    MyStateManager stateManager = ((MyApp)getApplicationContext()).getStateManager();
    String state = stateManager.getState();
    ...
  }
}

Mentre preferisco la sottoclasse delle applicazioni all'utilizzo dei singleton qui come soluzione più elegante, preferirei che gli sviluppatori usassero i singleton se davvero necessari piuttosto che non pensare affatto attraverso le prestazioni e le implicazioni multithreading di associare lo stato alla sottoclasse Application.

NOTA 1: anche come commentato anticafe, per legare correttamente la sostituzione dell'applicazione alla propria applicazione è necessario un tag nel file manifest. Ancora una volta, consulta i documenti Android per ulteriori informazioni. Un esempio:

<application
     android:name="my.application.MyApp" 
     android:icon="..."
     android:label="...">
</application>

NOTA 2: user608578 chiede di seguito come funziona con la gestione dei cicli di vita degli oggetti nativi. Non sono minimamente in grado di utilizzare il codice nativo con Android e non sono qualificato per rispondere a come interagirebbe con la mia soluzione. Se qualcuno ha una risposta a questo, sono disposto ad accreditarli e mettere le informazioni in questo post per la massima visibilità.

APPENDICE:

Come alcune persone hanno notato, questa non è una soluzione per lo stato persistente , qualcosa che forse avrei dovuto sottolineare maggiormente nella risposta originale. Vale a dire che non si intende che sia una soluzione per il salvataggio di utenti o altre informazioni che devono essere mantenute per tutta la vita delle applicazioni. Pertanto, ritengo che la maggior parte delle critiche riportate di seguito riguardino il fatto che le applicazioni vengano uccise in qualsiasi momento, ecc ..., discutendo, poiché tutto ciò che è mai stato necessario perseverare su disco non dovrebbe essere archiviato attraverso una sottoclasse dell'applicazione. È pensato per essere una soluzione per la memorizzazione di uno stato di applicazione temporaneo e facilmente ricreabile (ad esempio se un utente ha effettuato l'accesso) e componenti che sono di singola istanza (ad esempio gestore della rete di applicazione) ( NON singleton!) In natura.

Dayerman è stato così gentile da segnalare un'interessante conversazione con Reto Meier e Dianne Hackborn in cui l'uso delle sottoclassi delle applicazioni è scoraggiato a favore dei modelli Singleton. Somatik ha anche sottolineato qualcosa di simile in precedenza, anche se non l'ho visto al momento. A causa dei ruoli di Reto e Dianne nel mantenimento della piattaforma Android, non posso in buona fede raccomandare di ignorare i loro consigli. Quello che dicono, va. Desidero essere in disaccordo con le opinioni espresse in merito alla preferenza per le sottoclassi delle applicazioni Singleton. Nel mio disaccordo userò i concetti meglio spiegati in questa spiegazione StackExchange del modello di progettazione Singleton, quindi non devo definire i termini in questa risposta. Consiglio vivamente di scremare il link prima di continuare. Punto per punto:

Dianne afferma: "Non c'è motivo di sottoclassare dall'Applicazione. Non è diverso dal creare un singleton ..." Questa prima affermazione non è corretta. Ci sono due ragioni principali per questo. 1) La classe Application offre una migliore garanzia a vita per uno sviluppatore di applicazioni; è garantito che abbia la durata dell'applicazione. Un singleton non è ESPLICITAMENTE legato alla durata dell'applicazione (sebbene sia efficace). Questo potrebbe non essere un problema per il tuo sviluppatore medio di applicazioni, ma direi che questo è esattamente il tipo di contratto che dovrebbe essere offerto dall'API Android e fornisce anche molta più flessibilità al sistema Android, riducendo al minimo la durata degli associati dati. 2) La classe Application fornisce allo sviluppatore dell'applicazione un unico proprietario di istanza per stato, che è molto diverso da un detentore di stato Singleton. Per un elenco delle differenze, vedere il link di spiegazione Singleton sopra.

Dianne continua, "... probabilmente sarà qualcosa di cui ti pentirai in futuro quando scoprirai che il tuo oggetto Application sta diventando questo grande pasticcio di ciò che dovrebbe essere una logica applicativa indipendente." Questo non è certamente errato, ma non è un motivo per scegliere la sottoclasse Singleton su Applicazione. Nessuno degli argomenti di Diane fornisce una ragione per cui usare una Singleton sia meglio di una sottoclasse di Applicazione, tutto ciò che tenta di stabilire è che usare una Singleton non è peggio di una Sottoclasse di Applicazione, che credo sia falsa.

Continua, "E questo porta più naturalmente a come dovresti gestire queste cose - inizializzandole su richiesta." Ciò ignora il fatto che non esiste alcun motivo per cui non è possibile inizializzare su richiesta utilizzando anche una sottoclasse Applicazione. Ancora una volta non c'è differenza.

Dianne termina con "Il framework stesso ha tonnellate e tonnellate di singoli per tutti i piccoli dati condivisi che mantiene per l'app, come cache di risorse caricate, pool di oggetti, ecc. Funziona alla grande". Non sto sostenendo che l'uso di Singleton non possa funzionare bene o non sia un'alternativa legittima. Sto sostenendo che Singleton non fornisce un contratto così forte con il sistema Android come l'utilizzo di una sottoclasse di Applicazione, e inoltre che l'utilizzo di Singletons indica generalmente un design inflessibile, che non è facilmente modificabile, e porta a molti problemi lungo la strada. IMHO, il forte contratto che l'API Android offre alle applicazioni degli sviluppatori è uno degli aspetti più interessanti e piacevoli della programmazione con Android e ha contribuito a portare all'adozione anticipata degli sviluppatori che ha guidato la piattaforma Android verso il successo che ha oggi.

Dianne ha anche commentato di seguito, menzionando un ulteriore svantaggio dell'uso delle sottoclassi di applicazioni, che possono incoraggiare o semplificare la scrittura di un codice di prestazioni inferiore. Questo è molto vero e ho modificato questa risposta per sottolineare l'importanza di considerare perf qui e adottare l'approccio corretto se si utilizza la sottoclasse dell'applicazione. Come afferma Dianne, è importante ricordare che la tua classe Application verrà istanziata ogni volta che il tuo processo viene caricato (potrebbe essere più volte contemporaneamente se l'applicazione viene eseguita in più processi!) Anche se il processo viene caricato solo per una trasmissione in background evento. È quindi importante utilizzare la classe Application più come repository per puntatori a componenti condivisi della tua applicazione piuttosto che come luogo per eseguire qualsiasi elaborazione!

Vi lascio con il seguente elenco di aspetti negativi di Singletons, come rubato dal precedente link StackExchange:

  • Incapacità di usare classi astratte o di interfaccia;
  • Incapacità di sottoclasse;
  • Elevato accoppiamento attraverso l'applicazione (difficile da modificare);
  • Difficile da testare (impossibile falsificare / simulare nei test unitari);
  • Difficile parallelizzare in caso di stato mutevole (richiede un blocco esteso);

e aggiungi il mio:

  • Contratto a vita poco chiaro e ingestibile non adatto allo sviluppo di Android (o la maggior parte degli altri);

93
Grazie a presto - questo tipo di risposte sono il motivo per cui amo così tanto Stack Overflow. OTTIMO LAVORO!
JohnnyLambada,

5
Per chiunque si stia chiedendo come "specificare quella classe nel tag dell'applicazione nel manifest", ci sono, al momento della stesura di questo documento, altre due risposte a questa domanda che descrivono come farlo (usa android: nome), uno di ebuprofene e uno di Mike Brown.
Tyler Collier,

9
Presto, la tua risposta è giusta, ma potresti notare che dovremmo aggiungere <applicazione android: name = ". MyApp" ... /> nel file manifest di Android?
anticafe,

12
Consentitemi di ripetere ancora una volta, non dovreste usare Application for globals. Non serve a nulla, non offre alcun vantaggio rispetto ai singoli e può essere attivamente dannoso, ad esempio danneggiare le prestazioni dell'avvio del processo. Nel momento in cui l'applicazione viene creata, non hai idea per quale processo venga creato. Inizializzando pigramente i singoli in base alle esigenze, devi solo fare il lavoro necessario. Ad esempio, se il processo è stato avviato per gestire una trasmissione su un evento in background, non vi è motivo di inizializzare lo stato globale necessario all'interfaccia utente.
hackbod,

14
Inoltre, chiariamo qui: tutti i tuoi argomenti contro i singleton sono perfettamente validi, quando parliamo di situazioni in cui stai effettivamente scegliendo tra un singleton e un altro approccio che non è globale; i singoli sono globali, con tutti gli avvertimenti sui globuli che si applicano. Tuttavia, l' applicazione è anche un singleton . Non stai sfuggendo a questi problemi passando all'Applicazione di sottoclasse, un'applicazione è esattamente la stessa di una singleton (ma peggio), ti sta solo lasciando ingannare che stai facendo qualcosa di più pulito. Ma non lo sei.
hackbod,

153

Crea questa sottoclasse

public class MyApp extends Application {
  String foo;
}

In AndroidManifest.xml aggiungi android: name

Esempio

<application android:name=".MyApp" 
       android:icon="@drawable/icon" 
       android:label="@string/app_name">

1
grazie per quello. Mi chiedevo come dichiararlo nel manifest
Someone Somewhere

3
Perché funzioni per me ho dovuto rimuovere il "." in ".MyApp"
Someone Somewhere

3
dichiaralo dopo l'attività principale, altrimenti potrebbe non essere installato / distribuito
sami,

11
voglio solo dire, questo va nel tag MAIN dell'applicazione che è già lì ... questo non è un secondo :) ho dovuto imparare nel modo più duro.
bwoogie,

java.lang.IllegalAccessException: access to class is not allowed
Rapace

142

Il modo suggerito da Soonil di mantenere uno stato per l'applicazione è buono, tuttavia ha un punto debole: ci sono casi in cui il sistema operativo uccide l'intero processo dell'applicazione. Ecco la documentazione su questo - Processi e cicli di vita .

Prendi in considerazione un caso: la tua app passa in secondo piano perché qualcuno ti sta chiamando (l'app del telefono è in primo piano ora). In questo caso, && in alcune altre condizioni (controllare il link sopra per quali potrebbero essere) il sistema operativo potrebbe interrompere il processo di applicazione, inclusa l' Applicationistanza della sottoclasse. Di conseguenza lo stato è perso. Quando in seguito tornerai all'applicazione, il sistema operativo ripristinerà lo stack di attività e l' Applicationistanza della sottoclasse, comunque myStatesarà il campo null.

AFAIK, l'unico modo per garantire la sicurezza dello stato è utilizzare qualsiasi tipo di persistenza dello stato, ad esempio utilizzando un privato per il file dell'applicazione o SharedPrefernces (eventualmente utilizza un privato per il file dell'applicazione nel file system interno).


10
+1 per persistere con SharedPreferences; è così che l'ho visto fare. Trovo strano abusare del sistema di preferenze per lo stato salvato, ma funziona così bene che il problema diventa solo una questione di terminologia.
Cheezmeister,

1
potresti per favore pubblicare il codice (o fornire un link a una spiegazione) su come SharedPreferences viene utilizzato per risolvere il problema descritto da Arhimed
Someone Somewhere

2
Preferenze, database, serializzazione dei file, ecc. Ogni attività può mantenere lo stato se utilizza onSaveInstanceState ma non aiuta se l'utente si ritira dall'attività e la rimuove dallo stack della cronologia, forza la chiusura o spegne il dispositivo .
Darren Hinderer

1
Questo comportamento è molto fastidioso: non sarebbe così male se il metodo onTerminate () dell'applicazione fosse chiamato in modo da poter gestire la situazione in modo elegante.
Dean Wild,

2
Questa è la risposta corretta secondo me. È un bug fare affidamento sulla stessa istanza dell'applicazione esistente tra le attività. Nella mia esperienza è abbastanza comune per Android abbattere completamente e ricreare l'intero processo mentre si è in background. Essere in background potrebbe significare semplicemente lanciare un obiettivo della fotocamera, l'intento del browser o ricevere una telefonata.
Jared Kells,

26

Solo una nota ..

Inserisci:

android:name=".Globals"

o come hai chiamato la tua sottoclasse per il tag esistente <application> . Continuavo a provare ad aggiungere un altro <application>tag al manifest e avrei ottenuto un'eccezione.


Ciao Gimbl. Ho avuto lo stesso problema. Avevo anche il mio tag <application> e, quando provo ad aggiungere un altro tag <application>, ho avuto lo stesso problema con te (messaggio di eccezione). Ma ho fatto quello che hai detto e non ha funzionato. Aggiungo android: name = ". GlobalClass" al mio tag <application> ma non funziona. Puoi spiegarmi come l'hai risolto ??
Sonhja,

3
Buona <manifest> <applicazione android: name = ". GlobalData"> </application> </manifest>. Bad <manifest><application> </application> <application android: name = ". GlobalData"> </application> </manifest>
Gimbl

13

Neanche io ho trovato il modo di specificare il tag dell'applicazione, ma dopo molti googling, è diventato evidente dai documenti del file manifest: usa android: name, oltre all'icona e all'etichetta predefinite nella stanza dell'applicazione.

android: name Il nome completo di una sottoclasse Application implementata per l'applicazione. Quando viene avviato il processo dell'applicazione, questa classe viene istanziata prima di qualsiasi componente dell'applicazione.

La sottoclasse è facoltativa; la maggior parte delle applicazioni non ne avrà bisogno. In assenza di una sottoclasse, Android utilizza un'istanza della classe Applicazione di base.


13

Che dire di garantire la raccolta della memoria nativa con tali strutture globali?

Le attività hanno un onPause/onDestroy()metodo chiamato alla distruzione, ma la classe Application non ha equivalenti. Quale meccanismo è raccomandato per garantire che le strutture globali (in particolare quelle che contengono riferimenti alla memoria nativa) vengano raccolte in modo appropriato quando l'applicazione viene uccisa o lo stack di attività viene messo in background?


1
La soluzione ovvia è implementare l' interfaccia Closeable per i tuoi oggetti responsabili delle risorse native e garantire che siano gestiti da un'istruzione try-with-resources o qualcos'altro. Nel peggiore dei casi puoi sempre usare un finalizzatore di oggetti.
presto

5

Hai solo bisogno di definire un nome di applicazione come di seguito che funzionerà:

<application
  android:name="ApplicationName" android:icon="@drawable/icon">
</application>

4

Come discusso in precedenza, il sistema operativo potrebbe uccidere l'APPLICAZIONE senza alcuna notifica (non esiste alcun evento onDestroy), quindi non c'è modo di salvare queste variabili globali.

SharedPreferences potrebbe essere una soluzione TRANNE che si hanno variabili COMPLESSE STRUTTURATE (nel mio caso avevo un array intero per memorizzare gli ID che l'utente ha già gestito). Il problema con SharedPreferences è che è difficile archiviare e recuperare queste strutture ogni volta che sono necessari i valori.

Nel mio caso avevo un SERVIZIO in background in modo da poter spostare queste variabili lì e poiché il servizio ha un evento onDestroy, ho potuto salvare facilmente quei valori.


onDestroy () non è garantito per essere chiamato anche per un servizio.
Impara OpenGL ES il

Sì, questo potrebbe accadere, ma solo in caso di situazioni critiche.
Adorjan Princz,

4

Se alcune variabili sono memorizzate in sqlite e devi usarle nella maggior parte delle attività nella tua app. quindi l'applicazione potrebbe essere il modo migliore per raggiungerlo. Interroga le variabili dal database all'avvio dell'applicazione e memorizzale in un campo. Quindi puoi usare queste variabili nelle tue attività.

Quindi trova la strada giusta e non esiste il modo migliore.


3

È possibile disporre di un campo statico per memorizzare questo tipo di stato. Oppure inseriscilo nel pacchetto di risorse e ripristina da lì su OnCreate (pacchetto salvatoInstanceState). Assicurati di comprendere appieno il ciclo di vita gestito dell'app per Android (ad es. Perché login () viene chiamato al cambio di orientamento della tastiera).


2

NON utilizzare un altro <application>tag nel file manifest. Basta fare una modifica nel <application>tag esistente , aggiungere questa riga android:name=".ApplicationName"dove, ApplicationNamesarà il nome della sottoclasse (utilizzare per archiviare globale) che si sta per creare.

quindi, finalmente il tuo tag ONE AND ONLY <application> nel file manifest dovrebbe apparire così: -

<application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/Theme.AppCompat.NoActionBar"
        android:name=".ApplicationName"
        >

1

puoi usare Intents, Sqlite o Preferenze condivise. Quando si tratta di archiviazione multimediale, come documenti, foto e video, è possibile invece creare i nuovi file.


1

Puoi farlo usando due approcci:

  1. Utilizzando la classe di applicazione
  2. Utilizzo delle preferenze condivise

  3. Utilizzando la classe di applicazione

Esempio:

class SessionManager extends Application{

  String sessionKey;

  setSessionKey(String key){
    this.sessionKey=key;
  }

  String getSessisonKey(){
    return this.sessionKey;
  }
}

È possibile utilizzare la classe precedente per implementare l'accesso in MainActivity come di seguito. Il codice sarà simile al seguente:

@override 
public void onCreate (Bundle savedInstanceState){
  // you will this key when first time login is successful.
  SessionManager session= (SessionManager)getApplicationContext();
  String key=getSessisonKey.getKey();
  //Use this key to identify whether session is alive or not.
}

Questo metodo funzionerà per l'archiviazione temporanea. Davvero non hai idea di quando il sistema operativo ucciderà l'applicazione, a causa della memoria insufficiente. Quando l'applicazione è in background e l'utente sta navigando attraverso un'altra applicazione che richiede più memoria per l'esecuzione, l'applicazione verrà uccisa dal momento che il sistema operativo ha più priorità ai processi in primo piano che in background. Quindi l'oggetto dell'applicazione sarà nullo prima che l'utente si disconnetta. Quindi per questo consiglio di utilizzare il secondo metodo specificato sopra.

  1. Utilizzo delle preferenze condivise.

    String MYPREF="com.your.application.session"
    
    SharedPreferences pref= context.getSharedPreferences(MyPREF,MODE_PRIVATE);
    
    //Insert key as below:
    
    Editot editor= pref.edit();
    
    editor.putString("key","value");
    
    editor.commit();
    
    //Get key as below.
    
    SharedPreferences sharedPref = getActivity().getPreferences(Context.MODE_PRIVATE);
    
    String key= getResources().getString("key");

0

Il risultato dell'attività viene chiamato prima al riavvio. Quindi sposta il controllo di accesso su su resume e il tuo secondo accesso può essere bloccato una volta che l'attività secomd ha restituito un risultato positivo. Il curriculum viene chiamato ogni volta, quindi non ci si preoccupa che non venga chiamato la prima volta.


0

L'approccio della sottoclasse è stato utilizzato anche dal framework BARACUS. Dal mio punto di vista, la sottoclasse dell'applicazione doveva funzionare con i cicli di vita di Android; questo è ciò che fa qualsiasi contenitore di applicazioni. Invece di avere globali allora, registro i bean in questo contesto e li faccio iniettare in qualsiasi classe gestibile dal contesto. Ogni istanza di bean iniettata è in realtà un singleton.

Vedi questo esempio per i dettagli

Perché il lavoro manuale se puoi avere molto di più?


0
class GlobaleVariableDemo extends Application {

    private String myGlobalState;

    public String getGlobalState(){
     return myGlobalState;
    }
    public void setGlobalState(String s){
     myGlobalState = s;
    }
}

class Demo extends Activity {

@Override
public void onCreate(Bundle b){
    ...
    GlobaleVariableDemo appState = ((GlobaleVariableDemo)getApplicationContext());
    String state = appState.getGlobalState();
    ...
    }
}

0

È possibile creare una classe che estende la Applicationclasse e quindi dichiarare la propria variabile come campo di quella classe e fornire il metodo getter per essa.

public class MyApplication extends Application {
    private String str = "My String";

    synchronized public String getMyString {
        return str;
    }
}

E quindi per accedere a quella variabile nella tua attività, usa questo:

MyApplication application = (MyApplication) getApplication();
String myVar = application.getMyString();
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.