Как сохранить состояние активности андроида

У меня есть два занятия: мой MainActivity и еще один под названием DetailActivity. Когда приложение запускается впервые, оно открывает MainActivity, связывает DataService и делает вызов для получения некоторых данных и заполнения представления списка.

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

Это делается так:

final Intent intent = new Intent(getContext(), DetailActivity.class);
intent.putExtra("data", dto);
getContext().startActivity(intent);

Когда открыт второй, пользователь может вернуться назад либо с помощью кнопки «Назад» (одна слева от кнопки «Домой» на Android), либо щелкнув стрелку «Назад» в заголовке.

Все работает так, как ожидалось, за исключением того, что когда пользователь возвращается к MainActivity, DataService снова связывается, и выполняется вызов для извлечения данных, и список обновляется. Итак, если пользователь находится где-то в пункте №. 205 он будет возвращен обратно к стартовому пункту.

Есть ли способ сохранить данные или состояние MainActivity, когда пользователь возвращается к нему, который не обновляется?

Сервис связан вот так

@Override
protected void onStart() {
    super.onStart();
    bind(DataService.class);
}

@Override
protected void onDestroy() {
    super.onDestroy();
    unbindService(connection);
}

private void bind(final Class... toBind) {
    for (final Class clazz : toBind) {
        bindService(new Intent(this, clazz), connection, BIND_AUTO_CREATE);
    }
}

private ServiceConnection connection = new ServiceConnection() {
    @Override
    public void onServiceConnected(final ComponentName name, final IBinder service) {
        if (service instanceof DataService.LocalBinder) {
            dataService = ((DataService.LocalBinder) service).getInstance();
            dataService.readData();
        }
    }

    @Override
    public void onServiceDisconnected(final ComponentName name) {
        // Empty By Default
    }
};

person mirzak    schedule 23.10.2018    source источник
comment
Да, извините, английский не мой родной язык. Я использовал автокоррекцию.   -  person mirzak    schedule 23.10.2018
comment
Вы должны использовать saveinstancestate в Parent Activity для управления поведением   -  person Asad Ali    schedule 23.10.2018


Ответы (2)


Этого можно добиться, привязав службу к onCreate() вместо onStart().

Вам также следует обратить внимание на симметрию вашего жизненного цикла. В настоящее время вы выполняете привязку при запуске и отвязываете при уничтожении. Если вы привязываетесь в onStart, вам, вероятно, следует отменить привязку в onStop. Когда вы перемещаете привязку в onCreate, вы можете оставить отвязку в onDestroy

Объяснение: onCreate() вызывается при первом создании действия. onStart() вызывается каждый раз, когда ваша активность становится видимой.

person Hendrik Marx    schedule 23.10.2018
comment
У меня все еще такое же поведение. Я также заметил, что onDestroy вызывается, когда я возвращаюсь из второго действия. Я не уверен, должно ли это произойти. - person mirzak; 24.10.2018
comment
Если на вашем устройстве недостаточно памяти или вы не поддерживаете активность в параметрах разработчика, ваша активность будет уничтожена, когда она станет невидимой, и воссоздана, когда она станет видимой. Вы можете сохранить состояние своей активности для этих случаев, внедрив «onSaveInstanceState (Bundle)». Вы можете поместить примитивные значения или сериализуемые или разделяемые объекты в пакет, и вы получите этот пакет, доставленный вам обратно в параметре «onCreate». Например, вы можете сохранить свой индекс прокручиваемого элемента, а затем программно прокрутить его, как только ваши данные будут снова получены. - person Hendrik Marx; 24.10.2018

Удалось решить это так

@Override
public boolean onSupportNavigateUp() {
    onBackPressed(); // one inherited from android.support.v4.app.FragmentActivity

    return false;
}

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

person mirzak    schedule 10.11.2018