Какой контекст Android я должен использовать в одиночных играх?

Когда я пишу свои синглтоны, я всегда предоставляю getInstance(Context) метод в классе Singleton. Но какой объект контекста я должен передать этому методу: Контекст действия (this в классе Activity) или в контексте приложения? И какие различия это будет иметь, если я передам один или другой?

Чтобы проиллюстрировать это, у меня есть менеджер баз данных, у которого есть метод getInstance, определенный как:

public static Database getInstance(Context context) {
    if (Database.instance == null)
        instance = new Database(context);
    return instance;
}

И конструктор выглядит так:

private Database(Context context) { 
    this.sqLiteDatabase = context.openOrCreateDatabase(...);
}

1 ответ

Решение

То, что вы проходите, не имеет большого значения. То, что вы используете, должно быть Application контекст:

public static Database getInstance(Context context) {
    if (Database.instance == null)
        instance = new Database(context.getApplicationContext());
    return instance;
}

Теперь, если вы хотите, чтобы вызывающий абонент Application Вы могли бы сделать это:

public static Database getInstance(Application context) {
    if (Database.instance == null)
        instance = new Database(context);
    return instance;
}

Лично мне нравится считать, что это детали реализации, скрытые API.

Application является глобальным объектом, созданным при создании процесса. Следовательно, оно "предварительно просочилось", по сути. Вы не можете пропустить это дальше. Другие типы Context (например, Activity), на который ссылаются некоторые синглтоны, может привести к утечке памяти.

Смотрите эпический пост в блоге Дэйва Смита о ролях разных Context объекты для большего.

Другие вопросы по тегам