Зачем расширять class приложения?

Зачем расширять class Application ?

Что для меня?

Почему ты бы так поступил?

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

Оффлайн, я не могу думать о реальном сценарии, в котором продление Приложения либо предпочтительнее другого подхода, либо необходимо что-то сделать. Если у вас есть дорогостоящий, часто используемый объект, вы можете инициализировать его в IntentService, когда обнаруживаете, что объект в настоящее время отсутствует. Само приложение запускается в streamе пользовательского интерфейса, а IntentService работает в своем streamе.

Я предпочитаю передавать данные с Activity на Activity с явными намерениями или использовать SharedPreferences. Существуют также способы передачи данных из fragmentа в его родительскую активность с использованием интерфейсов.

Введение:

введите описание изображения здесь

  1. Если мы рассматриваем файл apk на нашем мобильном устройстве, он состоит из нескольких полезных блоков, таких как Activity s, Service s и другие.
  2. Эти компоненты не общаются друг с другом регулярно и не забывают, что у них есть свой жизненный цикл. которые указывают, что они могут быть активны одновременно и неактивны в другой момент.

Требования:

  1. Иногда нам может потребоваться сценарий, когда нам нужно получить доступ к переменной и ее состояниям во всем Application независимо от того, какую Activity использует пользователь,
  2. Примером является то, что пользователю может потребоваться доступ к переменной, в которой хранится его информация о персонале (например, имя), к которой необходимо получить доступ через Application ,
  3. Мы можем использовать SQLite, но создаем Cursor и закрываем его снова и снова, это не хорошо для производительности,
  4. Мы могли бы использовать Intent s для передачи данных, но это неудобно, и сама деятельность может не существовать в определенном сценарии в зависимости от доступности памяти.

Использование classа приложения:

  1. Доступ к переменным в Application ,
  2. Вы можете использовать Application для запуска определенных вещей, таких как аналитика и т. Д., Так как class приложения запускается до запуска Activity s или Services s,
  3. Существует переопределенный метод, называемый onConfigurationChanged (), который запускается при изменении конфигурации приложения (по горизонтали и вертикали и наоборот),
  4. Также есть событие, называемое onLowMemory (), которое запускается, когда устройство Android остается низким в памяти.

Класс приложения – это объект, который имеет полный жизненный цикл вашего приложения. Это ваш самый высокий уровень как приложение. пример возможного использования:

  • Вы можете добавить то, что вам нужно, когда приложение запускается путем переопределения onCreate в classе Application.
  • хранить глобальные переменные, которые переходят из Activity в Activity. Как и Asynctask.

    и т.д

Иногда вы хотите хранить данные, такие как глобальные переменные, к которым необходимо получить доступ из нескольких видов деятельности – иногда везде в приложении. В этом случае объект Application поможет вам.

Например, если вы хотите получить базовые данные аутентификации для каждого HTTP- запроса, вы можете реализовать методы для данных аутентификации в объекте приложения.

После этого вы можете получить имя пользователя и пароль в любом из следующих действий:

 MyApplication mApplication = (MyApplication)getApplicationContext(); String username = mApplication.getUsername(); String password = mApplication.getPassword(); 

И, наконец, не забудьте использовать объект Application как одноэлементный объект:

  public class MyApplication extends Application { private static MyApplication xxx; public MyApplication getInstance(){ return singleton; } @Override public void onCreate() { super.onCreate(); singleton = this; } } 

Fore больше информации. Нажмите эту ссылку

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

Вы также получаете немного жизненного цикла.

