Форум программистов, компьютерный форум, киберфорум
Наши страницы
Программирование Android
Войти
Регистрация
Восстановить пароль
 
Tester64
396 / 357 / 46
Регистрация: 22.05.2013
Сообщений: 2,518
#1

Передать ссылку на класс через Intent - Программирование Android

03.01.2016, 11:54. Просмотров 1124. Ответов 16
Метки нет (Все метки)

Возможно ли подобное?

Есть класс, в котором храню больше 50 параметров разного типа (количество переменных все еще растет).
Эти параметры нужно в одном активити рассчитать, а в другом вывести (вернее расчитать в 2х активити, а вывести выборочно в 3 другие).
Храню его в сервисе. Сервис надежно сидит в памяти!
Можно ли передавать при вызове ссылку на сам класс или на сервис?
Как-то глупо передавать все параметры через именные строковые поля в Intent. И расширяемость падает на порядок.

Раньше получалось хранить класс в Application, но для сервиса (созданого автозагрузкой) и для главного активити похоже создаются два класса Application.
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.01.2016, 11:54
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Передать ссылку на класс через Intent (Программирование Android):

Как передать ссылку через Intent
Как можно в такой класс package app.kray.anddev; import...

Передать через intent VIEW
Как можно через intent передать "VIEW", полученное вот таким способом: View...

Передать через Intent информацию об Item
Выводит ошибку и приложение закрывается by Force Close ошибка по ходу в...

Пытаюсь передать данные через Intent, но выходит ошибка
Пытаюсь передать данные через Intent, но выходит ошибка, когда пытаюсь передать...

Передать через intent ArrayList объектов своего класса
У меня есть ArrayList из обьектов моего класса. Мне нужно передать это через...

Как передать через intent нажатие кнопки в другом активити
В первом активити у нас есть две кнопки 1 и 2. Во втором активити ещё две...

16
Bend3r
149 / 136 / 35
Регистрация: 29.07.2012
Сообщений: 709
03.01.2016, 12:46 #2
1. Создайте свой класс где бы вы хранили все свои параметры. Далее этот класс сериализуйте и передавайте его через Intent. О том как сериализировать в интернете куча информации. (На худой конец можете Json воспользоватся).
2. Создайте класс где все параметры статика. Это даст вам возможность из любого места программы изменять/читать данные.
0
Tester64
396 / 357 / 46
Регистрация: 22.05.2013
Сообщений: 2,518
03.01.2016, 13:46  [ТС] #3
Цитата Сообщение от Bend3r Посмотреть сообщение
этот класс сериализуйте и передавайте его через Intent.
Я это немного по другому бы хотел... Как в С++/Делфи! Создал класс через new в классе сервиса. Память выделена ОДИН РАЗ. Имею ссылку на класс. Передаю ссылку другим активити открытым из этого сервиса! Активити на пряму читают данные этого класса и пишут в него. Сервис может параллельно писать туда данные и требовать (рассылкой требования) обновиться из этого класса!
А вы предлагаете разложить класс на длинную (практически) XML строку и рассылать последнюю версию каждой активити при каждом требовании обновиться... И целый протокол написать для общения 5ти окон между собой перекидывая практически один и тот-же класс!

Примерно задача такая:
система получает внешний сигнал с датчика (например приближение к точке GPS).
она начинает собирать в потоке кучу инфы про точку и делает анализ этой инфы (накопление класса списками)
она спрашивает кое-что для подтверждения у пользователя (показав часть уже собранной инфы)
она показывает "флайку" с инфой (неубираемое окошко над остальными).
после окончания работы она вызывает еще одно окошко (уже "диалог") с этой-же инфой (и набором кнопок)
после надо сервисом (в потоке) еще раз обработать этот класс и записать нужное в базу.
...как видите КУЧА инфы должна отобразиться КУЧУ раз в разных форматах! Анализ ДОЛГИЙ! Часть идет обращением к удаленному серверу!

Добился того что и активити и диалог и флайка вызываются из сервиса. Там-же храню класс. Там-же его накапливаю. Пока что успешно передаю данные интент-ом, но для тестов использую всего 3 параметра! А должны быть больше 10 параметров и 4-5 "многостолбцовых" списков. Передавать каждый раз "раскладывая в jason, а потом "парся" - это бред! Там до нескольких мегабайт может быть! И каждый раз память выделять?

