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


зачем расширять Application класса?

что в этом для меня?

зачем тебе это делать?

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

13 145

13 ответов:

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

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

введение:

enter image description here

  1. если мы рассмотрим apk файл в нашем мобильном телефоне, он состоит из несколько полезных блоков, таких как,Activitys,Services и другие.
  2. эти компоненты не связывают друг с другом регулярно и не забывайте, что у них есть свой жизненный цикл. которые указывают на то, что они могут быть активны в одно время и бездействовать другие момент.

требования:

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

использование класса Application:

  1. доступ к переменным через Application,
  2. можно использовать Application чтобы начать определенные вещи, такие как аналитика так далее. так как класс приложения запускается до Activitys или Servicess бегут,
  3. существует переопределенный метод onConfigurationChanged (), который срабатывает при изменении конфигурации приложения (по горизонтали к вертикали и наоборот),
  4. существует также событие под названием onLowMemory (), которое запускается, когда у устройства Android мало памяти.

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

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

    etc

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

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

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

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

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

 public class MyApplication extends Application {
    private static MyApplication xxx;

    public MyApplication getInstance(){
        return singleton;
    }
    @Override
    public void onCreate() {
        super.onCreate();
        singleton = this;
    }
}

подробнее. Пожалуйста, нажмите на это ссылке

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

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

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

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

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.намерение.действие.СОЗДАТЬ ЯРЛЫК. Если затем создается ярлык и этот вызывающий ярлык вызов действия изменяет данные объекта приложения, то действие, выполняемое в фоновом режиме, начнет использовать этот измененный объект приложения, как только он будет возвращен на передний план.

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

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

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

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

Я вижу, что этот вопрос отсутствует ответ. Я расширяю 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();
    }
}

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

Совет: обновление шаблона Android Studio singleton экономит много времени.

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

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

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

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

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

Typeface.createFromAsset()

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

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()

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