Питання Збереження стану активності Android за допомогою параметра «Зберегти стан експорту»


Я працював на платформі Android SDK, і це трохи незрозуміло, як зберегти стан програми. Отже, враховуючи цю незначну перебудову прикладу "Hello, Android":

package com.android.hello;

import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;

public class HelloAndroid extends Activity {

  private TextView mTextView = null;

  /** Called when the activity is first created. */
  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    mTextView = new TextView(this);

    if (savedInstanceState == null) {
       mTextView.setText("Welcome to HelloAndroid!");
    } else {
       mTextView.setText("Welcome back.");
    }

    setContentView(mTextView);
  }
}

Я думав, цього буде достатньо для найпростішого випадку, але він завжди відповідає першому повідомленню, незалежно від того, яким чином я переміщуюсь у додатку.

Я впевнений, що рішення є настільки ж простою, що і головне onPause або щось подібне, але я пробрався в документації протягом 30 хвилин і так і не знайшов нічого очевидного.


2238
2017-09-30 04:41


походження


Коли збережено InstanceState == нуль і коли він не нульовий? - Trojan.ZBOT
Ви явно знищуєте свою активність, як ви сказали, віддаляючись від неї, наприклад, натискаючи назад. Насправді, сценарій, в якому використовується цей "savedInstanceState", коли Android руйнує вашу активність для відпочинку. Для intance: якщо ви змінюєте мову вашого телефону в той час, коли діяльність була запущена (і тому потрібно завантажувати різні ресурси з вашого проекту). Інший дуже поширений сценарій полягає в тому, що ви повертаєте телефон на бік, щоб активність відтворювалася та відображалася в ландшафтному режимі. - villoren
Щоб отримати друге повідомлення, увімкніть параметр "Не тримати дії" у параметрах dev. Натисніть кнопку "Домашня" і поверніться з рецензій. - Yaroslav Mytkalyk
це дуже корисно developer.android.com/training/basics/activity-lifecycle/... - Syed Raza Mehdi
ви можете зробити це за допомогою: onSaveInstanceState (Bundle savedInstanceState) - HPbyP


Відповіді:


Вам потрібно перевизначити onSaveInstanceState(Bundle savedInstanceState) і напишіть значення стану програми, які ви хочете змінити на Bundle параметр:

@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
  super.onSaveInstanceState(savedInstanceState);
  // Save UI state changes to the savedInstanceState.
  // This bundle will be passed to onCreate if the process is
  // killed and restarted.
  savedInstanceState.putBoolean("MyBoolean", true);
  savedInstanceState.putDouble("myDouble", 1.9);
  savedInstanceState.putInt("MyInt", 1);
  savedInstanceState.putString("MyString", "Welcome back to Android");
  // etc.
}

Компонент є, по суті, способом зберігати карту NVP ("Пара-назва-цінність"), і вона буде передана в onCreate() а також onRestoreInstanceState() де ви витягли такі значення:

@Override
public void onRestoreInstanceState(Bundle savedInstanceState) {
  super.onRestoreInstanceState(savedInstanceState);
  // Restore UI state from the savedInstanceState.
  // This bundle has also been passed to onCreate.
  boolean myBoolean = savedInstanceState.getBoolean("MyBoolean");
  double myDouble = savedInstanceState.getDouble("myDouble");
  int myInt = savedInstanceState.getInt("MyInt");
  String myString = savedInstanceState.getString("MyString");
}

Зазвичай ви використовуєте цю техніку для зберігання значень екземпляра для вашої програми (вибір, незбережений текст тощо).


2275
2017-09-30 06:12



Будь-який шанс, що це працює на телефоні, але не в емуляторі? Я не можу здатися, щоб отримати не-нуль збережених Інстанції. - Adam Jack
У мене є ArrayList точок, як зберегти всі точки в цьому списку масивів, а потім відновити їх? - AZ_
ПОПЕРЕДЖЕННЯ. Вам потрібно зателефонувати до super.onSaveInstanceState (savedInstanceState), перш ніж додавати свої значення в пакет, або вони будуть витиратись на цей дзвінок (Droid X Android 2.2). - jkschneider
Увага: в офіційній документації зазначається, що ви повинні зберігати важливу інформацію в режимі onPause-Method, оскільки метод onsaveinstance не є частиною життєвого циклу android. developer.android.com/reference/android/app/Activity.html - schlingel
Цей факт фактично робить onSaveInstanceState майже безглуздо, крім випадків зміни орієнтації екрану. Майже у всіх інших випадках ви ніколи не зможете покладатися на це, і вам доведеться вручну зберігати стан інтерфейсу користувача де-небудь ще. Або запобігання загибелі вашого додатка через перевизначення поведінки кнопки BACK. Я не розумію, чому вони навіть в першу чергу реалізували це. Повністю неінфункціональний. І ви не можете мати цей пакет, система дозволяє вам зберігати речі, за винятком цього особливого методу. - chakrit


