2014-11-27 2 views
4

Я понимаю, почему Android требует, чтобы вы передавали объект Контекста при попытке получить представление, например, Toast и т. Д.Почему Android требует контекста для доступа к ресурсу?

Однако я действительно не хочу, чтобы он обращался к ресурсам, которые могли бы быть разделены различными Контекстами в вашем приложении.

Я несколько раз пытался найти доступ к ресурсу из класса утилиты, используя статический метод или что-то в этом роде, и нахожу довольно раздражающим, чтобы потребовать передачу параметра контекста.

Я не вижу, где что-то может пойти на юг с этим.

+0

Когда вам нужно получить или получить доступ к ресурсу вне зоны действия, вам потребуется контекстная ссылка текущей активности. –

+0

контекст активности подобен интерфейсу класса –

+0

«контекст активности подобен интерфейсу класса»? Я этого не понимаю. –

ответ

2

От official documentation:

Интерфейс глобальной информации о среде приложения. Этот является абстрактным классом, реализация которого обеспечивается системой Android . Это позволяет получить доступ к конкретному приложению ресурсов и классов, а также до-вызовов для операций на уровень приложений, такие как пусковых деятельности, вещание и прием намерений и т.д.

В ясном контексте является посредником между телефонным ресурсом и вашим кодом. И логично, что вы не можете получить доступ к этому извне.

Причины вы можете только доступ к контексту активности и применения классов, потому, что и происходят от контекста:

java.lang.Object

↳ android.content.Context 

    ↳ android.content.ContextWrapper 

     ↳ android.view.ContextThemeWrapper 

      ↳ android.app.Activity 
+2

Возможно, это была хорошая идея в какой-то момент, но объект-бог, живущий внутри суперобъектов, призывал к плохим практикам с первого дня. –

+0

http://www.doubleencore.com/2013/06/context/ –

+0

Я понимаю, что я просто не поймите, почему вы не можете получить доступ к ресурсам своего приложения из любого класса, запущенного в потоке, который был запущен вашим приложением, без передачи объекта Context вокруг – Mateo

1

Продлить класс приложений на вашем собственный public class MyApp extends Application и зарегистрируйте MyApp в своем манифесте и получите MyApp примерно следующее:

class MyApp extends Application { 
... 
private static ApplicationContext context; 

@Override 
public static void onCreate() { 
    super.onCreate(); 
    context = this; 
} 

public static String string(int resId) { 
    return context.getString(resId); 
} 

} 

Тогда вы можете сделать MyApp.string(R.id.mystring) от везде. Вы можете сделать то же самое для других типов ресурсов.

Вы также можете сделать (MyApp)getApplication(), если хотите.

+2

. Ответ на данный вопрос фактически не отвечает на вопрос «Почему Android требует контекста для доступа к ресурсу?», Это просто обходной путь. Кроме того, расширение «Применения» должно выполняться только в конкретных случаях, когда это абсолютно необходимо - в общем случае его следует использовать только для поддержания глобального состояния, а не как трамплина для экземпляра «Контекст». Кроме того, приложение «Контекст» имеет ограничения, поэтому в вашем случае пример дизайна может не работать в определенных ситуациях. – Squonk

+0

Расширение @Squonk «Приложение должно быть сделано только в особых случаях, когда это абсолютно необходимо» - не могли бы вы объяснить, почему? Что касается ответа на исходный вопрос, я утверждаю, что это точно отвечает именно ему. –

+0

Я действительно использую это обходное решение, но только для доступа к ресурсам. То, что я действительно хочу знать, является причиной того, что требуется контекст. – Mateo

Смежные вопросы