Accesso alle risorse senza un contesto

Sto cercando di mettere la configurazione, come URL / etc, in una cartella di risorse per una class di utilità da utilizzare. Tuttavia, non voglio passare il contesto dalle attività ovunque. Mi piacerebbe essere in grado di accedere a una risorsa tramite il nome di un percorso (sembra come risorse / è stato progettato per questo uso), senza utilizzare un contesto per accedere alla risorsa.

In questo caso particolare, voglio che un singleton usi qualcosa nella configurazione quando viene istanziato. Non ha bisogno di nulla da risorse oltre che una volta durante l’istanziazione. Pertanto, dover passare in un contesto ogni volta che getInstance () viene chiamato sarebbe uno spreco completo.

Inoltre, questo è specifico per la configurazione dell’app e non deve essere memorizzato in un file di sistema condiviso o qualcosa del genere.

Uso

Resources.getSystem().getString(android.R.string.someuniversalstuff) 

Puoi usarlo ASSOLUTAMENTE OVUNQUE nella tua applicazione, anche nella dichiarazione delle costanti statiche! Ma solo per le risorse di sistema .

Per le risorse locali usa questa soluzione .

È ansible estendere la class principale dell’applicazione e fornire lì aiutanti universali per accedere alle risorse. Ciò elimina la necessità di contesto in quanto l’applicazione fornirebbe il contesto anziché il chiamante. La class dell’applicazione è in stile singleton e deve essere sempre disponibile mentre è in esecuzione qualsiasi parte dell’applicazione (inclusi i servizi).

 public class MyApplication extends Application { protected static MyApplication instance; @Override public void onCreate() { super.onCreate(); instance = this; } public static Resources getResources() { return instance.getResources(); } } 

Questo ti consente di accedere a:

 MyApplication.getResources().... 

Assicurati di dichiarare la tua applicazione personalizzata nel tuo manifest per avere accesso a questo. Supponendo che l’applicazione personalizzata si trovi nella radice dello spazio dei nomi dell’applicazione:

  

Sfortunatamente non penso che ci sia un modo reale attorno a questo. Metto il mio fuori qualcosa di simile, e anche passare in getApplicationContext () invece del contesto di attività.

 public static AppController getAppController(Context context){ if(self == null) { //Create instance self = new AppController(); } return self; } 

E poi:

 appController = AppController.getAppController(getApplicationContext()); 

Raccomanderei di fare quanto segue: Piuttosto che passare il contesto ovunque, rendi la class di attività una class singleton con una funzione pubblica che restituisce il contesto:

 private static ActivityMain instance; 

Inizializza all’interno di onCreate () prima di super.onCreate ():

 instance = this; 

Quindi aggiungi queste funzioni pubbliche alla tua attività:

 /** Get singleton instance of activity **/ public static ActivityMain getInstance() { return instance; } /** Returns context of this activity **/ public static Context getContext(){ return instance.getApplicationContext(); } 

Ora puoi utilizzare quanto segue in qualsiasi class:

 Context context = AntiMorphActivity.getContext(); String packageName = context.getPackageName(); int id = context.getResources().getIdentifier("web_page", "raw", packageName); 

La risposta StackOverflow alla domanda seguente mostra come utilizzare POJO per ottenere un stream verso una risorsa, se si fornisce il percorso. Questo potrebbe essere utile nei casi in cui è necessario selezionare una risorsa specifica da una delle tante.

È ansible leggere un file di testo non elaborato senza riferimento al contesto in un progetto di libreria Android