Мне нужно передать ссылку на класс, который выполняет большую часть моей обработки через пакет.
Проблема в том, что он не имеет ничего общего с намерениями или контекстами и содержит большое количество непримитивных объектов. Как мне упаковать класс в пакетный / сериализуемый и передать его классу startActivityForResult
?
Ответы:
Чтобы понять, какой путь выбрать, необходимо ответить не только на ключевой вопрос CommonsWare «почему», но и на вопрос «к чему?» вы проходите мимо.
Реальность такова, что единственное, что может проходить через пакеты, - это простые данные - все остальное основано на интерпретации того, что эти данные означают или на что указывают. Вы не можете буквально передать объект, но вы можете сделать одно из трех:
1) Вы можете разбить объект на составляющие данные, и если то, что на другом конце знает об объекте того же типа, оно может собрать клон из сериализованных данных. Вот как большинство распространенных типов проходят через связки.
2) Можно передать непрозрачную ручку. Если вы передаете его в одном контексте (хотя можно спросить, зачем беспокоиться), это будет дескриптор, который вы можете вызвать или разыменовать. Но если вы передадите его через Binder в другой контекст, его буквальным значением будет произвольное число (фактически, эти произвольные числа считаются последовательно с момента запуска). Вы не можете ничего делать, кроме как отслеживать его, пока не передадите его обратно в исходный контекст, что заставит Binder преобразовать его обратно в исходный дескриптор, что снова сделает его полезным.
3) Вы можете передать волшебный дескриптор, такой как дескриптор файла или ссылку на определенные объекты ОС / платформы, и если вы установите правильные флаги, Binder создаст клон, указывающий на тот же ресурс для получателя, который фактически может быть использован на другой конец. Но это работает только для очень немногих типов объектов.
Скорее всего, вы либо передаете свой класс, чтобы другой конец мог отслеживать его и возвращать вам позже, либо вы передаете его в контекст, где клон может быть создан из сериализованных составляющих данных ... или иначе вы пытаетесь сделать что-то, что просто не сработает, и вам нужно переосмыслить весь подход.
источник
Вы также можете использовать Gson для преобразования объекта в JSONObject и передачи его в пакет. Для меня это был самый элегантный способ сделать это. Я не тестировал, как это влияет на производительность.
В начальной деятельности
В следующем действии
источник
Интерфейс Parcelable - хороший способ передать объект с намерением.
Как я могу сделать свои пользовательские объекты доступными для посылки? - довольно хороший ответ о том, как использовать Parcelable
Официальные документы Google также включают пример
источник
Вы можете использовать глобальное состояние приложения .
Обновить:
Настройте, а затем добавьте это в свой AndroidManifest.xml:
А затем создайте в своем проекте такой класс:
И поскольку «к нему можно получить доступ через getApplication () из любого действия или службы », вы используете его следующим образом:
Надеюсь, это поможет.
источник
Вы также можете сделать свои объекты сериализуемыми и использовать методы getSerializable и putSerializable из Bundle .
источник
Возможное решение:
Класс CustomObject:
Подпользовательские объекты:
источник
Еще один способ отправить объекты через пакет - использовать
bundle.putByteArray
образец кода
поместите объект DataBean в Bundle:
Преобразование объектов в байтовые массивы
Вернуть объект из пакета:
Метод получения объектов из байтовых массивов:
Надеюсь, это поможет другим приятелям.
источник
1. Очень простой и простой в использовании пример: создайте объект, который нужно передать, с реализацией Serializable.
2. передать объект в связку
3. получить переданный объект из пакета как Serializable, а затем передать его в Object.
источник
Это очень запоздалый ответ на мой собственный вопрос, но он продолжает привлекать внимание, поэтому я чувствую, что должен ответить на него. Большинство из этих ответов верны и отлично справляются с работой. Однако это зависит от потребностей приложения. Этот ответ будет использован для описания двух решений этой проблемы.
заявка
Во-первых, это приложение , так как об этом здесь больше всего говорят. Приложение - хороший объект для размещения сущностей, которым нужна ссылка на контекст. ServerSocket, несомненно, будет нуждаться в контексте (для файлового ввода-вывода или простых обновлений ListAdapter). Я лично предпочитаю этот маршрут. Мне нравятся приложения, они полезны для извлечения контекста (потому что они могут быть статичными и вряд ли вызовут утечку памяти) и имеют простой жизненный цикл.обслуживание
` обслуживания - второй. `Сервис` на самом деле лучший выбор для моей проблемы, потому что сервисы предназначены для этого: Сервисы удобны тем, что имеют более определенный жизненный цикл, которым легче управлять. Кроме того, при необходимости службы могут работать вне приложения (т. Е. При загрузке). Это может быть необходимо для некоторых приложений или просто изящной функции.Это не было полным описанием, но я оставил ссылки на документы для тех, кто хочет узнать больше. В целом
Service
это лучше для экземпляра, который мне нужен - запуска ServerSocket на моем устройстве SPP.источник
Я столкнулся с этим вопросом, когда искал способ передать объект Date. В моем случае, как было предложено среди ответов, я использовал Bundle.putSerializable (), но это не сработало бы для такой сложной вещи, как описанный в исходном сообщении DataManager.
Мое предложение, которое даст очень похожий результат на размещение указанного DataManager в приложении или превращение его в Singleton, состоит в том, чтобы использовать Dependency Injection и привязать DataManager к области Singleton и внедрить DataManager везде, где это необходимо. Вы не только получите преимущество повышенной тестируемости, но также получите более чистый код без всего стандартного кода «передачи зависимостей между классами и действиями». (Робо) С Guice очень легко работать, и новый фреймворк Dagger также выглядит многообещающим.
источник
еще один простой способ передать объект с помощью пакета:
источник