
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[216.73.216.52] |
![]() |
|
Сообщ.
#1
,
|
|
|
Всем привет!
Очередной вопрос, но совсем другой, решил вынести в отдельную тему. В одной из дополнительных Activity мне нужно получить доступ к объектам из главной Activity, нестатическим. Есть ли способ получить ссылку на главную Activity в дочерней? Знаю про getCallingActivity(), все-таки главная Activity у меня эту, над которой сейчас тружусь, и вызывает. Но с помощью startActivity(), поэтому этод метод не сработает. А вообще, наверно, вопрос более широкий. Как лучше в Android-приложении хранить общие данные-объекты, к которым может иметь доступ любая деятельность или какой-нибудь другой вспомогательный класс (например, я написал иерархию классов для обмена информацией с сервером, каждый неабстрактный класс выполняет получение или передачу конкретных данных). Какие-то там плагины, использование кода других разработчиков не планируются, поэтому эти общие данные могут быть доступны где угодно в приложении, не надо беспокоиться о разграничении доступа. Заранее всем спасибо! Добавлено Вижу возможный такой способ. Забацать класс со статическими полями для разных объектов. В любом другом классе можно будет к любому объекту напрямую обратиться. Или у этого способа есть свои минусы? |
Сообщ.
#2
,
|
|
|
Цитата Homez @ Как лучше в Android-приложении хранить общие данные-объекты, к которым может иметь доступ любая деятельность или какой-нибудь другой вспомогательный класс Уж точно не в активити. Активити - вещь весьма непостоянная и вообще предназначена для другого. Цитата Homez @ Вижу возможный такой способ. Забацать класс со статическими полями для разных объектов. В любом другом классе можно будет к любому объекту напрямую обратиться. Или у этого способа есть свои минусы? Не надо лишней статики. Покури про синглтоны и разбей программу на логические модули. У меня, например, в проекте довольно много классов с синглтонами, каждый из которых занимается каким-то своим делом - менеджер маршрутов, менеджер рендеринга, менеджер звука, менеджер локализации и т.п. |
Сообщ.
#3
,
|
|
|
Ну а как ты получаешь там, где нужно, нужные объекты? Или это и есть фишка синглтона - тебе как-то возвращается уже готовый объект, если он был создан?
|
Сообщ.
#4
,
|
|
|
Цитата Homez @ фишка синглтона Заключается в том, что класс содержит статический указатель на самого себя и статический метод - getter. Этот метод может быть вызван откуда угодно и в случае с "ленивой инициализацией" сам создаёт объект, если он ещё не был создан. На хабре была хорошая статья про синглтоны в Java. кземпляр такого объекта, т.к. указатель на этот объект статический, т.е. один на весь процесс. |
Сообщ.
#5
,
|
|
|
Гм, почитаю на досуге. Но пока не вижу в этом необходимости. Общих данных пока не так много, писать отдельные менеджеры пока нет смысла.
|
Сообщ.
#6
,
|
|
|
Цитата Homez @ Ну а как ты получаешь там, где нужно, нужные объекты? Или это и есть фишка синглтона - тебе как-то возвращается уже готовый объект, если он был создан? Да в этом его фишка. Мое ИМХО вообще не использовать ни статики, ни синглтонов. А инициализировать объекты в апликейшн классе (или в сервисе). Потому что после креша какой-то вспомогательной активти адроид перезапустит все приложение, и возможны странные ситуации когда объекты будут не инициализированы. |
Сообщ.
#7
,
|
|
|
Цитата Homez @ пока Ключевое слово ![]() Советую набросать для себя хотя бы приблизительную схему своего готового приложения, т.к. потом дольше будешь переделывать. |
Сообщ.
#8
,
|
|
|
Создал класс CommonData пока с одним статическим полем, проблема, инициировавшая эту тему на форуме, уже решена. Дальше посмотрим.
Добавлено Цитата mrco @ А инициализировать объекты в апликейшн классе (или в сервисе). До этого еше не добрался, осваиваю по мере необходимости то, что нужно в тот или иной момент. |
Сообщ.
#9
,
|
|
|
Есть такая штука как Application вот если ее перекрыть то получишь то что надо. Из каждой активити делаешь getAplication и творишь с ним что хочешь.
|
Сообщ.
#10
,
|
|
|
Цитата Белый негр @ Есть такая штука как Application вот если ее перекрыть то получишь то что надо. Из каждой активити делаешь getAplication и творишь с ним что хочешь. Ну я метод getApplication() видел, по нему узнал и про Application. А что значит - перекрыть? |
Сообщ.
#11
,
|
|
|
Цитата Homez @ А что значит - перекрыть? Рассказываю: 1) ![]() ![]() public class MyApplication extends Application { private AppManager mAppManager; //тут храним общий мусор public void init() { mAppManager = new AppManager(this); } public AppManager getAppManager() { return mAppManager; } } 2) В манифесте ![]() ![]() <application android:icon="@drawable/icon" android:label="@string/app_name" android:name="com.homez.app.MyApplication" 3) В главной активити: ![]() ![]() MyApplication application = (MyApplication) getApplication(); application.init(); 4) В остальных активити просто делаешь гет и уже потом творишь с ней что хочешь. Инджой! |
Сообщ.
#12
,
|
|
|
О, буду иметь ввиду! Тханкс!
|
Сообщ.
#13
,
|
|
|
Цитата Белый негр @ Рассказываю: Как ссылку на свой инстанс аппликейшена получить в не классов активити? Сделать статический гетер со статическим свойством как-то странно на мой взгляд... А если будет несколько копий приложения? Или такого не омжет быть? |
Сообщ.
#14
,
|
|
|
Felan, видимо, Вы немного не в теме. Во-первых, каждое приложение на Android запускается в своем экземпляре Dalvik VM. Вот-вторых, мне кажется, что на Android невозможно запускать несколько копий одного и того же приложения параллельно.
|
Сообщ.
#15
,
|
|
|
Цитата Homez @ Felan, видимо, Вы немного не в теме. Eсли бы я был "в теме", я бы не задавал этот вопрос. Т.е. если я в своем наследнике сделаю статическое поле и статический геттер, то в своем приложении я буду иметь доступ кнему в любом месте, и, если ест возможность запуска нескольких копий, они все равно не буду перетирать друг друга, потому что они на разных виртуалках? Собственно мне нужен способ доступа из любого места, не обязательно из Activity, где есть getApplication(), к определенному экземпляру определенного класса. Статическое поле полностью устривает, если есть гарантия, что не может быть второй копии прилоежния... |
Сообщ.
#16
,
|
|
|
Даже если и может быть вторая копия, она будет работать в своем адресном пространстве виртуальной машины Java.
Добавлено Соответственно, никаких конфликтов не будет. |
Сообщ.
#17
,
|
|
|
Цитата Homez @ Felan, видимо, Вы немного не в теме. Во-первых, каждое приложение на Android запускается в своем экземпляре Dalvik VM. Вот-вторых, мне кажется, что на Android невозможно запускать несколько копий одного и того же приложения параллельно. Части приложения можно запускать в разных процессах http://developer.android.com/guide/compone...nd-threads.html. Никогда не пробовал так делать, но можно предположить что в каждом процессе будет свой аппликейшен. Добавлено Хотя возможно это они не про unix процессы говорят... |
Сообщ.
#18
,
|
|
|
Если нужны глобальные данные какие-то (хотя, много глобальных данных - это жёппа), то используй наследника Application, как выше написали. Для себя я единственный минус пока нашел в этом с точки зрения стиля - постоянный каст Application к классу своего наследника. Ну, это Java, тут не попишешь.
Если нужны глобальные данные в текущем приложении вообще везде (читай за пределами Activity), то пиши свой синглетон и не заморачивайся. А чтобы понять разницу между своим и нативным - читай тут http://developer.android.com/reference/and...pplication.html Что касается общих данных для разных процессов, то это уж явно не синглетонами решается. ![]() |
Сообщ.
#19
,
|
|
|
Цитата spy_ @ Если нужны глобальные данные какие-то (хотя, много глобальных данных - это жёппа), то используй наследника Application, как выше написали. Для себя я единственный минус пока нашел в этом с точки зрения стиля - постоянный каст Application к классу своего наследника. Ну, это Java, тут не попишешь. Ну я вобщем сделал статическое поля для хранения нужного мне класса. Данных не много, но они нужны. Суть в том, что там крутится поток, доступ к которому нужен из любой точки прилоежния и в лоюбой момент. И ему нужен контекст, и он не должен зависить от активити... Да и каст не нужен, если один раз проинициализировать... Цитата spy_ @ Если нужны глобальные данные в текущем приложении вообще везде (читай за пределами Activity), то пиши свой синглетон и не заморачивайся. А чтобы понять разницу между своим и нативным - читай тут http://developer.android.com/reference/and...pplication.html Ну примерно так и сделал... Цитата spy_ @ Что касается общих данных для разных процессов, то это уж явно не синглетонами решается. Здесь либо межпроцессное взаимодействие, либо общее хранилище (например, БД). По ссылке выше хороший ман про потоки и процессы. Дальше уже зависит от того, где будет все крутиться на деле. Не, такого не надо... Суть вопроса была в том, что бы убедиться, что они для разных приложений изолированные... Че-то в доках не нашел ответа... |
Сообщ.
#20
,
|
|
|
Felan, про данные и процессы - это уже доки по ОС надо читать.
![]() |
Сообщ.
#21
,
|
|
|
Да ну мало ли как они там работают... это же вроде как линукс... я в нем ниче не понимаю.
|
Сообщ.
#22
,
|
|
|
И не стыдно программировать под ОС, в которой ни бум-бум?
![]() |
Сообщ.
#23
,
|
|
|
Цитата spy_ @ И не стыдно программировать под ОС, в которой ни бум-бум? Ну все там были. ![]() Опять же, я и спросил, тут, что бы разобраться. Но опять же нормального ответа пока не получил. |