Подумываю хранить класс в Application и проверять та ли это версия Application перед выводом - могут быть ошибки! Или научиться передавать ссылку на сервис в активити через Application. Во флайки успешно передал, но не в активити...

В С++ я мог класс либо предавать ссылкой (хоть между разными программами/dll) либо быстро копировать между программами (просто N байт памяти передавалось в другую программу сверхбыстрыми командами ОС вместе со знанием структуры класса).
0
Pablito
2652 / 2134 / 726
Регистрация: 12.05.2014
Сообщений: 7,450
Завершенные тесты: 1
03.01.2016, 15:10 #4
врятли меня кто-то послушает, но https://github.com/greenrobot/EventBus
мегакульная вещь
2
Bend3r
149 / 136 / 35
Регистрация: 29.07.2012
Сообщений: 709
03.01.2016, 15:57 #5
В Java все кастомные классы передаются по ссылкам. В чем проблема тогда?
0
Tester64
396 / 357 / 46
Регистрация: 22.05.2013
Сообщений: 2,518
03.01.2016, 16:00  [ТС] #6
Цитата Сообщение от Паблито Посмотреть сообщение
врятли меня кто-то послушает
Я послушаю!
Но можете в 2х словах описать, что это??? похоже что это как раз позволят передавать класс, но КАК?
Вы это использовали? Удобно (по коду)?
Какие МИНУСЫ у этой технологии??? (плюсы не плохо расписаны в "рекламе"/описании)

На сегодня я уже почти выкрутился!!!!
Класс в сервис из которого все активити, диалоги, флайки вызываются.
Ссылку на сервис в апликэйшт добавляю при создании сервиса.
все активитивити получают доступ через myapplication.myservice.myclass
Но я понимаю что это "частный случай" и все еще есть шанс что будет глючить (путать из какого экземляра апликейшн тянуть данные... созданного main_activity или сервисом... А если сервис первый раз запускается из main_activity, а потом закрывается свайпом)

Подобная НАДЕЖНАЯ технология мне очень нужна для моего следующего запланированного проекта!
0
Pablito
2652 / 2134 / 726
Регистрация: 12.05.2014
Сообщений: 7,450
Завершенные тесты: 1
03.01.2016, 16:09 #7
Лучший ответ Сообщение было отмечено Tester64 как решение

Решение

Это пипец просто как удобно. Я до сих пор под впечатлением.
Честно говоря мое объяснение будет очень корявым, лучше прочитать тут

Грубо говоря это шина, в которую можно ложить любые сообщения. Вообще любые, свои классы например.

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

Просто регистрируем нужные нам классы на прием нужных только этому классу ивентов. Фишка в различных сигнатурах методов onEvent().
У меня в одном парсере стало строк раз в 10 меньше, код стал на порядок понятнее и красивее. Часть классов улетела в топку.
2
Tester64
396 / 357 / 46
Регистрация: 22.05.2013
Сообщений: 2,518
03.01.2016, 16:16  [ТС] #8
Цитата Сообщение от Паблито Посмотреть сообщение
Просто потратте время на медитацию на эту библиотеку.
Спасибо! "ухожу в медитацию"!
0
Pablito
2652 / 2134 / 726
Регистрация: 12.05.2014
Сообщений: 7,450
Завершенные тесты: 1
03.01.2016, 16:27 #9
и я наконец прочитал что надо передавать между активити

Многие боятся Parcelable, а складывать все нужные поля в бандл - гиморно.
Есть минимум два решения.
1. Ставим плагин "Android Parcelable code generator". Его можно найти в плагинах в самой студии.
После рестарта IDE открываем наш класс и прямо в коде нажимаем Alt+Insert
В контекстном менб выбираем пункт Parcelable и плагин сам сгенерирует все нужные методы.