The savedInstanceState це лише для збереження стану, пов'язаного з поточним екземпляром активності, наприклад, поточною інформацією про навігацію або вибір, так що, якщо Android знищує і відтворює активність, він може повернутися як раніше. Дивіться документацію до onCreate і onSaveInstanceState

Для більш тривалого стану, розгляньте можливість використання бази даних SQLite, файлу або налаштувань. Побачити Збереження стійкого стану.


375
2017-09-30 05:03



Коли збережено InstanceState == нуль і коли він не нульовий? - Trojan.ZBOT
savedInstanceState null, коли система створює новий екземпляр вашої діяльності, а не null, коли воно відновлюється. - Gabriel Câmara
... що ставить питання про коли чи потрібно системі створити новий екземпляр діяльності. Деякі способи виходу з програми не створюють зв'язок, тому необхідно створити новий екземпляр. Це фундаментальна проблема; це означає, що не можна покладатися на наявність розшарування, і повинен зробити деякі альтернативні способи постійного зберігання. Перевага onSave / onRestoreInstanceState полягає в тому, що це механізм, який система може зробити різко, не витрачаючи значних системних ресурсів. Тому добре підтримувати це, а також мати постійне зберігання для більш витонченого виходу з програми. - ToolmakerSteve


Зауважте, що це так НЕ безпечно використовувати onSaveInstanceState і onRestoreInstanceState  для постійних даних, відповідно до документації про Діяльність держави в Росії http://developer.android.com/reference/android/app/Activity.html.

У документі зазначено (у розділі "Життєвий цикл діяльності"):

Зауважте, що важливо зберегти   постійні дані в onPause() замість цього   від onSaveInstanceState(Bundle)   тому що пізніше не є частиною   життєвий цикл відкликання, так що не буде   називається у кожній ситуації, як описано   у своїй документації.

Іншими словами, введіть код збереження / відновлення для постійних даних у onPause() і onResume()!

РЕДАГУВАТИ: Для подальшого уточнення, ось onSaveInstanceState() документація:

Цей метод викликається до того, як активність може бути вбита так, що коли вона   повертається якийсь час, в майбутньому він може відновити свій стан. Для   Наприклад, якщо активність B запускається перед діяльністю A, а в деяких   точка активності A вбивається, щоб повернути ресурси, активність A матиме   шанс зберегти поточний стан його користувальницького інтерфейсу через це   метод, щоб, коли користувач повертається до діяльності A, стан   користувальницький інтерфейс може бути відновлений через onCreate(Bundle) або    onRestoreInstanceState(Bundle).


366
2018-05-25 23:22



Просто задирати: це також не небезпечно. Це просто залежить від того, що ви хочете зберегти і скільки часу, який @ Bernard не повністю зрозуміло в своєму оригінальному питанні. InstanceState ідеально підходить для збереження поточного стану інтерфейсу (дані, введені в елементи керування, поточні позиції в списках тощо), тоді як призупинення / відновлення є єдиною можливістю для тривалого зберігання. - Pontus Gagge
Це слід знехтувати. Неможливо використовувати (Save | Restore) InstanceState, наприклад, способи життєвого циклу (тобто робити щось інше в них, ніж зберегти / відновити стан). Вони ідеально підходять для збереження / відновлення стану. Крім того, як ви хочете зберегти / відновити стан наPause і onResume? Ви не отримуєте зв'язки в тих методах, які ви можете використовувати, так що вам доведеться використовувати деякі інші державні ресурси, в базах даних, файли і т. Д., Які є дурними. - Felix
Ми не повинні вдаватися до голосування цієї людини, принаймні, він доклав зусиль для того, щоб пройти документацію, і я думаю, що ми тут люди, щоб фактично побудувати обізнану спільноту і допомагати один одному не знищувати голос. так що 1 голос проголосую за зусилля, і я прошу вас, щоб люди не голосили, а голосували чи не голосували ... ця людина очищає плутанину, яку хочеться мати під час проходження документації. 1 голосувати :) - AZ_
Я не думаю, що ця відповідь заслуговує на зниження. На жаль, він намагався відповісти і процитував розділ з документа. - GSree
Ця відповідь є абсолютно правильною і заслуговує на ВЕЛИКЕ голосування, а не вниз! Дозвольте мені уточнити різницю між штатами для тих хлопців, які цього не бачать. Стан графічного інтерфейсу, як і вибрані радіо-кнопки та деякий текст у полі вводу, набагато менш важливі, ніж стан даних, як-от записи, додані до списку, який відображається в ListView. Остання повинна бути збережена в базі даних на onPause, оскільки це єдиний гарантований дзвінок. Якщо ви замість цього вкладете його в onSaveInstanceState, ви ризикуєте втратити дані, якщо це не називається. Але якщо вибір радіо-кнопки не зберігається з тієї ж причини - це не велика справа. - JBM


