2015-01-29 1 views
0

У меня есть очень простой код, который отображает Toast сообщений на платформе Button мышиAndroid объекта контекста в пользовательском классе

public class MainActivity extends Activity { 

Button clickMe; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    clickMe = (Button) findViewById(R.id.button1); 
    clickMe.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      Toast msg = Toast.makeText(getApplicationContext(), "Hello World !", Toast.LENGTH_LONG); 
      msg.show(); 
     } 
    }); 
} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.main, menu); 
    return true; 
    } 
    } 

Я задавался вопрос, как я могу получить ссылку на объект контекста просто вызов

getApplicationContext() 

внутри Toasts' makeText метода, так как я никогда не реализованным контекст (который я не могу в любом случае, так как это абстрактное), ни его подклассы.

Может ли кто-нибудь объяснить мне, когда (или где) была создана ссылка и как она появилась в моем классе MainActivity?

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

+0

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

ответ

1

getApplicationContext() Возврат контекста одиночный, глобальный Объект приложения текущего процесса.

Это, как правило, должны использоваться только тогда, когда вам нужен контекст, чей жизненный цикл отдельно от текущего контекста (т.е. вашей деятельности), который привязан к жизни процесса, а не текущего компонента.

Рассмотрим, например, как это взаимодействует с registerReceiver (BroadcastReceiver, IntentFilter):

Если используется из контекста деятельности, получатель регистрируется в этой деятельности. Это означает, что вы должны отменить регистрацию до того, как действие будет уничтожено; на самом деле, если вы этого не сделаете, структура очистит вашу пропущенную регистрацию, поскольку она удалит действие и зарегистрирует ошибку. Таким образом, если вы используете контекст Activity для регистрации ресивера, который является статическим (глобальным для процесса, не связанным с экземпляром Activity), тогда эта регистрация будет удалена на вас в любой момент, когда ваша деятельность будет уничтожена. Если используется из контекста, возвращаемого здесь, ресивер регистрируется с глобальным состоянием, связанным с вашим приложением. Таким образом, он никогда не будет незарегистрирован для вас. Это необходимо, если приемник связан со статическими данными, а не с конкретным компонентом. Однако с помощью ApplicationContext в другом месте может легко привести к серьезным утечкам, если вы забыли отменить, отвязать и т.д.

Этот кусок текста из документацииgetApplicationContext();

+0

Спасибо, я уже прочитал документацию, но это не дает ответа на мой вопрос. –

+0

Он отвечает на ваш вопрос «Может ли кто-нибудь объяснить мне, когда (или где) ссылка была создана и как она появилась в моем классе MainActivity?«Когда ваше приложение запускается, создается глобальный контекст –

0

Не знаете, что именно вы запрашиваете, но ваша MainActivity расширяет действие, которое расширяет некоторые другие классы, расширяющие класс Context, в котором вы получаете метод getApplicationContext().

Согласно Context class docs: Это абстрактный класс, реализация которого обеспечивается системой Android. Он позволяет получать доступ к ресурсам и классам приложений, а также к вызовам для приложений на уровне приложений, таким как запуск, трансляция и получение намерений и т. Д.

+0

Да, я знаю, что, согласно документации по android, реализация обеспечивается системой Android. Я знаю, что система создала установку объекта Context (один из его подклассов), но я не получаю «как» эта ссылка доступна в моем классе «MainActiv». Является ли факт, что 'MainActivity' extends'Activity' достаточно, чтобы получить эту ссылку? Я так не думаю –

+0

Я не 100% конечно, не глядя в какой-то код, но я бы предположил, что при создании класса Activity (или любого класса, который расширяет контекст) система Android автоматически инициализирует ссылку на контекст приложения. –