2. Подключить всем известную либу
XML
1
compile 'com.google.code.gson:gson:1.7.2'
и сохранять любые свои классы в gson одной строкой, которую сохранять в бандл и передавать через интент
так же одной строкой потом можно строку перегонять в объект своего класса
0
Tester64
396 / 357 / 46
Регистрация: 22.05.2013
Сообщений: 2,518
04.01.2016, 01:22  [ТС] #10
Цитата Сообщение от Паблито Посмотреть сообщение
и я наконец прочитал что надо передавать между активити
Вы плохо прочитали! мне надо не сам класс передавать! А ССЫЛКУ на него! Он ОГРОМНЫЙ! В памяти хранит кучу таблиц(арреев), кучу строк, кучу простых переменных... Расчеты по точке, статистику, ближних "соседей" и многое другое... Пока что класс (при почти пустой базе) уже содержит больше 10 записей в таблицах. А возможно будут и тысячи... По ним проводятся сложные расчет в потоке. Сводятся цифры, подготавливаются данные для сложного отчета... Процесс долгий. Может думать больше минуты. А показывать результаты расчетов в 3х активити! Записывать во временную таблицу базы - не логично и тяжело. Расчитывать 3 раза тем более не логично... И в результате можно получить многомегабайтный класс в памяти! Не правильно как-то его передавать между активити КОПИРУЯ его! Нужно именно ссылку передать!

Пока получается (описал выше метод). Пока надежно. Копий класса не делает. Конструктор лишь 1 раз вызывается!

Но за ваш метод тоже спасибо... почитаю... посмотрю что он может...
0
Spelcrawler
531 / 501 / 113
Регистрация: 12.03.2014
Сообщений: 1,666
Завершенные тесты: 1
04.01.2016, 01:33 #11
Tester64, а почему бы тогда не использовать обычный синглтон?
1
bastrakov
91 / 91 / 14
Регистрация: 10.10.2015
Сообщений: 307
Записей в блоге: 1
06.01.2016, 09:30 #12
дико извиняюсь, что вмешиваюсь в глубокоинтеллектуальную беседу уважаемых донов, но что будет с "принимающей" активити, если программу прервут на телефонный звонок (например), а потом вернутся обратно?
активити будет пересоздана, и свои входные параметры она получит. а все что было создано где-то там когда-то и по ссылке - будет уже в лучших мирах gc. :-)
0
Tester64
396 / 357 / 46
Регистрация: 22.05.2013
Сообщений: 2,518
06.01.2016, 17:35  [ТС] #13
Цитата Сообщение от bastrakov Посмотреть сообщение
активити будет пересоздана,
Во первых поэтому я и не храню в активити! У меня для этого не убиваемый сервис.
А во вторых активити будет аккуратно "свернуто" и убьется лишь при нехватке памяти на телефон. Чаще всего мои активити даже не сворачиваются, а просто "накрываются" звонилкой.
В моем-же случае активити вызваются из сервиса. Поэтому они тесно связаны с сервисом и могут хранить там свои классы "статично"

p.s. проверял свою систему на звонках! ничего не теряю!!!
0
Spelcrawler
531 / 501 / 113
Регистрация: 12.03.2014
Сообщений: 1,666
Завершенные тесты: 1
06.01.2016, 23:10 #14
Tester64, bastrakov, Ну по идее сервис все таки может умереть (оочень маловероятно, конечно). Единственное, что гарантированно не убьется системой - это то, что сейчас на экране. Ну и еще недавно тестировал всякие нестандартные ситуации - все данные, которые переданы интентом куда-то сохраняются (может в кеш какой), из памяти удаляется, но при повторном запуске активити(из последних приложений) все данные, которые я посылаю интентом, восстанавливаются, даже тяжелые - специально до 2-3 мб раздувал строки для тестов. Так что считаю самым надежным способом передачи все таки интент, но оно конечнчо очень медленно. По идее еще все на что есть ссылка в активити будет выгружено только вместе с активити, так что и синглтон не плохо должен подойти, да и в реализации проще. Но тут от конкретной задачи зависит, может и не подойдет в данном случае.
0
Tester64
396 / 357 / 46
Регистрация: 22.05.2013
Сообщений: 2,518
07.01.2016, 07:45  [ТС] #15
Цитата Сообщение от Spelcrawler Посмотреть сообщение
и синглтон не плохо должен подойти, да и в реализации проще.
Я только начал синглтон изучать... можете "на пальцах" обьяснить что это? (90% инфы под яву, а не под андроид и пока не понял как он себя ведет именно в АНДРОДЕ)