Мій колега написав статтю, в якій пояснюється стан застосування на пристроях Android, включаючи пояснення щодо життєвого циклу активності та державної інформації, про збереження інформації про стан та збереження в державі Bundle і SharedPreferences і подивіться тут.

У статті розглядаються три підходи:

Зберігайте локальні дані керування / користувальницького інтерфейсу для терміну служби (тобто тимчасово), використовуючи Bundle Instance State

[Code sample – Store State in State Bundle]
@Override
public void onSaveInstanceState(Bundle savedInstanceState) 
{
  // Store UI state to the savedInstanceState.
  // This bundle will be passed to onCreate on next call.  EditText txtName = (EditText)findViewById(R.id.txtName);
  String strName = txtName.getText().toString();

  EditText txtEmail = (EditText)findViewById(R.id.txtEmail);
  String strEmail = txtEmail.getText().toString();

  CheckBox chkTandC = (CheckBox)findViewById(R.id.chkTandC);
  boolean blnTandC = chkTandC.isChecked();

  savedInstanceState.putString(“Name”, strName);
  savedInstanceState.putString(“Email”, strEmail);
  savedInstanceState.putBoolean(“TandC”, blnTandC);

  super.onSaveInstanceState(savedInstanceState);
}

Зберігайте локальні дані керування / інтерфейсу користувача між екземплярами програми (тобто постійно) за допомогою Спільних уподобань

[Code sample – Store State in SharedPreferences]
@Override
protected void onPause() 
{
  super.onPause();

  // Store values between instances here
  SharedPreferences preferences = getPreferences(MODE_PRIVATE);
  SharedPreferences.Editor editor = preferences.edit();  // Put the values from the UI
  EditText txtName = (EditText)findViewById(R.id.txtName);
  String strName = txtName.getText().toString();

  EditText txtEmail = (EditText)findViewById(R.id.txtEmail);
  String strEmail = txtEmail.getText().toString();

  CheckBox chkTandC = (CheckBox)findViewById(R.id.chkTandC);
  boolean blnTandC = chkTandC.isChecked();

  editor.putString(“Name”, strName); // value to store
  editor.putString(“Email”, strEmail); // value to store
  editor.putBoolean(“TandC”, blnTandC); // value to store    
  // Commit to storage
  editor.commit();
}

Зберігання об'єктів об'єкта в пам'яті між діями впродовж терміну дії програми, використовуючи нестандартний конфігураційний примірник

[Code sample – store object instance]
private cMyClassType moInstanceOfAClass;// Store the instance of an object
@Override
public Object onRetainNonConfigurationInstance() 
{
  if (moInstanceOfAClass != null) // Check that the object exists
      return(moInstanceOfAClass);
  return super.onRetainNonConfigurationInstance();
}

171
2017-08-27 13:54



@ MartinBelcher-Eigo Стаття говорить про дані в SharedPreferences, що "ці дані записуються в базу даних на пристрої .." Я вважаю, що дані зберігаються у файлі в каталозі додатка файлової системи. - Tom
Дані @Tom SharefPrefs записуються у файл XML. Чи є xml своєрідною базою даних? Я б сказав, це є;) - MaciejGórski
Зауважте, що editor.apply() швидше, ніж editor.commit(). - Fred
Посилання мертва. - Sakiboy


