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

Передать ссылку на класс через Intent - Android

Восстановить пароль Регистрация
 
Tester64
395 / 356 / 43
Регистрация: 22.05.2013
Сообщений: 2,488
03.01.2016, 11:54     Передать ссылку на класс через Intent #1
Возможно ли подобное?

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

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

Android Передать адаптер в Intent
Android Как передать intent данные в Service?
Android Как передать ссылку на элемент активити в другой класс чтобы провести операции надо ним
Android Передать через Intent информацию об Item
Передать через intent VIEW Android
Как передать ссылку по клику в другой класс? Android
Android Пытаюсь передать данные через Intent, но выходит ошибка
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Bend3r
 Аватар для Bend3r
144 / 131 / 18
Регистрация: 29.07.2012
Сообщений: 704
03.01.2016, 12:46     Передать ссылку на класс через Intent #2
1. Создайте свой класс где бы вы хранили все свои параметры. Далее этот класс сериализуйте и передавайте его через Intent. О том как сериализировать в интернете куча информации. (На худой конец можете Json воспользоватся).
2. Создайте класс где все параметры статика. Это даст вам возможность из любого места программы изменять/читать данные.
Tester64
395 / 356 / 43
Регистрация: 22.05.2013
Сообщений: 2,488
03.01.2016, 13:46  [ТС]     Передать ссылку на класс через Intent #3
Цитата Сообщение от Bend3r Посмотреть сообщение
этот класс сериализуйте и передавайте его через Intent.
Я это немного по другому бы хотел... Как в С++/Делфи! Создал класс через new в классе сервиса. Память выделена ОДИН РАЗ. Имею ссылку на класс. Передаю ссылку другим активити открытым из этого сервиса! Активити на пряму читают данные этого класса и пишут в него. Сервис может параллельно писать туда данные и требовать (рассылкой требования) обновиться из этого класса!
А вы предлагаете разложить класс на длинную (практически) XML строку и рассылать последнюю версию каждой активити при каждом требовании обновиться... И целый протокол написать для общения 5ти окон между собой перекидывая практически один и тот-же класс!

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

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

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

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

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

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

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

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

Просто регистрируем нужные нам классы на прием нужных только этому классу ивентов. Фишка в различных сигнатурах методов onEvent().
У меня в одном парсере стало строк раз в 10 меньше, код стал на порядок понятнее и красивее. Часть классов улетела в топку.
Tester64
395 / 356 / 43
Регистрация: 22.05.2013
Сообщений: 2,488
03.01.2016, 16:16  [ТС]     Передать ссылку на класс через Intent #8
Цитата Сообщение от Паблито Посмотреть сообщение
Просто потратте время на медитацию на эту библиотеку.
Спасибо! "ухожу в медитацию"!
Паблито
не спать!
1881 / 1615 / 500
Регистрация: 12.05.2014
Сообщений: 5,831
Завершенные тесты: 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,488
04.01.2016, 01:22  [ТС]     Передать ссылку на класс через Intent #10
Цитата Сообщение от Паблито Посмотреть сообщение
и я наконец прочитал что надо передавать между активити
Вы плохо прочитали! мне надо не сам класс передавать! А ССЫЛКУ на него! Он ОГРОМНЫЙ! В памяти хранит кучу таблиц(арреев), кучу строк, кучу простых переменных... Расчеты по точке, статистику, ближних "соседей" и многое другое... Пока что класс (при почти пустой базе) уже содержит больше 10 записей в таблицах. А возможно будут и тысячи... По ним проводятся сложные расчет в потоке. Сводятся цифры, подготавливаются данные для сложного отчета... Процесс долгий. Может думать больше минуты. А показывать результаты расчетов в 3х активити! Записывать во временную таблицу базы - не логично и тяжело. Расчитывать 3 раза тем более не логично... И в результате можно получить многомегабайтный класс в памяти! Не правильно как-то его передавать между активити КОПИРУЯ его! Нужно именно ссылку передать!

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

Но за ваш метод тоже спасибо... почитаю... посмотрю что он может...
Spelcrawler
521 / 491 / 110
Регистрация: 12.03.2014
Сообщений: 1,641
Завершенные тесты: 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,488
06.01.2016, 17:35  [ТС]     Передать ссылку на класс через Intent #13
Цитата Сообщение от bastrakov Посмотреть сообщение
активити будет пересоздана,
Во первых поэтому я и не храню в активити! У меня для этого не убиваемый сервис.
А во вторых активити будет аккуратно "свернуто" и убьется лишь при нехватке памяти на телефон. Чаще всего мои активити даже не сворачиваются, а просто "накрываются" звонилкой.
В моем-же случае активити вызваются из сервиса. Поэтому они тесно связаны с сервисом и могут хранить там свои классы "статично"

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

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

Хочу написать напоминалку, которая работает по таймеру! А не через алармы! (очень сложная математика) Поэтому 2 года искал как сервисы сделать надежными и привязать к таймеру... вроде получилось... уже больше года тестирую в разных проектах - не сдыхает. и % процессора в разумных пределах... Написал будильник, написал индикатор батарейки тонкой полоской внизу экрана... полоска 3й месяц живет... будильник уже пол года КАЖДЫЙ день срабатывает...
Spelcrawler
521 / 491 / 110
Регистрация: 12.03.2014
Сообщений: 1,641
Завершенные тесты: 1
07.01.2016, 08:05     Передать ссылку на класс через Intent #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й месяц живет... будильник уже пол года КАЖДЫЙ день срабатывает...
А как с батареей дела? Телефон спит?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.01.2016, 08:25     Передать ссылку на класс через Intent
Еще ссылки по теме:

Android Как передать ссылку через Intent
Как передать через intent нажатие кнопки в другом активити Android
Starting: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] Android
Android Starting: Intent { act=android.intent.action.MAIN. и пустой белый экран
Android Передать через intent ArrayList объектов своего класса

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

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

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

Про синглтон спасибо! Позднее попробую... сейчас текущий проект на стадии "лишь бы заработало"... А потом, когда за надежность и оптимизацю возмусь... попробую и Ваш вариант!
Yandex
Объявления
07.01.2016, 08:25     Передать ссылку на класс через Intent
Ответ Создать тему
Опции темы

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