Sto lavorando a un'applicazione Android con diverse attività. In esso ho una classe con diversi metodi statici. Mi piacerebbe essere in grado di chiamare questi metodi dalle diverse attività. Sto usando i metodi statici per caricare i dati da un file xml tramite XmlResourceParser. Per creare un XmlResourceParser è necessaria una chiamata sul contesto dell'applicazione. Quindi la mia domanda è, qual è il modo migliore per ottenere un riferimento al contesto dell'applicazione nei metodi statici? Chiedi a ogni attività di ottenerlo e di trasmetterlo? Memorizzalo in qualche modo in una variabile globale?Il modo migliore per ottenere un contesto di applicazione in un metodo statico in Android
risposta
Il modo migliore sarebbe passare l'oggetto Activity come parametro delle funzioni statiche.
AFAIK, non esiste un tale metodo che fornisca il contesto dell'applicazione nel metodo statico.
io non sono sicuro che questo sta andando a lavorare per tutto il tempo, ma funziona per me ora:
public class myActivity extends ListActivity
{
public static Context baseContext;
public void onCreate(Bundle savedInstanceState)
{
baseContext = getBaseContext();
}
allora si può utilizzare la statica nel pacchetto:
myApplication.baseContext
C'è un post in Sane Tricks per il blog InsaneWorld con una risposta. Si dice che è possibile sostituire l'oggetto Application con la propria sottoclasse e quindi mantenere staticamente il contesto dell'app lì. Puoi trovare codice di esempio nel post.
Il post originale - http://uquery.blogspot.co.il/2011/08/how-to-get-application-context.html
A partire da Android Studio 2.2.2, questo approccio genera un Avviso: "Non inserire classi di contesto Android in campi statici, si tratta di una perdita di memoria (e interrompe anche l'esecuzione istantanea). Un campo statico perderà i contesti." – WilliamK
@WilliamK c'è un'eccezione a questa regola con il contesto dell'applicazione. Vive fintanto che la tua app vive, quindi non può perdere. Non mettere però un contesto di attività in un campo statico! – JensV
Questo dovrebbe farti accedere a applicationContext
da qualsiasi luogo che consente di ottenere applicationContext
da nessuna parte che può essere utilizzato; Toast
, getString()
, sharedPreferences
, ecc. Ho usato questo per ottenere applicationContext
all'interno di metodi statici più volte.
Il Singleton:
package com.domain.packagename;
import android.content.Context;
/**
* Created by Versa on 10.09.15.
*/
public class ApplicationContextSingleton {
private static PrefsContextSingleton mInstance;
private Context context;
public static ApplicationContextSingleton getInstance() {
if (mInstance == null) mInstance = getSync();
return mInstance;
}
private static synchronized ApplicationContextSingleton getSync() {
if (mInstance == null) mInstance = new PrefsContextSingleton();
return mInstance;
}
public void initialize(Context context) {
this.context = context;
}
public Context getApplicationContext() {
return context;
}
}
inizializzare il Singleton nel Application
sottoclasse:
package com.domain.packagename;
import android.app.Application;
/**
* Created by Versa on 25.08.15.
*/
public class mApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
ApplicationContextSingleton.getInstance().initialize(this);
}
}
Se io non sono sbagliato, questo ti dà un gancio per ApplicationContext ovunque, lo chiamano con ApplicationContextSingleton.getInstance.getApplicationContext();
Non è necessario cancellarlo in qualsiasi momento, poiché quando l'applicazione si chiude, ciò vale comunque.
ricordarsi di aggiornare AndroidManifest.xml
utilizzare questa Application
sottoclasse:
<?xml version="1.0" encoding="utf-8"?>
<manifest
xmlns:android="http://schemas.android.com/apk/res/android"
package="com.domain.packagename"
>
<application
android:allowBackup="true"
android:name=".mApplication" <!-- This is the important line -->
android:label="@string/app_name"
android:theme="@style/AppTheme"
android:icon="@drawable/app_icon"
>
prega fatemi sapere se si vede qualcosa di sbagliato qui, grazie. :)
Non so se in questo modo sia il modo migliore per farlo. Ma penso che inizializzare i singleton che necessitano di un contesto all'entrata di 'Application' è una buona idea. In caso contrario, devo passare un 'Context' a' SingletonClass.getInstance (Context) 'ogni volta che lo chiamo ed è davvero fastidioso. – ProtossShuttle
Sì, è un po 'fastidioso, ho usato classi come queste [gPrefs] (https://gist.github.com/kai-kb/0393e6239db3b90a771c) [gString] (https: //gist.github .com/kai-kb/3da8389513c21a671dbe) per combattere questo in una certa misura. – Versa
Questo approccio genera anche un avviso relativo alle perdite e problemi di esecuzione immediata: "Non inserire classi di contesto Android in campi statici (riferimento statico a ApplicationContextSingleton che ha il contesto di campo che punta a Contesto), si tratta di una perdita di memoria (e si interrompe anche Instant Esegui) Un campo statico perderà i contesti – WilliamK
- 1. C'è un modo per ottenere la dimensione di un file in .NET usando un metodo statico?
- 2. È possibile rilevare il contesto di classe in un metodo statico ereditato?
- 3. Perché non posso usare getFilesDir(); in un contesto statico?
- 4. Impossibile accedere al metodo non statico in contesto statico?
- 5. Qual è il modo corretto di utilizzare un bean iniettato in un metodo statico?
- 6. Il modo migliore per inizializzare un contesto di un framework di entità?
- 7. La migliore tecnica per ottenere il contesto del bundle OSGi?
- 8. Il modo migliore per determinare l'attuale applicazione in primo piano (in esecuzione) (utilizzando un servizio?)
- 9. compilatore C#: non può accedere metodo statico in un contesto non-statico
- 10. Il modo migliore per eseguire il metodo in modo asincrono in Android (compatto e corretto)
- 11. Variabile globale in un metodo statico
- 12. override un metodo in oggetti creati in modo statico
- 13. @sincronizzato in un metodo statico
- 14. modo migliore per accedere proprietà di classe all'interno di un metodo statico con PHP
- 15. Il metodo non statico richiede un obiettivo?
- 16. C'è un modo statico per ottenere HttpServletRequest della richiesta corrente
- 17. MvvmCross: Qual è il modo migliore per ottenere l'oggetto selezionato da un MvxListView in Android?
- 18. Android, il modo migliore per fornire costanti specifiche per app in un progetto di libreria?
- 19. Il modo migliore per ottenere URL multilingue?
- 20. Qual è il modo migliore per ottenere il nome del tag di un elemento in JS?
- 21. In Gradle, c'è un modo migliore per ottenere variabili d'ambiente?
- 22. Come creare un metodo statico per un plug-in JQuery
- 23. Come ottenere il logger di una classe in un contesto statico?
- 24. Il modo migliore per identificare un utente in modo univoco
- 25. Qual è il modo migliore per identificare il percorso di contesto in JS angolare
- 26. Come ottenere getclass(). GetResource() da un contesto statico?
- 27. Come chiamare un metodo statico in C#
- 28. Modo Groovy per richiamare dinamicamente un metodo statico
- 29. Il modo migliore per creare un ViewModel in MVVM
- 30. Il modo migliore per interrogare un dizionario in C#
Possibile duplicato di [Modo statico per ottenere "Contesto" su Android?] (Http://stackoverflow.com/questions/2002288/static-way-to-get-context-on-android) –