Це класична "дочка" розробки Android. Тут є два питання:

  • Існує тонка помилка Android Framework, що значно ускладнює керування стек додатків під час розробки, принаймні в застарілих версіях (не зовсім впевнений, що / коли / як це було виправлено). Я буду обговорювати цю помилку нижче.
  • "Нормальний" або запланований шлях для вирішення цієї проблеми сам по собі досить складний з подвійністю onPause / onResume і onSaveInstanceState / onRestoreInstanceState

Переглядаючи всі ці теми, я підозрюю, що більшість часу розробники говорять про ці два різних питання одночасно ... отже, всі плутанини і повідомлення "це не працює для мене".

По-перше, щоб прояснити "передбачувану" поведінку: onSaveInstance і onRestoreInstance є крихкими і лише для перехідного стану. Призначення використання (afaict) полягає в обробці активності відпочинку, коли телефон обертається (зміна орієнтації). Іншими словами, передбачуване використання полягає в тому, що Ваша Діяльність все ще логічно "на вершині", але все одно повинна бути змінена системою. Збережений пакет не зберігається за межами процесу / пам'яті / gc, тому ви не можете покладатися на це, якщо ваша активність переходить до фону. Так, можливо, пам'ять вашої діяльності буде переживати свою подорож на задній план і втекти від GC, але це не є надійним (і не передбачуваним).

Отже, якщо у вас є сценарій, коли існує значущий "прогрес користувача" або стан, який повинен зберігатися між "запусками" вашої програми, керівництвом є використання наPause і onResume. Ви повинні вибрати і підготувати стійкий магазин самостійно.

АЛЕ - є дуже заплутана помилка, яка ускладнює все це. Подробиці тут:

http://code.google.com/p/android/issues/detail?id=2373

http://code.google.com/p/android/issues/detail?id=5277

В принципі, якщо ваша програма запускається за допомогою прапорця SingleTask, а потім пізніше ви запускаєте її з головного екрана або меню панелі запуску, тоді наступне запрошення створить нове завдання ... у вас буде ефективно мати два різні екземпляри вашого додатка що населяє той самий стек ... що дуже дивно стає дуже швидко. Це, здається, відбувається, коли ви запускаєте додаток під час розробки (наприклад, з Eclipse або Intellij), так що розробники це дуже багато справляються. Але також через деякі механізми оновлення магазину додатків (це також впливає на ваших користувачів).

Я боровся через ці теми протягом декількох годин, перш ніж я зрозумів, що головною моєю проблемою є ця помилка, а не запланована структурна поведінка. Відмінний запис і обхідний шлях (UPDATE: див. Нижче), здається, є користувачем @ kaciula в цій відповіді:

Поведінка натисканням домашньої клавіші

ОНОВЛЕННЯ червень 2013 р: Через місяці я нарешті знайшов "правильне" рішення. Вам не потрібно керувати будь-якими стаціонарними прапорами startApp, ви можете виявляти це з рамки та підлягати заряду. Я використовую це поряд з початком мого LauncherActivity.onCreate:

if (!isTaskRoot()) {
    Intent intent = getIntent();
    String action = intent.getAction();
    if (intent.hasCategory(Intent.CATEGORY_LAUNCHER) && action != null && action.equals(Intent.ACTION_MAIN)) {
        finish();
        return;
    }
}

126
2017-10-19 23:47



Чому Android знову став другим вибором мобільної ОС? ховає голову в руки - Nick Bauer


onSaveInstanceStateвикликається, коли система потребує пам'яті і вбиває додаток. Це не викликається, коли користувач просто закриває програму. Отже, я думаю, що також потрібно зберегти стан програми onPause Вона повинна зберігатись до деякого стійкого зберігання, як Preferences або Sqlite


70
2018-05-07 00:21



На жаль, це не зовсім правильно. onSaveInstanceState отримує виклик, перш ніж активність потребує повторної роботи. тобто кожного разу, коли користувач обертає пристрій. Він призначений для зберігання тимчасових режимів перегляду. Коли андроїд примушує програму закривати, наSaveInstanceState насправді НЕ викликана (саме тому це небезпечно для зберігання важливих даних програми). onPause, однак гарантовано буде викликаний до того, як дія буде вбито, тому його слід використовувати для зберігання постійної інформації в налаштуваннях або Squlite. Правильна відповідь, неправильні причини. - moveaway00
@ moveaway00 - частково невірно. Якщо система вбиває додаток, щоб відновити ресурси, це робить зателефонуйте на SaveInstanceState. Від developer.android.com/training/basics/activity-lifecycle/... - "Система також може знищити вашу активність ... діяльність переднього плану вимагає більше ресурсів, тому система повинна закрити фонові процеси для відновлення пам'яті ... якщо система знищує діяльність через системні обмеження ... система запам'ятовує, що вона існувала ... Збережені дані ... - це сукупність пар ключ-значення, що зберігається в об'єкті Bundle. ". - ToolmakerSteve