Вы можете использовать метод onCreate приложения для создания дорогостоящих, но часто используемых объектов, таких как помощник аналитики. Затем вы можете получить доступ к этим объектам и использовать их везде.

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

 public class BaseJuiceApplication extends Application implements BootListener { public static BaseJuiceApplication instance = null; public static Context getInstance() { if (null == instance) { instance = new BaseJuiceApplication(); } return instance; } @Override public void onCreate() { super.onCreate(); } @Override public void onBootCompleted(Context context, Intent intent) { new PushService().scheduleService(getInstance()); //startToNotify(context); } 

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

Например, вы обычно запускаете свою деятельность через пусковую установку, затем «сворачиваете» ее. Затем вы запускаете другое приложение (например, Tasker), которое запускает другой экземпляр вашей активности, например, чтобы создать ярлык, потому что ваше приложение поддерживает android.intent.action.CREATE_SHORTCUT. Если затем создается ярлык, и этот вызов, создающий ярлык, активирует действие объекта приложения, тогда действие, выполняющееся в фоновом режиме, начнет использовать этот модифицированный объект приложения, как только он будет возвращен на передний план.

Я вижу, что на этот вопрос отсутствует ответ. Я продлеваю Application потому что я использую реализацию Билла Пью Синглтона ( см. Ссылку ), и некоторые из моих синглетов нуждаются в контексте. Класс Application выглядит следующим образом:

 public class MyApplication extends Application { private static final String TAG = MyApplication.class.getSimpleName(); private static MyApplication sInstance; @Contract(pure = true) @Nullable public static Context getAppContext() { return sInstance; } @Override public void onCreate() { super.onCreate(); Log.d(TAG, "onCreate() called"); sInstance = this; } } 

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

 public class DataManager { private static final String TAG = DataManager.class.getSimpleName(); @Contract(pure = true) public static DataManager getInstance() { return InstanceHolder.INSTANCE; } private DataManager() { doStuffRequiringContext(MyApplication.getAppContext()); } private static final class InstanceHolder { @SuppressLint("StaticFieldLeak") private static final DataManager INSTANCE = new DataManager(); } } 

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

Совет. Обновление шаблона Singleton для Android Studio экономит много времени.

Источник: https://github.com/codepath/android_guides/wiki/Understanding-the-Android-Application-Class

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

  • Специализированные задачи, которые должны выполняться до создания вашего первого действия
  • Глобальная инициализация, которая должна быть разделена между всеми компонентами (отчеты о сбоях, постоянство)
  • Статические методы для легкого доступа к статическим неизменяемым данным, таким как общий сетевой клиентский объект

Вы никогда не должны хранить изменяемые данные экземпляра внутри объекта Application, потому что, если вы предполагаете, что ваши данные останутся там, ваше приложение неизбежно сбой в какой-то момент с помощью NullPointerException. Объект приложения не гарантированно останется в памяти навсегда, он будет убит. Вопреки распространенному мнению, приложение не будет перезапущено с нуля. Android создаст новый объект приложения и начнет действие, в котором пользователь раньше был, чтобы представить иллюзию, что приложение никогда не было убито в первую очередь.

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

http://www.intridea.com/blog/2011/5/24/how-to-use-application-object-of-android

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

Начните с создания classа, расширяющего Android android.app.Application. Android создает экземпляр этого classа, когда приложение запускается – то есть, когда запускается процесс DVM для запуска вашего apk. В качестве примера того, как работает приложение, давайте предположим, что мы создаем какой-то тип игры. В нашем игровом приложении будет несколько экранов – каждый экран в этом случае будет Activity. Игроки игры генерируют очки на каждом экране, и их оценка должна отслеживаться на многих экранах нашей гипотетической игры. Чтобы отслеживать игровой счет пользователя во многих действиях, составляющих игру, нам нужно место для хранения игрового счета на время игры – это до тех пор, пока выполняется процесс приложения.

Я думаю, вы можете использовать class Application для многих вещей, но все они связаны с вашими потребностями, чтобы сделать что-то до того, как начнутся какие-либо ваши действия или службы. Например, в моем приложении я использую пользовательские шрифты. Вместо вызова

Typeface.createFromAsset()

из каждого действия, чтобы получить ссылки на мои шрифты из папки «Активы» (это плохо, потому что это приведет к утечке памяти, поскольку вы сохраняете ссылку на активы каждый раз, когда вы вызываете этот метод), я делаю это из onCreate() в мой class приложения:

 private App appInstance; Typeface quickSandRegular; ... public void onCreate() { super.onCreate(); appInstance = this; quicksandRegular = Typeface.createFromAsset(getApplicationContext().getAssets(), "fonts/Quicksand-Regular.otf"); ... } 

Теперь у меня также есть метод, определенный следующим образом:

 public static App getAppInstance() { return appInstance; } 

и это:

 public Typeface getQuickSandRegular() { return quicksandRegular; } 

Итак, из любого места в моем приложении все, что мне нужно сделать, это:

 App.getAppInstance().getQuickSandRegular() 

Другое использование classа Application для меня – проверить, подключено ли устройство к Интернету, прежде чем действия и службы, требующие фактического начала соединения, и предпринять необходимые действия.

Давайте будем гением компьютера.