Пропустить интерфейс между действиями в целях - интерфейс не может быть Serializable или Parcelable

Я хочу передать интерфейс от 1-го действия до 2-го действия.

Я хочу инициировать методы из интерфейса из 2-го действия, которое повлияет на 1-ю деятельность.

Мне хорошо известно, что это очень не позволяет использовать механизм onActivityResult, и что это может быть не очень хорошее программирование, но, пожалуйста, скажите мне.

Здесь проблема - мой интерфейс не может реализовать Serializable/Parcelable, поскольку интерфейс не может реализовать другой класс.

Это мой интерфейс:

public interface ITest {
     void onSuccess(String text);
}

Но я не могу начать свою деятельность с этого интерфейса, так как он не является исчерпывающим.

intent.putExtra("testInterface", new ITest() {
    @Override 
    void onSuccess(String text) {
    }
}

Очевидно, что я получаю ошибку компиляции: Cannot resolve method 'putExtra(java.lang.String, ITest)'

Ответ 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 поскольку он больше не существует.

Ответ 2

Простым решением проблемы было бы сделать интерфейс Itest расширением класса Parcelable. Таким образом, реализующий класс интерфейса должен будет реализовать Parcelable методы, и вы можете передать ссылку на интерфейс в методе putParcelable. Надеюсь это поможет.

Ответ 3

Подобная необходимость иногда возникает для меня, когда вокруг ActivityA нет, но мне все еще нужно выполнить некоторый код, о котором ActivityB не знает.

Что я обычно делаю в этом случае, так это передаю Посланника в намерении. (Messenger реализует Parcable, чтобы его можно было передать).

ActivityB отправит определенные сообщения в мессенджер, а ActivityA выполнит соответствующие вызовы интерфейса при получении правильных сообщений.