Обидва методи є корисними та дійсними, і обидва варіанти найкраще підходять для різних сценаріїв:

  1. Користувач закриває додаток та повторно відкриває його пізніше, але програмі потрібно перезавантажити дані з останнього сеансу - для цього потрібен постійний підхід до збереження, наприклад, використання SQLite.
  2. Користувач перемикає додаток, а потім повертається до оригіналу і хоче забрати місце, де він залишився - зберігати та відновлювати дані про зв'язок (такі як дані про стан програми) у onSaveInstanceState() і onRestoreInstanceState() зазвичай адекватний.

Якщо ви зберігаєте дані про стан у наполегливому режимі, його можна перезавантажити в onResume() або onCreate() (або насправді на будь-який виклик життєвого циклу). Це може або не може бути бажаною поведінкою. Якщо ви зберігаєте його в пакеті в a InstanceState, то він є тимчасовим і підходить тільки для зберігання даних для використання в одному сеансі користувача (я використовую термін сесії слабо), але не між "сеансами".

Не те, що один підхід краще, ніж інший, як і все, важливо лише зрозуміти, яка поведінка вам потрібна, і вибрати найбільш підходящий підхід.


59
2018-06-27 16:17



Як ми вибираємо між SQLite та Налаштуваннями при пошуку постійного сховища? - Deco


Збереження держави - це найкраще, наскільки я турбуюсь. Якщо вам потрібно зберегти стійкі дані, просто використовуйте SQLite база даних Android робить це SOOO легко

Щось на зразок цього:

import java.util.Date;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

public class dataHelper {

    private static final String DATABASE_NAME = "autoMate.db";
    private static final int DATABASE_VERSION = 1;

    private Context context;
    private SQLiteDatabase db;
    private OpenHelper oh ;

    public dataHelper(Context context) {
        this.context = context;
        this.oh = new OpenHelper(this.context);
        this.db = oh.getWritableDatabase();
    }

    public void close()
    {
        db.close();
        oh.close();
        db = null;
        oh = null;
        SQLiteDatabase.releaseMemory();
    }


    public void setCode(String codeName, Object codeValue, String codeDataType)
    {
        Cursor codeRow = db.rawQuery("SELECT * FROM code WHERE codeName = '"+  codeName + "'", null);
        String cv = "" ;

        if (codeDataType.toLowerCase().trim().equals("long") == true)
        {
            cv = String.valueOf(codeValue);
        }
        else if (codeDataType.toLowerCase().trim().equals("int") == true)
        {
            cv = String.valueOf(codeValue);
        }
        else if (codeDataType.toLowerCase().trim().equals("date") == true)
        {
            cv = String.valueOf(((Date)codeValue).getTime());
        }
        else if (codeDataType.toLowerCase().trim().equals("boolean") == true)
        {
            String.valueOf(codeValue);
        }
        else
        {
            cv = String.valueOf(codeValue);
        }

        if(codeRow.getCount() > 0) //exists-- update
        {
            db.execSQL("update code set codeValue = '" + cv +
                "' where codeName = '" + codeName + "'");
        }
        else // does not exist, insert
        {
            db.execSQL("INSERT INTO code (codeName, codeValue, codeDataType) VALUES(" +
                    "'" + codeName + "'," +
                    "'" + cv + "'," +
                    "'" + codeDataType + "')" );
        }
    }

    public Object getCode(String codeName, Object defaultValue)
    {
        //Check to see if it already exists
        String codeValue = "";
        String codeDataType = "";
        boolean found = false;
        Cursor codeRow  = db.rawQuery("SELECT * FROM code WHERE codeName = '"+  codeName + "'", null);
        if (codeRow.moveToFirst())
        {
            codeValue = codeRow.getString(codeRow.getColumnIndex("codeValue"));
            codeDataType = codeRow.getString(codeRow.getColumnIndex("codeDataType"));
            found = true;
        }

        if (found == false)
        {
            return defaultValue;
        }
        else if (codeDataType.toLowerCase().trim().equals("long") == true)
        {
            if (codeValue.equals("") == true)
            {
                return (long)0;
            }
            return Long.parseLong(codeValue);
        }
        else if (codeDataType.toLowerCase().trim().equals("int") == true)
        {
            if (codeValue.equals("") == true)
            {
                return (int)0;
            }
            return Integer.parseInt(codeValue);
        }
        else if (codeDataType.toLowerCase().trim().equals("date") == true)
        {
            if (codeValue.equals("") == true)
            {
                return null;
            }
            return new Date(Long.parseLong(codeValue));
        }
        else if (codeDataType.toLowerCase().trim().equals("boolean") == true)
        {
            if (codeValue.equals("") == true)
            {
                return false;
            }
            return Boolean.parseBoolean(codeValue);
        }
        else
        {
            return (String)codeValue;
        }
    }


    private static class OpenHelper extends SQLiteOpenHelper {

        OpenHelper(Context context) {
            super(context, DATABASE_NAME, null, DATABASE_VERSION);
        }

        @Override
        public void onCreate(SQLiteDatabase db) {
            db.execSQL("CREATE TABLE IF  NOT EXISTS code" +
            "(id INTEGER PRIMARY KEY, codeName TEXT, codeValue TEXT, codeDataType TEXT)");
        }

        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        }
    }
}

Простий дзвінок після цього

dataHelper dh = new dataHelper(getBaseContext());
String status = (String) dh.getCode("appState", "safetyDisabled");
Date serviceStart = (Date) dh.getCode("serviceStartTime", null);
dh.close();
dh = null;

50
2018-06-23 17:07



Оскільки це займає надто багато часу для завантаження бази даних SQLite, вважаючи, що це на критичному шляху показу користувачеві інтерфейсу додатка. Я насправді не приурочив це, тому я радий виправити, але напевно завантаження та відкриття файлу бази даних не буде швидким? - Tom
Велике спасибі за надання рішення новачка може вирізати і вставити в додаток і використовувати його відразу! @Tom У міру збільшення швидкості потрібно близько семи секунд зберігати 1000 пар, але ви можете зробити це в AsyncTask. Однак вам потрібно додати нарешті {cursor.close ()} або це призведе до аварії з витоку пам'яті під час виконання цього завдання. - Noumenon
Я натрапив на це, і поки це здається акуратним, я невпевнено намагаюся використати це на Google Glass, яке я працюю над останнім часом. - Stephen Tetreault


Я думаю, що знайшов відповідь. Дозвольте мені сказати, що я зробив простими словами:

Припустимо, у мене є дві активності, activity1 і activity2, і я переміщуюсь від activity1 до activity2 (я зробив деякі роботи в activity2) і знову до активності 1, натиснувши на кнопку activity1. Тепер на цьому етапі я хотів повернутися до активності2, і я хочу побачити мою активність2 в тому ж стані, коли я залишив активність2.

Для вищевказаного сценарію те, що я зробив, полягає в тому, що в маніфесті я зробив такі зміни, як це:

<activity android:name=".activity2"
          android:alwaysRetainTaskState="true"      
          android:launchMode="singleInstance">
</activity>

І в активності1 на кнопці миші подію я зробив так:

Intent intent = new Intent();
intent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
intent.setClassName(this,"com.mainscreen.activity2");
startActivity(intent);

І в активності2 на кнопки миші події я зробив так:

Intent intent=new Intent();
intent.setClassName(this,"com.mainscreen.activity1");
startActivity(intent);

Тепер що станеться, що будь-які зміни, які ми зробили в діяльності2, не будуть втрачені, і ми можемо переглянути активність2 в тому ж стані, як і ми покинули раніше.

Я вважаю, що це відповідь, і це добре працює для мене. Виправте мене, якщо я помиляюсь.


50
2018-02-05 11:35



@bagusflyer піклуватися бути більш конкретними ??? Ваш коментар не є корисним, і ніхто не може вам допомогти на основі цього. - Stephen Tetreault
Це відповідь на іншу ситуацію: дві дії в одному додатку. ОП приблизно залишаючи додаток (наприклад, кнопка "Домашня сторінка" або інший спосіб перейти на іншу програму). - ToolmakerSteve