Расширение приложения

Я хотел бы расширить приложение в своем приложении для Android. Я сделал это таким образом, что создал расширенный объект Application с именем MyApplication и добавил его в манифест.

Теперь я хотел бы добавить несколько геттеров и сеттеров для хранения некоторой информации. Похоже, мне нужно будет передать контекст приложения всем классам, которые не содержат контекст.

Например, скажем, я создаю класс с именем MyObject (в своем собственном java-файле):

public class MyObject {
  public void doStuff() {
    // do stuff
  }
}

Как я могу получить доступ к MyApplication из doStuff()? Похоже, мне нужно передать контекст приложения в MyObject. Это типично? Есть ли вероятность течи?

Кроме того, чтобы убедиться, что я понятен, будет ли MyApplication (и переменные внутри) жить на протяжении всего жизненного цикла приложения или нет? В любом случае это хорошо. Я просто хочу убедиться, что я отчитываюсь об этом, если мне нужно.

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


person Andrew    schedule 23.09.2010    source источник


Ответы (2)


Насколько я знаю, передача контекстов не является чем-то исключительным в Android-разработке. Ну либо так, либо я что-то не так делаю.

Я не уверен, нужен ли вам этот ответ или нет, но из контекста вы можете получить доступ к объекту Application следующим образом:

((MyApplication) context.getApplicationContext()).getMyGlobalVariable();

Да, ваш класс MyApplication должен жить на протяжении всего жизненного цикла приложения.

Также ознакомьтесь с этим ответом.

person benvd    schedule 23.09.2010
comment
Благодарю за ваш ответ. Я делаю большую часть своей тяжелой работы в IntentService (где у меня есть доступ к контексту приложения), и большинство других вызовов моих глобальных данных будут из Activity; так что я думаю, что я буду в порядке. В любых других местах (например, в моем примере OP) я могу просто передать данные. - person Andrew; 23.09.2010
comment
Я пытался получить ссылку на мой объект MyApplication в классе, который не был действием, поэтому я не мог использовать типичный (MyApplication) this.getApplication(). Вот где ваш совет очень помог, я просто передал контекст и получил ссылку на MyApplication, огромное спасибо! - person Soham; 23.10.2011

Передача контекста хороша в Android, если вы передаете правильный контекст. Избегайте передачи действий в качестве контекста. Вместо этого используйте getApplicationContext().

Ваш Applicationobject и все данные, связанные с ним, будут сохраняться на протяжении всей жизни вашего приложения. Даже если приложение находится в фоновом режиме и все действия очищаются из памяти, потому что они больше не отображаются. В какое время объект приложения будет очищен из памяти, не очень хорошо документировано, но я думаю, что если ваше приложение находится в фоновом режиме и память редка, ОС может уничтожить все ваше приложение и, следовательно, также удалить объект приложения из памяти.

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

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

person Janusz    schedule 23.09.2010
comment
Просто примечание относительно передачи getApplicationContext(). Не используйте его для запуска намерения открыть веб-страницу — это вызовет исключение. :) - person benvd; 23.09.2010