【问题标题】:Android context over the whole application整个应用程序的 Android 上下文
【发布时间】:2013-05-04 17:33:58
【问题描述】:

这个问题旨在向社区询问我为我的应用采取的方法是否正确或可能有一些副作用:

我创建了: - 一个名为 MasterAcitity 的 Activity,从我的应用程序中的每个 Activity 扩展而来。 manifest中的application标签声明如下

<application
        android:name="my.package.name.MyApplication"
        android:icon="@drawable/icon"
        android:label="@string/app_name"
        android:theme="@style/ApplicationStyle" >
  • 一个名为 MyApplication 的类,它扩展了 android.App.Application,它具有以下代码

    private static Context _context;
    
    public static Context getContext() {
        return _context;
    }
    
    public static void setContext(Context context) {
        _context = context;
    }
    
  • 在清单中,应用程序标签声明如下

    <application
        android:name="my.package.name.MyApplication"
        android:icon="@drawable/icon"
        android:label="@string/app_name"
        android:theme="@style/ApplicationStyle" >
    

MasterActivity 在 OnResume 和 OnCreate 方法中执行这段代码

MyApplication.setContext(this);

应用程序的每个活动都扩展了 MasterActivity。

应用中有一个类,叫做 DialogHelper,它有一个静态方法

public static void showDialog(String message)

它使用android.app.AlertDialog.Builder 来创建和显示一个对话框,并使用MyApplication.getContext() 作为上下文

所以我可以在我的应用程序的任何地方使用

DialogHelper.showDialog("my message");

这种方法行得通吗?或者我需要注意什么?

我的疑问在于静态上下文...

谢谢

【问题讨论】:

  • 您可以使用 getaplicationcontext()。你试过吗?
  • 您必须在需要时传递上下文。这可能会导致内存泄漏。
  • @itsrajesh4uguys,我有一些带有静态方法的类应该显示对话框 Anis,你能解释一下为什么它会导致内存泄漏吗?
  • @SimonVeloper :“我有一些带有静态方法的类应该显示对话框”-出于兴趣,这些“类”扩展了什么?
  • 在访问这些类时只需将上下文作为参数传递

标签: android android-context


【解决方案1】:

这种方法行得通吗?

使用Application 进行 UI 工作有导致问题的历史。在给定的一组情况下使用 Activity 或专用 Context(例如,ActionBar 上的 getThemedContext()getContext() 上的 Presentation)。

【讨论】:

  • 我同意你的观点,但我不明白为什么这种方法会导致一些问题。我不明白的是,从调用该方法的当前活动传递上下文和让静态方法 showDialog 获取始终从每个活动更新的上下文(在 onCreate 方法设置上下文时)的区别。我不是在使用相同的上下文引用吗?
  • @SimonVeloper:实际上,恕我直言,你的方法比我想象的更糟糕。我误读了您的帖子,尽管Application 持有的ContextApplication。不要将其他Context 对象放在静态数据成员中,因为您有内存泄漏的风险。此外,对于Dialog,由于它们只能由Activity 启动,因此只需将this 用于Context
【解决方案2】:

您还应该有一个 onDestroy 处理程序,如果上下文属于正在销毁的活动,则该处理程序将上下文重置为 null。

我更喜欢这样的 api,而不是全局静态上下文

 DialogHelper.showDialog(this.getContext(),"my message");

[2013 年 5 月更新]

每个 Activity、Service 、BroadcastReceiver 都是indirectly derived from Context via ContextWrapper 和 Views 等其他类保存和使用 Context。他们通常通过 getContext() 函数公开它。所以上下文应该在必要时可用。

【讨论】:

  • 首先,BroadcastReceiver 不会扩展 Context。其次ActivityServiceBroadcastReceiver 没有名为getContext() 的方法。最后,为什么扩展Context 的类需要一个方法来获取自身的实例?任何扩展 Context 的东西都可以简单地使用 thisContext 实例传递给另一个类。
  • 你是对的,BroadcastReceiver 不是上下文。我更新了我的答案并重新制定了最后一部分以更清楚地说明我的意思
猜你喜欢
  • 1970-01-01
  • 2014-06-24
  • 1970-01-01
  • 2015-04-19
  • 2014-05-14
  • 2013-07-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多