Ответ 1
Вы не можете "передать интерфейс". "Интерфейс" - это абстрактная вещь. То, что вы хотите передать, - это конкретная реализация этого интерфейса, то есть: объект (который реализует ваш интерфейс). Когда вы создаете экземпляр своего "интерфейса" (в вашем примере, например:
intent.putExtra("testInterface", new ITest() {
@Override
void onSuccess(String text) {
}
}
вы фактически создаете экземпляр анонимного класса, который реализует интерфейс ITest
. Чтобы передать это в Intent
вам нужно будет сделать этот класс также реализованным Parcelable
или Serializable
.
Однако, даже если вы это сделали, это не решит вашу проблему. Вам нужно понять, что вы не можете передавать объекты (экземпляры), помещая их как "дополнительные" в Intent
. Когда вы это делаете, Android фактически сериализует и затем десериализует объект, так что вы получаете 2 объекта, один представляет собой сериализованную/десериализованную копию оригинала.
Если вы хотите, чтобы ActivityB
взаимодействовал с ActivityA
, вам нужно будет использовать другой метод. Попробуйте один из них:
-
ActivityB
отправляет трансляциюIntent
, которуюActivityA
прослушивает для -
ActivityA
запускаетActivityB
используяstartActivityForResult()
иActivityB
отправляет данные обратно вActivityA
с помощьюsetResult()
- Использовать
public static
(т.е. глобальные) переменные для связи - Сохранять данные в общих настройках, файле или базе данных
То, что вам действительно нужно понять, состоит в том, что при определенных условиях может произойти следующее:
- ваше приложение работает с
ActivityA
в стеке иActivityB
в верхней части стека - пользовательские прессы HOME
- Android переводит вашу задачу на задний план и в конечном итоге убивает процесс хостинга
- Пользователь возвращается в ваше приложение (путем его повторного запуска или выбора из списка "недавняя задача"
- Android создает новый процесс для вашего приложения и запускает
ActivityB
, а затем вызываетonCreate()
,onStart()
иonResume()
ActivityB
.
В этом случае больше нет экземпляра ActivityA
. Этот экземпляр мертв. Таким образом, ActivityB
не может связываться с ActivityA
поскольку он больше не существует.