С Новым годом! Форум программистов, компьютерный форум, киберфорум
Программирование Android
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.84/25: Рейтинг темы: голосов - 25, средняя оценка - 4.84
420 / 357 / 47
Регистрация: 22.05.2013
Сообщений: 2,518

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

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

Студворк — интернет-сервис помощи студентам
Возможно ли подобное?

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

Раньше получалось хранить класс в Application, но для сервиса (созданого автозагрузкой) и для главного активити похоже создаются два класса Application.
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
03.01.2016, 11:54
Ответы с готовыми решениями:

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

Передать через intent VIEW
Как можно через intent передать "VIEW", полученное вот таким способом: View view = (View)findViewById(R.id.layout_linear); Передавая...

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

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

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

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

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

В С++ я мог класс либо предавать ссылкой (хоть между разными программами/dll) либо быстро копировать между программами (просто N байт памяти передавалось в другую программу сверхбыстрыми командами ОС вместе со знанием структуры класса).
0
2884 / 2296 / 769
Регистрация: 12.05.2014
Сообщений: 7,978
03.01.2016, 15:10
врятли меня кто-то послушает, но https://github.com/greenrobot/EventBus
мегакульная вещь
2
 Аватар для Bend3r
150 / 137 / 35
Регистрация: 29.07.2012
Сообщений: 709
03.01.2016, 15:57
В Java все кастомные классы передаются по ссылкам. В чем проблема тогда?
0
420 / 357 / 47
Регистрация: 22.05.2013
Сообщений: 2,518
03.01.2016, 16:00  [ТС]
Цитата Сообщение от Паблито Посмотреть сообщение
врятли меня кто-то послушает
Я послушаю!
Но можете в 2х словах описать, что это??? похоже что это как раз позволят передавать класс, но КАК?
Вы это использовали? Удобно (по коду)?
Какие МИНУСЫ у этой технологии??? (плюсы не плохо расписаны в "рекламе"/описании)

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

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

Решение

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

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

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

Просто регистрируем нужные нам классы на прием нужных только этому классу ивентов. Фишка в различных сигнатурах методов onEvent().
У меня в одном парсере стало строк раз в 10 меньше, код стал на порядок понятнее и красивее. Часть классов улетела в топку.
2
420 / 357 / 47
Регистрация: 22.05.2013
Сообщений: 2,518
03.01.2016, 16:16  [ТС]
Цитата Сообщение от Паблито Посмотреть сообщение
Просто потратте время на медитацию на эту библиотеку.
Спасибо! "ухожу в медитацию"!
0
2884 / 2296 / 769
Регистрация: 12.05.2014
Сообщений: 7,978
03.01.2016, 16:27
и я наконец прочитал что надо передавать между активити

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

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

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

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

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

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

Хочу написать напоминалку, которая работает по таймеру! А не через алармы! (очень сложная математика) Поэтому 2 года искал как сервисы сделать надежными и привязать к таймеру... вроде получилось... уже больше года тестирую в разных проектах - не сдыхает. и % процессора в разумных пределах... Написал будильник, написал индикатор батарейки тонкой полоской внизу экрана... полоска 3й месяц живет... будильник уже пол года КАЖДЫЙ день срабатывает...
0
535 / 504 / 114
Регистрация: 12.03.2014
Сообщений: 1,671
07.01.2016, 08:05
Цитата Сообщение от 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
420 / 357 / 47
Регистрация: 22.05.2013
Сообщений: 2,518
07.01.2016, 08:25  [ТС]
Цитата Сообщение от Spelcrawler Посмотреть сообщение
А как с батареей дела? Телефон спит?
Процессор грузится меньше чем на 5% (всего! в режиме "ожидания") Поэтому батарея почти не "нагружается".
Мой аларм перезапускает сервис для надежности каждую 1-10 минут (управлемо), а внутри работает поток который дает точность хоть до 0.1 секунды... И главное ДИНАМИЧЕСКИ позволяет откладывать следующее срабатывание внутри потока. Например будильник через 8 часов... Откладываю на 7:59, а потом раз в 10 секунд проверяю... А когда 30 секунд останется, запускаю по секунде и за 3 секунды до 8:00 запускаю... монстр получился!
Частота проверок и перезапусков влияет на нагрузку! но даже при 5 раз в секунду до 50% на одноядерном не доходил... Этот-же сервис отвечает за удержание одной или нескольких "флаек". В текущем проекте (где синглтон возможно пригодится) из него запускаю и диалоги. И во флайку из него пускаю таймер (прошло/осталось).

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

Про синглтон спасибо! Позднее попробую... сейчас текущий проект на стадии "лишь бы заработало"... А потом, когда за надежность и оптимизацю возмусь... попробую и Ваш вариант!
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
07.01.2016, 08:25
Помогаю со студенческими работами здесь

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

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

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

Как в порождаемый класс передать ссылку на основной класс?
Основной класс: #ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> #include "mypaint.h" namespace Ui { ...

Передать ссылку в класс?
Имеется класс class Link { float defLen; //длина пружины в ненапряжённом состоянии float stiffness; //параметр,...


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru