2017-01-18 7 views
0

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

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

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

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

+0

* Когда Activity2 начинается с Intent, Activity1 убивается. * Только если вы явно уничтожите его. Это так? Если да, то почему? –

+0

@MLAC относительно вопроса: вам не нужно беспокоиться. Первое действие никогда не убивается. Вы можете использовать обычный механизм состояния экземпляра save/restore для хранения необходимой информации («восстановить состояние экземпляра Google», если вы не знаете, что я делаю). –

+0

Проблема, которую я имею сейчас, заключается в том, что когда я использую намерение перейти от Activity1 к Activity2, Activity1 и данные в форме исчезнут. Поэтому, когда я снова запускаю Activity1, активность создается без предыдущих данных. Поэтому я должен сохранить данные перед запуском Activity2. – MLAC

ответ

-5

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

SharedPreferences является действительно хорошим решением для таких применений. Он очень прост и прост в использовании и внедрении.

+0

Он знает, что может использовать sharedpreferences. Почему вы порекомендовали бы это? Почему бы не отправить назад данные в намерениях и использовать результаты деятельности? –

+0

Это будет ненужная трата памяти для создания так много переменных. Потому что он хочет вернуться к Activity1 и снова загрузить данные. Это потребует 2 намерения. для отправки данных из Activity1 в Activity2, а другой из Activity2 в Activity1. Он создаст необходимые потоки и отработает память. 'SharedPreferences' проще и легче на машине. –

+0

И вы думаете, что запись/чтение sharedpreferences, которые хранятся в файле на диске, быстрее, чем добавление поля данных в намерение? –

0

В Вашей первой деятельности использовать 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); 
+0

Это то, что я делаю сейчас: используя Intent Extra (например, .putExtra) для переноса данных. или Должен ли я использовать «Общие настройки» для временного хранения данных в локальном файле? Интересно, будет ли Shared Preferences лучшим способом. Для общих настроек локальное хранилище требуется через ... – MLAC

+0

Использование putExtra позволяет хранить данные только в течение одного цикла, т. Е. При выходе из приложения ваши сохраненные данные будут потеряны. Но в случае общих предпочтений вы даже можете перепечатать данные даже после выхода из приложения и снова открыть приложение. Общие предпочтения используются в месте SQLite, когда требуется небольшое количество данных для хранения. –

+0

В вашем прецеденте я бы предложил использовать общие настройки. –

0

Вы можете создать класс одноплодной и подвергать сеттер (для сбережения) и 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 
} 
0

почему нужно убить активность 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();