Ответ 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
.
надеюсь, что это поможет.