在Android应用中,以下方法是否存在问题:

public class MyApp extends android.app.Application {

    private static MyApp instance;

    public MyApp() {
        instance = this;
    }

    public static Context getContext() {
        return instance;
    }

}

并在需要上下文的地方传递它(例如SQLiteOpenHelper)(当然不泄漏)?


当前回答

您正在尝试创建一个包装器来获取应用程序上下文,它可能会返回“null”指针。

根据我的理解,我猜更好的方法是调用- 2中的任何一个 Context.getApplicationContext()或Activity.getApplication()。

其他回答

这是一个很好的方法。我自己也用。我只建议重写onCreate来设置单例,而不是使用构造函数。

既然你提到SQLiteOpenHelper:在onCreate(),你可以打开数据库以及。

就我个人而言,我认为文档错误地说,通常不需要子类化应用程序。我认为恰恰相反:你应该总是子类化Application。

我将使用应用程序上下文在构造函数中获取系统服务。这简化了测试,并从组合中获益

public class MyActivity extends Activity {

    private final NotificationManager notificationManager;

    public MyActivity() {
       this(MyApp.getContext().getSystemService(NOTIFICATION_SERVICE));
    }

    public MyActivity(NotificationManager notificationManager) {
       this.notificationManager = notificationManager;
    }

    // onCreate etc

}

Test类将使用重载构造函数。

Android将使用默认构造函数。

应用程序类:

import android.app.Application;
import android.content.Context;

public class MyApplication extends Application {

    private static Context mContext;

    public void onCreate() {
        super.onCreate();
        mContext = getApplicationContext();
    }

    public static Context getAppContext() {
        return mContext;
    }

}

在AndroidManifest中声明应用:

<application android:name=".MyApplication"
    ...
/>

用法:

MyApplication.getAppContext()

我喜欢它,但我建议改用单例:

package com.mobidrone;

import android.app.Application;
import android.content.Context;

public class ApplicationContext extends Application
{
    private static ApplicationContext instance = null;

    private ApplicationContext()
    {
        instance = this;
    }

    public static Context getInstance()
    {
        if (null == instance)
        {
            instance = new ApplicationContext();
        }

        return instance;
    }
}

这种方法有几个潜在的问题,尽管在很多情况下(比如您的例子)它会工作得很好。

特别是在处理任何需要Context的GUI时,都应该非常小心。例如,如果你将应用Context传递给LayoutInflater,你会得到一个Exception。一般来说,您的方法是优秀的:在活动中使用活动的上下文,在传递超出活动范围的上下文时使用应用程序上下文,以避免内存泄漏,这是一个很好的实践。

此外,作为模式的替代方法,您可以使用在上下文对象(例如活动)上调用getApplicationContext()的快捷方式来获取应用程序上下文。