Каков правильный способ временного хранения и восстановления данных между действиями в Android?

Я создаю приложение для Android. Одна из функций — собирать некоторые данные (название товара, идентификатор товара и строку штрих-кода) от пользователя.

Activity1 — это форма. Пользователь вводит имя элемента и номер элемента вручную. Для строки штрих-кода пользователь нажимает кнопку «сканировать», после чего запускается Activity2 (сканер), чтобы отсканировать и прочитать штрих-код. После считывания штрих-кода Activity1 (форма) запускается снова, и все данные должны появиться в форме.

Когда Activity2 запускается Intent, Activity1 уничтожается. Итак, я должен получить имя элемента и номер элемента и временно сохранить их, прежде чем смотреть на намерение. Затем, когда Activity1 снова запустится, эти данные снова будут отображаться в форме.

Теперь я думаю использовать Intent Extra, чтобы сохранить имя и номер элемента и передать их в Activity2 и обратно в Activity1. Учитывая, что Activity2 не нужны эти данные, мне интересно, правильно ли это сделать в этом сценарии. Есть ли лучший способ? Должен ли я вместо этого использовать общие настройки?


person MLAC    schedule 18.01.2017    source источник
comment
Когда Activity2 запускается по намерению, Activity1 уничтожается. только если вы явно уничтожаете его. Так ли это? Если да, то почему?   -  person Tim    schedule 18.01.2017
comment
@MLAC относительно вопроса: вам не о чем беспокоиться. Первая активность никогда не уничтожается. Вы можете использовать обычный механизм сохранения/восстановления состояния экземпляра, чтобы сохранить необходимую информацию (состояние экземпляра восстановления Google, если вы не знаете, о чем я).   -  person Xaver Kapeller    schedule 18.01.2017
comment
Проблема, с которой я столкнулся сейчас, заключается в том, что когда я использую намерение перейти от Activity1 к Activity2, Activity1 и данные в форме исчезают. Итак, когда я снова запускаю Activity1, активность создается без предыдущих данных. Поэтому я должен сохранить данные перед запуском Activity2.   -  person MLAC    schedule 18.01.2017
comment
Как ты возвращаешься в Activity1 из Activity2? Это не должно начаться снова, оно должно просто возобновиться. В этом случае все данные в форме должны быть сохранены. Пожалуйста, добавьте свой манифест в свой пост.   -  person David Wasser    schedule 19.01.2017
comment
Кроме того, если Activity2 не нужны данные, которые вы собираете в Activity1, нет причин передавать эти данные Activity2.   -  person David Wasser    schedule 19.01.2017


Ответы (4)


В вашем первом действии используйте аргумент put extra для намерения следующим образом:

// Assuming Activity2.class is second activity
Intent intent = new Intent(this, Activity2.class); 
intent.putExtra("variable_name", var); // here you are passing var to second activity
startActivity(intent);

Затем во втором действии извлеките аргумент следующим образом:

String var2 = getIntent().getStringExtra(variable_name);
person Arbaz Alam    schedule 18.01.2017
comment
Это то, что я делаю сейчас: использую Intent Extra (т.е. .putExtra) для переноса данных. или Должен ли я использовать общие настройки для временного хранения данных в локальном файле? Интересно, будут ли общие настройки лучшим способом. Для общих настроек требуется локальное хранилище через... - person MLAC; 18.01.2017
comment
Используя putExtra, вы можете хранить данные только для одного цикла, т.е. когда вы выходите из приложения, ваши сохраненные данные будут потеряны. Но в случае общих настроек вы даже можете получить данные даже после того, как вы выйдете из приложения и снова откроете приложение. Общие настройки используются вместо SQLite, когда для хранения требуется небольшой объем данных. - person Arbaz Alam; 18.01.2017
comment
В вашем случае использования я бы предложил использовать общие настройки. - person Arbaz Alam; 18.01.2017
comment
В вашем случае использования, если требуется сохранить данные даже после выхода из приложения, хорошим вариантом будут общие настройки. Если не требуется сохранять данные после выхода из приложения, тогда putExtra лучше, потому что он быстрее и оптимизирован. - person Arbaz Alam; 18.01.2017

Вы можете создать одноэлементный класс и предоставить методы setter (для сохранения) и getter (для извлечения) для объектов модели (здесь две частные строковые переменные). Этот класс будет работать с вашим приложением:

public class MyClass{
private static MyClass instance=null;
public static getInstance(){
if(instance==null){
instance=new MyClass();
}
return instance;
}


private String itemName;
private String itemNumber;
//setter and getter methods here  
}
person AAP    schedule 19.01.2017

зачем нужно убивать Activity 1, попробуйте позвонить

на Мероприятие 1

объявить private int SCAN_BARCODE_REQUEST = 101;

а потом

 //finish();  dont use this to destroy activity 1
 startActivityForResult(new intent(this,Activity2.class), SCAN_BARCODE_REQUEST);

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {

    if (requestCode == SCAN_BARCODE_REQUEST) {

        if (resultCode == RESULT_OK) {
            String barcode = data.getStringExtra("BARCODE");

             //handle your barcode string here
        }
    }
}

в своем действии 2 измените начальное действие 1 на

Intent intent = new Intent();
intent.putExtra("BARCODE", barcodeString);
setResult(RESULT_OK, intent);
finish(); 
person Aldi Renaldi Gunawan    schedule 19.01.2017

Вы можете использовать SharedPreferences. Вы можете узнать, как их использовать, здесь: https://www.tutorialspoint.com/android/android_shared_preferences.htm https://developer.android.com/training/basics/data-storage/shared-preferences.html

SharedPreferences — действительно хорошее решение для таких приложений. Он очень прост и удобен в использовании и реализации.

person Sanath Kashyap    schedule 18.01.2017
comment
Он знает, что может использовать общие настройки. Почему вы рекомендуете это? Почему бы не отправить обратно данные в намерении и не использовать результаты активности? - person Tim; 18.01.2017
comment
Это будет ненужная трата памяти на создание такого количества переменных, потому что он хочет вернуться к Activity1 и снова загрузить данные. Для этого потребуется 2 намерения. для отправки данных из Activity1 в Activity2 и еще один из Activity2 в Activity1. Это создаст необходимые потоки и тратит память. SharedPreferences проще и легче на автомате. - person Sanath Kashyap; 18.01.2017
comment
И вы думаете, что запись/чтение общих настроек, которые хранятся в файле на диске, быстрее, чем добавление поля данных в намерение? - person Tim; 18.01.2017
comment
Я пытаюсь выяснить, какой из них лучше: 1. использовать Intent Extra для переноса данных или 2. использовать общие настройки для хранения данных в локальном файле... Сейчас я использую 1, и мне интересно если бы 2 было бы лучше. Для 1 локальное хранилище не требуется... - person MLAC; 18.01.2017
comment
Общие настройки @MLAC определенно не лучшее решение для этого случая. - person Tim; 18.01.2017
comment
@MLAC использует startActivityForResult() с пакетом - person JAAD; 18.01.2017
comment
@SanathKashyap Что заставляет вас думать, что передача данных в качестве дополнительных в Intent между двумя действиями создает потоки и тратит память? Это просто чепуха. - person David Wasser; 19.01.2017