Урок 70. onSaveInstanceState. Сохранение данных Activity при повороте экрана

Обсуждение уроков
Аватара пользователя
Mikhail_dev
Сообщения: 2386
Зарегистрирован: 09 янв 2012, 14:45
Откуда: Самара

Re: Урок 70. onSaveInstanceState. Сохранение данных Activity

Сообщение Mikhail_dev » 13 сен 2014, 14:37

В манифесте к активности добавляете пару флагов. Например
[syntax=xml]
<activity android:name=".YourActivity"
android:configChanges="orientation"
android:screenOrientation="portrait"/>
[/syntax]
и она всегда будет в ландшафте или портрете, как выставите

nazar_developer
Сообщения: 15
Зарегистрирован: 02 июл 2014, 15:26

Re: Урок 70. onSaveInstanceState. Сохранение данных Activity

Сообщение nazar_developer » 13 сен 2014, 14:58

Mikhail_dev писал(а):В манифесте к активности добавляете пару флагов. Например
[syntax=xml]
<activity android:name=".YourActivity"
android:configChanges="orientation"
android:screenOrientation="portrait"/>
[/syntax]
и она всегда будет в ландшафте или портрете, как выставите
setRequestedOrientation(0);

я зделал вот так еше до того как ви мне подсказали, но он бил только в одном положение, горизотальном, но все би супер, но когда перевернуть его горизонтально но только в противоположную сторону, ничего не меняетса, шас попробую как ви сказали через манифест=)

Спасибо ) , но твой вариант такой же как мой, только в одном положение

Аватара пользователя
mdzht
Сообщения: 124
Зарегистрирован: 11 ноя 2013, 11:33
Откуда: fock it
Контактная информация:

Re: Урок 70. onSaveInstanceState. Сохранение данных Activity

Сообщение mdzht » 13 апр 2015, 15:58

Но если приостановленное Activity уничтожается, например, при нехватке памяти, то соответственно удаляются и все его объекты. И если к нему снова вернуться, то системе надо заново его создавать и восстанавливать данные, которые были утеряны при уничтожении
а нельзя пересоздать объекты Контекста или Активити после уничтожения процессов андроидом, для освобождения памяти. Данные грузятся из интернета и не храню их в базе. меня вполне устраивает,что бы он заново загружал. Получаю нул поинтер когда обращаюсь к объектам активити/контекста
«Life is too short to spend rewriting code»

K_Vladimir
Сообщения: 36
Зарегистрирован: 28 июн 2015, 03:13

Re: Урок 70. onSaveInstanceState. Сохранение данных Activity

Сообщение K_Vladimir » 20 июл 2015, 11:32

Добрый день!

В уроке при повороте экрана сказано сначала onSaveInstanceState, а потом onPause

У меня при повороте (проверял на разных AVD) всё время сначала срабатывает onPause, а потом onSaveInstanceState
Запарился искать что не так.

Код: Выделить всё

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;


public class MainActivity extends Activity {

    final String LOG_TAG = "myLogs";
    int cnt = 0;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        Log.d(LOG_TAG, "onCreate");
    }

    protected void onDestroy() {
        super.onDestroy();
        Log.d(LOG_TAG, "onDestroy");
    }

    protected void onPause() {
        super.onPause();
        Log.d(LOG_TAG, "onPause");
    }

    protected void onRestart() {
        super.onRestart();
        Log.d(LOG_TAG, "onRestart");
    }

    protected void onRestoreInstanceState(Bundle savedInstanceState) {
        super.onRestoreInstanceState(savedInstanceState);
        Log.d(LOG_TAG, "onRestoreInstanceState");
    }

    protected void onResume() {
        super.onResume();
        Log.d(LOG_TAG, "onResume ");
    }

    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        Log.d(LOG_TAG, "onSaveInstanceState");
    }

    protected void onStart() {
        super.onStart();
        Log.d(LOG_TAG, "onStart");
    }

    protected void onStop() {
        super.onStop();
        Log.d(LOG_TAG, "onStop");
    }

    public void onclick(View v) {
    }
}
Кто-нибудь подскажет?

dassad
Сообщения: 8
Зарегистрирован: 20 дек 2015, 00:03

Re: Урок 70. onSaveInstanceState. Сохранение данных Activity

Сообщение dassad » 19 июл 2016, 00:27

Т.е., например, у нас есть какой то объект myObj (класс MyObject) и нам надо сохранить ссылку на него при повороте экрана.

public Object onRetainNonConfigurationInstance() {
return myObj;


я так понимаю public MyObject onRetainNonConfigurationInstance... должно быть?
путает тем более что реально есть класс Object

zuzka
Сообщения: 3
Зарегистрирован: 14 июн 2015, 03:52

Re: Урок 70. onSaveInstanceState. Сохранение данных Activity

Сообщение zuzka » 26 авг 2016, 13:10

dassad писал(а):Т.е., например, у нас есть какой то объект myObj (класс MyObject) и нам надо сохранить ссылку на него при повороте экрана.

public Object onRetainNonConfigurationInstance() {
return myObj;


я так понимаю public MyObject onRetainNonConfigurationInstance... должно быть?
путает тем более что реально есть класс Object
Класс Object является родителем у всех классов в Java. При переопределении метода не надо трогать возвращаемое значение - ломаете сигнатуру. И если надо 2 объекта сохранить, будете 2 метода делать? Как пример использования: http://stackoverflow.com/questions/1704 ... oninstance
Вам при восстановлении надо будет проверить через instaceof является ли получаемый объект (Object) вашим (MyObj) и привести его к этому типу(почему-то нигде никто не проверяет на соответствие типов при приведении, видимо никогда после коллег код не правили, в 5-10 тысячах строк кода не искали эту ошибку)... Я бы вообще смотрел в сторону Parcelable для хранения своих объектов.

AlexeyFedor
Сообщения: 31
Зарегистрирован: 03 сен 2013, 14:26

Re: Урок 70. onSaveInstanceState. Сохранение данных Activity

Сообщение AlexeyFedor » 03 окт 2016, 09:55

Еще можно так. Чтобы переменные не переписывались

Код: Выделить всё

public class MainActivity extends Activity {
	EditText 	edText1,edtext2;
	Boolean firstStart=true;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		if(firstStart){
			edText1=(EditText) findViewById(R.id.editText1);
			edtext2=(EditText)findViewById(R.id.editText2);
			firstStart=false;
		}
	}

WKBAPKA
Сообщения: 32
Зарегистрирован: 03 янв 2014, 14:28

Re: Урок 70. onSaveInstanceState. Сохранение данных Activity

Сообщение WKBAPKA » 26 фев 2017, 17:12

а ежели я вызываю метод setResult(resCode, data)
помещаю в него data в виде интента с данными, как мне получить эти данные в событии onSaveInstanceState()?
можно конечно сохранять все в переменные, но я уж очень ленивый, если я упаковал нужные мне данные с помощью setResult(), то по идее я могу получить их.
однако getIntent() возвращает Intent переданные при вызове второй Activity, а как получить доступ к упакованным данным?

WKBAPKA
Сообщения: 32
Зарегистрирован: 03 янв 2014, 14:28

Re: Урок 70. onSaveInstanceState. Сохранение данных Activity

Сообщение WKBAPKA » 26 фев 2017, 17:22

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

WKBAPKA
Сообщения: 32
Зарегистрирован: 03 янв 2014, 14:28

Re: Урок 70. onSaveInstanceState. Сохранение данных Activity

Сообщение WKBAPKA » 26 фев 2017, 17:27

argamidon писал(а):У меня два вопроса.
1) почему при обычном сворачивании (кнопка home) вызывается метод onSaveInstanceState();
2) куда уходят эти данные? дело в том что если просто свернуть программу, по непонятной причине вызывается метод onSaveInstanceState, при повторном выдвижении свернутой Activity на передний план метод onCreate естественно не вызывается , метод onResoteInstanceState тоже не вызывается (и не должен). так куда идут данные при сворачивании программы и для чего вызов onSaveInstanceState при сворачивании?
все очень просто. за все отвечает ОС. Вы свернули активити, активити был помещен в стек, однако, не был уничтожен, вы его разворачиваете, активити еще живой и выходит на первый план. Соответственно методы onCreate() и onRestore OS не вызывает, т.к. ничего не поменялось.
С другой стороны, никто не знает когда ОС удалить активити из стека, поэтому метод onSaveInstanceState() вызывается всегда, на всякий случай!

Ответить