Форум программистов, компьютерный форум CyberForum.ru

Программирование Android

Войти
Регистрация
Восстановить пароль
 
 
Tester64
395 / 356 / 43
Регистрация: 22.05.2013
Сообщений: 2,518
#1

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

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

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

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

Раньше получалось хранить класс в Application, но для сервиса (созданого автозагрузкой) и для главного активити похоже создаются два класса Application.
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.01.2016, 11:54     Передать ссылку на класс через Intent
Посмотрите здесь:
Android Как передать ссылку через Intent
Передать через intent VIEW Android
Android Передать через Intent информацию об Item
Android Передать через intent ArrayList объектов своего класса
Android Пытаюсь передать данные через Intent, но выходит ошибка
Как передать через intent нажатие кнопки в другом активити Android
Как передать ссылку по клику в другой класс? Android
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Bend3r
149 / 136 / 18
Регистрация: 29.07.2012
Сообщений: 709
03.01.2016, 12:46     Передать ссылку на класс через Intent #2
1. Создайте свой класс где бы вы хранили все свои параметры. Далее этот класс сериализуйте и передавайте его через Intent. О том как сериализировать в интернете куча информации. (На худой конец можете Json воспользоватся).
2. Создайте класс где все параметры статика. Это даст вам возможность из любого места программы изменять/читать данные.
Tester64
395 / 356 / 43
Регистрация: 22.05.2013
Сообщений: 2,518
03.01.2016, 13:46  [ТС]     Передать ссылку на класс через Intent #3
Цитата Сообщение от Bend3r Посмотреть сообщение
этот класс сериализуйте и передавайте его через Intent.
Я это немного по другому бы хотел... Как в С++/Делфи! Создал класс через new в классе сервиса. Память выделена ОДИН РАЗ. Имею ссылку на класс. Передаю ссылку другим активити открытым из этого сервиса! Активити на пряму читают данные этого класса и пишут в него. Сервис может параллельно писать туда данные и требовать (рассылкой требования) обновиться из этого класса!
А вы предлагаете разложить класс на длинную (практически) XML строку и рассылать последнюю версию каждой активити при каждом требовании обновиться... И целый протокол написать для общения 5ти окон между собой перекидывая практически один и тот-же класс!

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

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

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

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

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

Подобная НАДЕЖНАЯ технология мне очень нужна для моего следующего запланированного проекта!
Pablito
2455 / 1900 / 591
Регистрация: 12.05.2014
Сообщений: 6,702
Завершенные тесты: 1
03.01.2016, 16:09     Передать ссылку на класс через Intent #7
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Это пипец просто как удобно. Я до сих пор под впечатлением.
Честно говоря мое объяснение будет очень корявым, лучше прочитать тут

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

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

Просто регистрируем нужные нам классы на прием нужных только этому классу ивентов. Фишка в различных сигнатурах методов onEvent().
У меня в одном парсере стало строк раз в 10 меньше, код стал на порядок понятнее и красивее. Часть классов улетела в топку.
Tester64
395 / 356 / 43
Регистрация: 22.05.2013
Сообщений: 2,518
03.01.2016, 16:16  [ТС]     Передать ссылку на класс через Intent #8
Цитата Сообщение от Паблито Посмотреть сообщение
Просто потратте время на медитацию на эту библиотеку.
Спасибо! "ухожу в медитацию"!
Pablito
2455 / 1900 / 591
Регистрация: 12.05.2014
Сообщений: 6,702
Завершенные тесты: 1
03.01.2016, 16:27     Передать ссылку на класс через Intent #9
и я наконец прочитал что надо передавать между активити

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

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

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

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

p.s. проверял свою систему на звонках! ничего не теряю!!!
Spelcrawler
526 / 496 / 111
Регистрация: 12.03.2014
Сообщений: 1,648
Завершенные тесты: 1
06.01.2016, 23:10     Передать ссылку на класс через Intent #14
Tester64, bastrakov, Ну по идее сервис все таки может умереть (оочень маловероятно, конечно). Единственное, что гарантированно не убьется системой - это то, что сейчас на экране. Ну и еще недавно тестировал всякие нестандартные ситуации - все данные, которые переданы интентом куда-то сохраняются (может в кеш какой), из памяти удаляется, но при повторном запуске активити(из последних приложений) все данные, которые я посылаю интентом, восстанавливаются, даже тяжелые - специально до 2-3 мб раздувал строки для тестов. Так что считаю самым надежным способом передачи все таки интент, но оно конечнчо очень медленно. По идее еще все на что есть ссылка в активити будет выгружено только вместе с активити, так что и синглтон не плохо должен подойти, да и в реализации проще. Но тут от конкретной задачи зависит, может и не подойдет в данном случае.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.01.2016, 07:45     Передать ссылку на класс через Intent
Еще ссылки по теме:
Android Как передать ссылку на элемент активити в другой класс чтобы провести операции надо ним
Android Передать адаптер в Intent
Android Как передать intent данные в Service?
Android Starting: Intent { act=android.intent.action.MAIN. и пустой белый экран
Android Передача данных через Intent

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

Или воспользуйтесь поиском по форуму:
Tester64
395 / 356 / 43
Регистрация: 22.05.2013
Сообщений: 2,518
07.01.2016, 07:45  [ТС]     Передать ссылку на класс через Intent #15
Цитата Сообщение от Spelcrawler Посмотреть сообщение
и синглтон не плохо должен подойти, да и в реализации проще.
Я только начал синглтон изучать... можете "на пальцах" обьяснить что это? (90% инфы под яву, а не под андроид и пока не понял как он себя ведет именно в АНДРОДЕ)

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

Хочу написать напоминалку, которая работает по таймеру! А не через алармы! (очень сложная математика) Поэтому 2 года искал как сервисы сделать надежными и привязать к таймеру... вроде получилось... уже больше года тестирую в разных проектах - не сдыхает. и % процессора в разумных пределах... Написал будильник, написал индикатор батарейки тонкой полоской внизу экрана... полоска 3й месяц живет... будильник уже пол года КАЖДЫЙ день срабатывает...
Yandex
Объявления
07.01.2016, 07:45     Передать ссылку на класс через Intent
Ответ Создать тему
Опции темы

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