2

我正在使用扩展应用程序的常用技术来存储全局常量。

所以在我的活动中,我可以简单地做(在​​ oncreate() 中):

W = (WcmApplication) getApplicationContext();

但是,这不适用于广播接收器:

The method getApplicationContext() is undefined for the type MyReceiver

所以,以为我很聪明,我试着做:

 W = (WcmApplication) context;

...但这会在运行时引发错误,说我的广播接收器不允许访问该上下文

不放弃,我试试这个:

W = (WcmApplication) Context.getApplicationContext();

... 没有骰子

所以我最终不得不这样做:

W = (WcmApplication)context.getApplicationContext() ;

...而且效果很好,但是我不知道为什么。

有人可以解释为什么一个有效而不是其他有效吗?

谢谢!

4

3 回答 3

2

Activity继承Context,因此您可以直接访问getApplicationContext()定义的方法ContextBroadcastReceiver另一方面,它不继承 from Context,这就是为什么它context在调用处理广播时必须从外部接收的原因。

通常,Context您可以从任何组件(ActivityServiceContentProviderBroadcastReceiver)访问的直接指令是特定于该特定组件的,并定义了该组件的执行上下文(因此得名:-))。另一方面,应用程序上下文为整个应用程序定义了更通用的执行上下文。因此,应用程序上下文比组件上下文更广泛。

还要记住,在任何时间点都可能有超过这两个上下文(应用程序和组件)的链接。您可以通过尝试将每个节点(从组件context开始)强制转换为ContextWrapper并且如果成功使用来部分地遍历上下文链getBaseContext。但是,这是一种罕见的高级场景,而且大多数情况下,您关心的链中只有两个上下文- 直接组件和总体应用程序。

于 2013-06-19T17:35:21.293 回答
0

我想我有一个全面的解决方案(最后感谢@Franci Penov 的帖子

这是我的自定义应用程序子类的静态方法。

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;
    }
}
于 2017-09-22T19:06:39.083 回答
-1

这不是应用程序上下文:

(WcmApplication) context;

而是动作的上下文。这就是为什么您需要调用:

(WcmApplication)context.getApplicationContext() ;
于 2013-06-19T17:24:30.500 回答