Расширенный класс Application
может объявлять глобальные переменные. Есть ли другие причины?
Зачем расширять класс приложений Android?
Ответ 1
Оффлайн, я не могу думать о реальном сценарии, в котором продление Приложения либо предпочтительнее другого подхода, либо необходимо что-то сделать. Если у вас есть дорогостоящий, часто используемый объект, вы можете инициализировать его в IntentService, когда обнаруживаете, что объект в настоящее время отсутствует. Само приложение запускается в потоке пользовательского интерфейса, а IntentService работает в своем потоке.
Я предпочитаю передавать данные с Activity на Activity с явным намерениями или использовать SharedPreferences. Существуют также способы передачи данных из фрагмента в его родительскую активность с использованием интерфейсов.
Ответ 2
Вступление:
- Если мы рассматриваем файл
apk
на нашем мобильном устройстве, он состоит из нескольких полезных блоков, таких какActivity
,Service
и другие. - Эти компоненты не общаются друг с другом регулярно и не забывают, что у них есть свой жизненный цикл. которые указывают, что они могут быть активны одновременно и неактивны в другой момент.
Требования:
- Иногда нам может потребоваться сценарий, когда нам нужно получить доступ к переменной и ее состояниям во всем
Application
независимо от того, какуюActivity
использует пользователь, - Примером является то, что пользователю может потребоваться доступ к переменной, в которой хранится его информация о персонале (например, имя), к которой необходимо получить доступ через
Application
, - Мы можем использовать SQLite, но создаем
Cursor
и закрываем его снова и снова, это не хорошо для производительности, - Мы могли использовать
Intent
для передачи данных, но это неудобно, и сама деятельность может не существовать при определенном сценарии в зависимости от доступности памяти.
Использование класса приложения:
- Доступ к переменным в
Application
, - Вы можете использовать
Application
для запуска определенных вещей, таких как аналитика и т.д., Так как класс приложения запускается до запускаActivity
илиServices
, - Существует переопределенный метод, называемый onConfigurationChanged(), который запускается при изменении конфигурации приложения (по горизонтали и вертикали и наоборот),
- Также есть событие, называемое onLowMemory(), которое запускается, когда устройство Android остается низким в памяти.
Ответ 3
Класс приложения - это объект, который имеет полный жизненный цикл вашего приложения. Это ваш самый высокий уровень как приложение. пример возможных способов использования:
- Вы можете добавить то, что вам нужно, когда приложение запускается, переопределяя onCreate в классе Application.
-
хранить глобальные переменные, которые переходят из Activity в Activity. Как и Asynctask.
и т.д.
Ответ 4
Иногда вы хотите хранить данные, например, глобальные переменные, к которым нужно обращаться из нескольких действий - иногда везде в приложении. В этом случае вам поможет объект Application.
Например, если вы хотите получить базовые данные аутентификации для каждого запроса http, вы можете реализовать методы для данных аутентификации в объекте приложения.
После этого вы можете получить имя пользователя и пароль в любом из следующих действий:
MyApplication mApplication = (MyApplication)getApplicationContext();
String username = mApplication.getUsername();
String password = mApplication.getPassword();
И, наконец, не забудьте использовать объект Application в качестве одноэлементного объекта:
public class MyApplication extends Application {
private static MyApplication singleton;
public MyApplication getInstance(){
return singleton;
}
@Override
public void onCreate() {
super.onCreate();
singleton = this;
}
}
Для получения дополнительной информации. Пожалуйста, нажмите эту ссылку LINK
Ответ 5
Класс Application - одноэлементный, который вы можете получить из любой активности или где-либо еще, у вас есть объект Context.
Вы также получаете немного жизненного цикла.
Вы можете использовать метод Application onCreate для создания дорогостоящих, но часто используемых объектов, таких как помощник аналитики. Затем вы можете получить доступ к этим объектам и использовать их везде.
Ответ 6
Лучшее использование класса приложения. Пример. Предположим, вам нужно перезапустить диспетчер аварийных сообщений при завершении загрузки.
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);
}
Ответ 7
Не ответ, а наблюдение: имейте в виду, что данные в расширенном объекте приложения не должны привязываться к экземпляру активности, а возможно, что у вас есть два экземпляры одного и того же действия, выполняемые одновременно (один на переднем плане и один не отображается).
Например, вы обычно запускаете свою деятельность через пусковую установку, а затем "сворачиваете" ее. Затем вы запускаете другое приложение (например, Tasker), которое запускает другой экземпляр вашей активности, например, чтобы создать ярлык, потому что ваше приложение поддерживает android.intent.action.CREATE_SHORTCUT. Если затем создается ярлык, и это ярлык, создающий вызов активности, модифицировал данные объекта приложения, тогда действие, выполняющееся в фоновом режиме, начнет использовать этот модифицированный объект приложения, как только он будет возвращен на передний план.
Ответ 8
Я вижу, что на этот вопрос отсутствует ответ. Я расширяю Application
, потому что я использую Bill Pugh Singleton реализация (см. ссылку), и некоторые из моих синглетов нуждаются в контексте. Класс 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 и получаю ленивую синхронизированную инициализацию с минимальным количеством кода.
Совет: обновление шаблона Singleton для Android Studio экономит много времени.
Ответ 9
Источник: https://github.com/codepath/android_guides/wiki/Understanding-the-Android-Application-Class
Во многих приложениях нет необходимости работать с классом приложения напрямую. Тем не менее, существует несколько приемлемых применений пользовательского класса приложения:
- Специализированные задачи, которые должны выполняться до создания вашего первого действия
- Глобальная инициализация, которая должна быть разделена между всеми компонентами (отчеты о сбоях, постоянство)
- Статические методы для легкого доступа к статическим неизменяемым данным, таким как общий сетевой клиентский объект
Вы никогда не должны хранить изменяемые данные экземпляра внутри объекта Application, потому что, если вы предполагаете, что ваши данные останутся там, ваше приложение неизбежно сбой в какой-то момент с помощью NullPointerException. Объект приложения не гарантированно останется в памяти навсегда, он будет убит. Вопреки распространенному мнению, приложение не будет перезапущено с нуля. Android создаст новый объект приложения и начнет действие, в котором пользователь раньше был, чтобы представить иллюзию, что приложение никогда не было убито в первую очередь.
Ответ 10
Вы можете получить доступ к переменным в любой класс без создания объектов, если их расширение распространяется на приложение. Их можно назвать глобально, и их состояние сохраняется до тех пор, пока приложение не будет убито.
Ответ 11
Использование расширяющего приложения просто делает ваше приложение уверенным для любой операции, которую вы хотите на протяжении всего периода работы приложения. Теперь это могут быть любые переменные и предположим, что если вы хотите получить некоторые данные с сервера, тогда вы можете поместить свою асинтезу в приложение, чтобы она извлекалась каждый раз и непрерывно, чтобы вы автоматически обновляли данные. Используйте эту ссылку для большего знания....
http://www.intridea.com/blog/2011/5/24/how-to-use-application-object-of-android
Ответ 12
Я думаю, вы можете использовать класс Application для многих вещей, но все они связаны с вашей потребностью делать что-то до того, как начнутся какие-либо ваши действия или службы. Например, в моем приложении я использую пользовательские шрифты. Вместо вызова
Typeface.createFromAsset()
из каждой операции, чтобы получить ссылки на мои шрифты из папки "Активы" (это плохо, потому что это приведет к утечке памяти, поскольку вы сохраняете ссылку на активы каждый раз, когда вы вызываете этот метод), я делаю это из onCreate()
в моем классе приложения:
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()
Еще одно использование класса Application для меня - проверить, подключено ли устройство к Интернету, прежде чем действия и службы, требующие фактического начала соединения, и предпринять необходимые действия.
Ответ 13
Начните с создания класса, который расширяет андроиды android.app.Application. Android создает экземпляр этого класса, когда приложение запускается - то есть, когда запускается процесс DVM для запуска вашего apk. В качестве примера того, как работает приложение, позволяет предположить, что мы создаем какой-то тип игры. В нашем игровом приложении будет несколько экранов - каждый экран в этом случае будет Activity. Игроки игры генерируют очки на каждом экране, и их оценка должна отслеживаться на многих экранах нашей гипотетической игры. Чтобы отслеживать оценку игры пользователей по многим видам деятельности, которые составляют игру, нам нужно место для хранения игрового счета на время игры - это до тех пор, пока выполняется процесс приложения.
Ответ 14
Чтобы добавить другие ответы, в которых указано, что вы можете сохранить переменные в области приложения, для любых длинных потоков или других объектов, которые нуждаются в привязке к вашему приложению, где вы НЕ используете активность (приложение не является активностью). например, неспособность запросить привязанный сервис.. тогда предпочтительнее привязка к экземпляру приложения. Единственное очевидное предупреждение при таком подходе состоит в том, что объекты живут до тех пор, пока приложение остается в живых, поэтому требуется более неявный контроль над памятью, иначе вы столкнетесь с проблемами, связанными с памятью, такими как утечки.
Что-то еще, что может показаться полезным, заключается в том, что в порядке операций приложение запускается сначала перед любыми действиями. В этот период вы можете подготовить все необходимые домашние хозяйства, которые произойдут до вашей первой деятельности, если вы этого захотите.
2018-10-19 11:31:55.246 8643-8643/: application created
2018-10-19 11:31:55.630 8643-8643/: activity created