2012-04-07 14 views
2

Ich verwende die übliche Technik der Erweiterung der Anwendung, um globale Konstanten zu speichern.Wie man von einem Rundfunkempfänger auf den Anwendungskontext verweist

Also in meiner Tätigkeit, kann ich einfach tun (in oncreate()):

W = (WcmApplication) getApplicationContext(); 

Dies ist jedoch nicht für Rundfunkempfänger funktioniert:

The method getApplicationContext() is undefined for the type MyReceiver 

Also, dachte ich gescheit zu sein, habe ich versucht zu tun:

... aber das wirft einen Fehler zur Laufzeit sagt mein Broadcast-Empfänger ist nicht al

W = (WcmApplication) Context.getApplicationContext(); 

... keine Würfel

So landete ich mit tun: diese lowed, um diesen Kontext

Nicht Aufgeben

zugreifen, ich versuche

W = (WcmApplication)context.getApplicationContext() ; 

.. und das funktioniert gut, aber ich habe keine Ahnung warum.

Kann jemand erklären, warum man arbeitet und nicht die anderen?

Vielen Dank!

+0

was wollen Sie mit diesem Kontext? – Sameer

+0

Nun, ohne den Kontext kann ich nicht zu meiner benutzerdefinierten Anwendung wie im Manifest deklariert. –

+0

Ich habe diese Anforderung nie erfüllt, um Anwendung wie in Manifest deklariert. Es wird einfach sein, Ihre Frage zu beantworten, wenn Sie es spezifischer machen – Sameer

Antwort

-1

Dies ist nicht Anwendungskontext:

(WcmApplication) context; 

sondern Rahmen einer Klage. Dies ist, warum Sie anrufen müssen:

(WcmApplication)context.getApplicationContext() ; 
2

Activity erbt Context, damit Sie auf Context direkten Zugriff auf die getApplicationContext() Methode definiert haben. BroadcastReceiver erbt dagegen nicht von Context, weshalb es von außen die context empfangen muss, wenn es aufgerufen wird, eine Übertragung zu verarbeiten.

Im Allgemeinen ist die direkte Context haben Sie Zugriff auf von jeder Komponente (Activity, Service, ContentProvider oder BroadcastReceiver) ist eine spezifisch für diese bestimmte Komponente und definiert den Kontext der Ausführung dieser Komponente (daher auch der Name: -)). Der Anwendungskontext definiert andererseits einen allgemeineren Kontext der Ausführung für die gesamte Anwendung. So ist die Anwendung Kontext ein breiter als die Komponente Kontext.

Denken Sie daran, dass es möglich ist, mehr als diese beiden Kontexte (Anwendung und Komponente) zu einem beliebigen Zeitpunkt angekettet zu haben. Sie könnten die Kette der Kontexte teilweise durchlaufen, indem Sie versuchen, jeden Knoten (ausgehend von der Komponente Kontext) zu ContextWrapper zu konvertieren und bei erfolgreicher Verwendung getBaseContext.Dies ist jedoch ein seltenes fortgeschrittenes Szenario, und meistens gibt es nur zwei Kontexte in der Kette, die Sie interessieren - die unmittelbare Komponente eins und die übergeordnete Anwendung eins.

0

Ich glaube, ich habe eine umfassende Lösung (schließlich dank @Franci Penov der Post)

Dies ist eine statische Methode auf meine benutzerdefinierte Anwendungsunterklasse.

public static MyApp get(@NonNull final Context context) 
{ 
    if(s_instance != null) 
    { 
     return s_instance; 
    } 
    else 
    { 
     if(context instanceof Activity) 
     { 
      final Activity activity = (Activity) context; 
      s_instance = (MyApp) activity.getApplication(); 
     } 
     else if(context instanceof Service) 
     { 
      final Service service = (Service) context; 
      s_instance = (MyApp) service.getApplication(); 
     } 
     else if(context instanceof ContextWrapper) 
     { 
      final ContextWrapper contextWrapper = (ContextWrapper) context; 
      s_instance = (MyApp) contextWrapper.getBaseContext().getApplicationContext(); 
     } 
     else 
     { 
      s_instance = (MyApp) context.getApplicationContext(); 
     } 

     return s_instance; 
    } 
} 
Verwandte Themen