У сервисов есть возможность сделать его "не убиваемым". Рассказывать долго(много кода), но в 2х словах - его можно привязать к нотифу! Можно повысить приоритет. Можно из него показать "флайку", возможно даже полупрозрачную (почти не видимую).

Хочу написать напоминалку, которая работает по таймеру! А не через алармы! (очень сложная математика) Поэтому 2 года искал как сервисы сделать надежными и привязать к таймеру... вроде получилось... уже больше года тестирую в разных проектах - не сдыхает. и % процессора в разумных пределах... Написал будильник, написал индикатор батарейки тонкой полоской внизу экрана... полоска 3й месяц живет... будильник уже пол года КАЖДЫЙ день срабатывает...
0
Spelcrawler
531 / 501 / 113
Регистрация: 12.03.2014
Сообщений: 1,666
Завершенные тесты: 1
07.01.2016, 08:05 #16
Цитата Сообщение от Tester64 Посмотреть сообщение
90% инфы под яву, а не под андроид и пока не понял как он себя ведет именно в АНДРОДЕ
Да точно так же.
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
class MyClass{
private static MyClass instance;
 
private MyClass() {}
 
public static MyClass getInstance() {
    if (instance == null) {
        instance = new MyClass();
    }
    return instance;
}
 
}
И потом в любом месте приложения
Java
1
MyClass instance = MyClass.getInstance();
И всегда будет только один экземпляр этого класса, но лучше его изменять только из одного места, иначе можно перезаписать что-то. Только вот тут могут быть проблемы с памятью, особенно если передавать туда контекст. Лучше в классе унаследованном от Application хранить контекст для подобных манипуляций и в конструкторе синглтона его оттуда доставать. Иначе он не даст выгрузить из памяти активити (или сервис) из которого получает контекст. В общем в андроиде с ним много проблем, но если аккуратно использовать ничего страшного не будет.

Добавлено через 1 минуту
Цитата Сообщение от Tester64 Посмотреть сообщение
Написал будильник, написал индикатор батарейки тонкой полоской внизу экрана... полоска 3й месяц живет... будильник уже пол года КАЖДЫЙ день срабатывает...
А как с батареей дела? Телефон спит?
1
Tester64
396 / 357 / 46
Регистрация: 22.05.2013
Сообщений: 2,518
07.01.2016, 08:25  [ТС] #17
Цитата Сообщение от Spelcrawler Посмотреть сообщение
А как с батареей дела? Телефон спит?
Процессор грузится меньше чем на 5% (всего! в режиме "ожидания") Поэтому батарея почти не "нагружается".
Мой аларм перезапускает сервис для надежности каждую 1-10 минут (управлемо), а внутри работает поток который дает точность хоть до 0.1 секунды... И главное ДИНАМИЧЕСКИ позволяет откладывать следующее срабатывание внутри потока. Например будильник через 8 часов... Откладываю на 7:59, а потом раз в 10 секунд проверяю... А когда 30 секунд останется, запускаю по секунде и за 3 секунды до 8:00 запускаю... монстр получился!
Частота проверок и перезапусков влияет на нагрузку! но даже при 5 раз в секунду до 50% на одноядерном не доходил... Этот-же сервис отвечает за удержание одной или нескольких "флаек". В текущем проекте (где синглтон возможно пригодится) из него запускаю и диалоги. И во флайку из него пускаю таймер (прошло/осталось).

Помню первые неубиваемые сервисы "почему-то" перезагружали мобилку каждые 1.5-3 часа! Пока не научился за нагрузкой проца следить...

Про синглтон спасибо! Позднее попробую... сейчас текущий проект на стадии "лишь бы заработало"... А потом, когда за надежность и оптимизацю возмусь... попробую и Ваш вариант!
1
07.01.2016, 08:25
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.01.2016, 08:25
Привет! Вот еще темы с решениями:

Как передать ссылку по клику в другой класс?
как передать ссылку по клику в другой класс есть класс парсера вот часть...

Starting: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER]
Выдает такую ошибку, хотя смартфон видит, он разрешает отладку, при запуске...

Как передать ссылку на элемент активити в другой класс чтобы провести операции надо ним
Такая задача сложилась. есть активити MainActivity: public class...

Передать адаптер в Intent
Как это сделать??? Создал свой адаптер (My_adapter) для списка цветных строк и...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru