Жизненный цикл класса приложения во время работы службы

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

Спасибо.

Ответ 1

  • Что касается объекта приложения:

Объект приложения является основной абсолютной отправной точкой для любого приложения Android. Он всегда будет существовать до любого из объявленных элементов манифеста, таких как Activity, Service и BroadcastReceiver. Поэтому расслабьтесь, чтобы синглтоны были там для вас.

  • Что касается синглэнд-парадигмы:

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

= > на вашем объекте/классе singleton вам придется:

private static MySingletonClass instance; // reference to the single object
private MySingletonClass(Context c){ // private constructor to avoid construction from anywhere else
    // let say it needs the context for construction because it a database singleton
}
public static MySingletonClass get(){ // 
    if(instance == null) throw new RuntimeException("This singleton must be initialised before anything else");
    return instance;
}
public static void init(Context c){ // call the initialisation from the Application
   instance = new MySingletonClass(c);
}

= > , а затем на вашем объекте Application вы просто запустите singleton

onCreate(){
   MySingletonClass.init(getApplicationContext());
}

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

Итак, например, на вашей службе вызов: MySingletonClass.get() и никогда не должен быть MyApplication.mySingle.

надеюсь, что это поможет.

Ответ 2

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

вы можете прочитать здесь для получения дополнительной информации

http://developer.android.com/guide/components/fundamentals.html#proclife