2010-12-28 2 views
2

Я пытаюсь создать расширенный класс Intent (я его называю DataIntent), предоставив ему возможность удерживать «полезную нагрузку» типа Object (по сравнению с использованием встроенного средства для Uri). DataIntent расширяет класс Android Intent.Расширение класса Intent ... received ClassCastException

Activity Создает объект с расширенными возможностями без проблем, а вызов startActivityForResult() уходит без проблем. Но, отвечая на вопрос Activity, когда я вызываю метод getIntent(), и попытаюсь отбросить его на мой DataIntent, я брошу ClassCastException.

Я понимаю, что это, вероятно, очень глупый вопрос - 1,000 извинения заранее - но кто-нибудь знает, почему я не могу бросить его на DataIntent, так это то, что было использовано, чтобы начать новый Activity и DataIntent является потомком Intent ?

DataIntent dataIntent = (DataIntent)getIntent(); 
// invoked inside the responding Activity instance - throws a ClassCastException 
+1

Зачем вам это делать? Вам известно о 'http://developer.android.com/reference/android/content/Intent.html#putExtra(java.lang.String, android.os.Parcelable)'? –

+0

Я бы предпочел держаться подальше от интерфейса Parcelable, потому что он излишне «тяжелый» - по сравнению с просто назначением ссылки на мой объект (все это обезвоживание/регидратация через процесс сериализации). – BonanzaDriver

ответ

4

Вы не можете этого сделать, извините. Вы должны поместить свои данные в Intent. Объект Intent перемещается по процессам, и, таким образом, тот, который вы возвращаете, - это не тот экземпляр, который вы создали.

+0

Ах. Хорошо, это имеет смысл. Я уверен, что это где-то документально, и я его еще не видел. Было бы полезно, если бы Google пометил этот класс как final, поэтому мы не пытаемся его расширить. Я надеялся избежать использования интерфейса Parcelable, но я думаю, что это сила моей руки. Спасибо, hackbod. – BonanzaDriver

+0

Существуют и другие способы отправки данных, но похоже, что вы хотите отправить их другим приложениям. Как говорит hackbod, вы не можете передавать живые объекты через границы процесса. – Falmarri

+0

На самом деле нет. Мне нужно отправить его только в том же приложении, но поскольку архитектура, по-видимому, реализована таким образом, что моя принимающая активность может быть очень успешной в другом процессе, поэтому исходная ссылка Intent больше недействительна, имеет смысл, почему я получаю исключение ClassCastException. – BonanzaDriver

1

Я сделал то же самое CirrusFlyer. Я также искал ключевое слово final, прежде чем начал его реализовывать. Google должен отметить класс Intent как окончательный.

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