2013-04-29 3 views
1

Я хотел бы спросить о вызове Activity с аргументами. Я видел много примеров. Но я хотел бы спросить объяснение, почему это так или иначе «нелегко» или «не просто» для создания (вызова) действия с настраиваемыми аргументами.Вызов с помощью настраиваемых аргументов

Я видел много сообщений, таких как this и другие. Люди передают строки, но не пользовательские объекты. Да, они передают пользовательские объекты, реализуя сериализуемые и анализируемые методы, но это не кажется эффективным (я могу ошибаться, потому что не видел его). Для final объявленных классов, это еще больше работы.

Когда мы передаем строку с (имя строки, значение строки) putExtras, почему функция как putExtras (имя String, объект Object) не определен? не будет ли проще передавать какие-либо пользовательские объекты?

И о сложности процесса, объяснение было дано в посте here

beacuse приложения находятся в разных процессах, и имеют отдельные памяти адресных пространств, вы не можете просто послать указатель (ссылку) на блок памяти в вашем процессе и ожидайте, что он будет доступен в другом процессе.

Но, тем не менее, я не мог найти причину, которая удовлетворяет меня или помогает мне понять, чего я не вижу. Хорошо, скажем, приложения находятся в разных процессах, а их пространства памяти разные. Итак, мы копируем данные, которые нужно передать в пространство памяти другого объекта? или, по крайней мере, не должны действия, принадлежащие к одному и тому же приложению (я считаю, что действия в приложении имеют нечто общее, что касается его приложения) имеют общее пространство памяти, чтобы они могли легко делиться или передавать данные?

Я просто пытаюсь разъяснить себе об этом. Я знаю, что Android не следует сравнивать с разработкой Windows, но похоже, что было бы лучше, если бы все было проще. Я знаю, что я что-то пропустил, иначе все будут проще. Но что мешает легче проезжать?

Спасибо.

+0

Я согласен с этим и могу заключить, что Android построен довольно глупо. Чтобы заставить простые объекты быть Сериализуемыми, просто передать его из одной Деятельности в другую, просто ... безумный. Конечно, CommonsWare объясняет, почему, но если бы я работал дизайнером ОС Android, и я бы придумал такую ​​вещь, я бы уволился с работы и снова запретил себе когда-либо кодирование ;-) – Ted

ответ

0

Почему функция, например putExtras (String name, Object object) не определена? не будет ли проще передавать какие-либо пользовательские объекты?

Потому что startActivity() всегда пересекает границу процесса, и, следовательно, все, что передается, должно быть преобразовано в массив байтов для транспорта.

Итак, мы копируем данные, которые нужно передать в пространство памяти другого объекта?

Мы копируем данные между процессами.

или, по крайней мере, не должны быть действиями, принадлежащими к одному и тому же приложению (я считаю, что действия в приложении имеют что-то общее, адресованное его приложению) имеют общее пространство памяти, чтобы они могли легко делиться или передавать данные ?

За исключением того, что основная работа startActivity() не выполняется вашим приложением, а является основным процессом операционной системы.

Я знаю, что Android не следует сравнивать с разработкой Windows, но кажется, что было бы лучше, если бы все было проще.

Лучшая аналогия - это веб-разработка, в которой вы не передаете объекты между клиентом и сервером, а скорее сортируете данные из строк или байтов.

+0

Действительно данные, переданные операции, которые копируются и не ссылаются? Я думаю, поэтому Android не позволяет передавать объекты. Таким образом, нет никакого способа передать изображение между действиями, которые я предполагаю. Все еще пытаюсь понять причину «почему». – OmerHalit

+0

@OmerHalit: «Действительно ли данные переданы операции, которую копируют и не ссылаются?» -- да. «Таким образом, нет никакого способа передать изображение между действиями, которые я предполагаю», а не с помощью опций «Intent», если они не очень малы. «По-прежнему пытаюсь понять причину« почему »- так они решили написать операционную систему. – CommonsWare

+0

«вот как они решили написать операционную систему» ​​- мне нужно выяснить, почему они выбрали этот путь. Должна быть польза, если они избрали это, или они просто ошибаются. Просто мне нужно понять архитектуру, чтобы я знал, что делаю, но это заставляет меня долго. В веб-разработке я понимаю, потому что пользователь и источник не в том же месте, а в Android. Это то же самое в iOS или проще? – OmerHalit

0

Подобно тому, как вы выяснили сами вы передаете данные между деятельностью через Bundle, как это:

Intent intent = new Intent(context, MyActivity.class); 
intent.putExtra(key, "some string"); 
intent.putExtra(key, true); 
intent.putExtra(key, 1.5f); 

Дело в том, что Intents и Связки являются очень универсальный способ передачи данных не только между самостоятельно а также к другим приложениям, например, путем запуска клиента обмена сообщениями и предоставления предопределенного объекта и тела. Это очень мощно, но это тоже ограничение. Что делать, если вы хотите передать MyFooClass? Ну, вы не можете этого сделать, поскольку Intent является абстрактным способом выполнения операции не только в вашем собственном приложении. Можно утверждать, что Google должен был сделать исключение для намерений между вашими собственными действиями, но я действительно не вижу в этом очень большой проблемы.

Вы можете, как вы говорите, сериализовать объект, используя сериализуемый интерфейс, но вы также можете сериализовать его как объект JSON. Я бы также сказал, что если вам нужно передать сложные структуры данных между действиями, вам действительно нужно переосмыслить свой дизайн. Вероятно, вы должны иметь какое-либо состояние глобального приложения (в своем приложении или аналогичном классе) и только пропускать идентификаторы, ключи или аналогичные данные, которые вы можете использовать для поиска данных из состояния вашего приложения.

Смежные вопросы