Как восстановить предыдущее приложение после того, как мое приложение помещено в фоновом режиме на Android - PullRequest
0 голосов
/ 21 октября 2018

Мне нужен способ восстановить предыдущую задачу Android, когда текущая задача (мое приложение) переводится в фоновый режим с помощью кнопки «Назад» или «Обзор».Например, видео воспроизводится приложением YouTube при получении вызова SIP.Задача программного телефона выводится на передний план, а затем на вызов поступает ответ.Как только звонок завершится, при нажатии кнопки назад или обзора отобразится приложение YouTube, и видео продолжится.Примером такого приложения для Android является Linphone.Я хотел бы знать, как этого можно достичь программным путем.

Ответы [ 3 ]

0 голосов
/ 24 октября 2018

вот официальная документация о том, как сохранить состояние пользовательского интерфейса:

https://developer.android.com/topic/libraries/architecture/saving-states

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

получение вызова из телефонного приложения прерывает ваше приложение (Система-инициализированное отклонение состояния пользовательского интерфейса) что вы должны сделать, как предложено в документации выше:

В разделе: Управление состоянием пользовательского интерфейса: разделяй и властвуй

  • Локальное постоянство: Магазинывсе данные, которые вы не хотите потерять, если откроете и закроете активность.Пример: коллекция объектов песни, которая может включать аудиофайлы и метаданные.
  • ViewModel: сохраняет в памяти все данные, необходимые для отображения соответствующего контроллера пользовательского интерфейса.Пример: объекты песни самого последнего поиска и самого последнего поискового запроса.

  • onSaveInstanceState (): хранит небольшой объем данных, необходимых для простой перезагрузки состояния активности, если система останавливается, а затем воссоздает контроллер пользовательского интерфейса.Вместо того, чтобы хранить сложные объекты здесь, сохраняйте сложные объекты в локальном хранилище и сохраняйте уникальный идентификатор для этих объектов в onSaveInstanceState ().Пример: сохранение самого последнего поискового запроса.

, так что в вашем случае есть модель представления, в которой хранится URL-адрес и время видео при получении вызова

и я бы также сохранил ту же информацию в instanceState, используя правильные хуки жизненного цикла

вот хороший SO SO-поток с примером того, как использовать saveInstanceState: Сохранение состояния активности Android с помощью Сохранить состояние экземпляра

у него есть старые и новые ответы, вы можете прочитать его, чтобы получить представление о том, как все изменилось со временем

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

0 голосов
/ 24 октября 2018

Как заявили другие и здесь , Android обрабатывает это автоматически для вас.Но если вам нужно что-то добавить явно при переходе / переходе в / из фонового состояния, тогда вы также можете переопределить onSaveInstanceState() и onRestoreInstanceState() методы, которые будут вызываться соответственно.

КакВаша активность начинает останавливаться, система вызывает метод onSaveInstanceState(), чтобы ваша деятельность могла сохранять информацию о состоянии в пакет состояния экземпляра.Реализация по умолчанию этого метода сохраняет временную информацию о состоянии иерархии представления деятельности, такую ​​как текст в виджете EditText или положение прокрутки виджета ListView.

Чтобы сохранить дополнительную информацию о состоянии экземпляра для вашей деятельности, вы должны переопределить onSaveInstanceState() и добавить пары ключ-значение к объекту Bundle, который сохраняется в случае неожиданного уничтожения вашей деятельности.Если вы переопределите onSaveInstanceState(), вы должны вызвать реализацию суперкласса, если хотите, чтобы реализация по умолчанию сохранила состояние иерархии представлений.

@Override
protected void onRestoreInstanceState(Bundle outState) {
    if (outState != null) {
       Crashlytics.log(1, "FormActivity", "Method:onRestoreInstanceState, Msg: saved instance is not null");

        if (outState.containsKey("record")
                && Session.getCurrentRecord() == null) {
            Session.setCurrentRecord(
                    gson.fromJson(
                            outState.getString("record"),
                            Record.class
                    )
            );
        }

        if (outState.containsKey("user")
                && Session.getCurrentUser() == null) {
            Session.setCurrentUser(
                    gson.fromJson(
                            outState.getString("user"),
                            User.class
                    )
            );
        }
    }
    super.onRestoreInstanceState(outState);
}

@Override
protected void onSaveInstanceState(Bundle outState) {
    Session.setCurrentRecord(record);
    outState.putString("record", gson.toJson(Session.getCurrentRecord()));
    outState.putString("user", gson.toJson(Session.getCurrentUser()));

    super.onSaveInstanceState(outState);
}

Источник 1 Источник 2

0 голосов
/ 24 октября 2018

Это делается автоматически системой Android.

Теперь, почему вы, возможно, не сможете заметить такое поведение для своего приложения.

  • Возможно, вы запускаете свое приложение из панели запуска приложений.Это означает, что вы уже поместили все другие приложения (кроме панели запуска) в фоновом режиме.Теперь, в зависимости от настроек программы запуска, вы можете перейти на страницу, с которой вы запустили приложение, или домой, когда вы нажмете кнопку назад.

Когда вы можете наблюдать это поведение

  1. Если ваша деятельность запускается из фоновой службы, например, широковещательный приемник
  2. Если ваша деятельность запускается нажатием на кнопку уведомления

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

Исключение - если вы используете кнопку «Домой», все приложения уходятна задний план и появляется главный экран.

надеюсь, это поможет.

...