Как передать данные между действиями в приложении Android? - PullRequest
1239 голосов
/ 19 января 2010

У меня есть сценарий, в котором после входа на страницу входа будет выход button на каждом activity.

При нажатии sign-out я буду передаватьsession id зарегистрированного пользователя для выхода.Кто-нибудь может подсказать мне, как сделать session id доступным для всех activities?

Любая альтернатива этому делу

Ответы [ 52 ]

1372 голосов
/ 06 сентября 2011

В вашей текущей деятельности создайте новый Intent:

String value="Hello world";
Intent i = new Intent(CurrentActivity.this, NewActivity.class);    
i.putExtra("key",value);
startActivity(i);

Затем в новом действии извлеките эти значения:

Bundle extras = getIntent().getExtras();
if (extras != null) {
    String value = extras.getString("key");
    //The key argument here must match that used in the other activity
}

Используйте эту технику для передачи переменных из одного занятия в другое.

1160 голосов
/ 19 января 2010

Самый простой способ сделать это - передать идентификатор сеанса в действие выхода из Intent, которое вы используете для запуска действия:

Intent intent = new Intent(getBaseContext(), SignoutActivity.class);
intent.putExtra("EXTRA_SESSION_ID", sessionId);
startActivity(intent);

Доступ к этому намерению при следующей активности:

String sessionId = getIntent().getStringExtra("EXTRA_SESSION_ID");

Документы для Intents содержат более подробную информацию (см. Раздел «Дополнительная информация»).

136 голосов
/ 20 января 2010

Прохождение Намерение дополнительно - хороший подход, как отметил Эрих.

Объект Application - это еще один способ, и иногда легче работать с одним и тем же состоянием в нескольких действиях (в отличие от необходимости получать / помещать его везде), или объекты более сложные, чем примитивы и строки.

Вы можете расширить приложение, а затем установить / получить все, что вам нужно, и получить к нему доступ из любого действия (в том же приложении) с помощью getApplication () .

Также имейте в виду, что другие подходы, которые вы можете увидеть, такие как статика, могут быть проблематичными, поскольку они могут привести к утечкам памяти . Приложение также помогает решить эту проблему.

91 голосов
/ 06 февраля 2014

Исходный класс:

Intent myIntent = new Intent(this, NewActivity.class);
myIntent.putExtra("firstName", "Your First Name Here");
myIntent.putExtra("lastName", "Your Last Name Here");
startActivity(myIntent)

Класс назначения (класс NewActivity):

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.view);

    Intent intent = getIntent();

    String fName = intent.getStringExtra("firstName");
    String lName = intent.getStringExtra("lastName");
}
82 голосов
/ 24 мая 2013

Вы просто должны прислать дополнительные услуги, пока говорите о своем намерении.

Как это:

Intent intent = new Intent(getApplicationContext(), SecondActivity.class);
intent.putExtra("Variable name", "Value you want to pass");
startActivity(intent);

Теперь, используя OnCreate метод вашего SecondActivity, вы можете получить такие дополнения.

Если отправленное вами значение было в long:

long value = getIntent().getLongExtra("Variable name which you sent as an extra", defaultValue(you can give it anything));

Если отправленное вами значение было String:

String value = getIntent().getStringExtra("Variable name which you sent as an extra");

Если отправленное вами значение было Boolean:

Boolean value = getIntent().getBooleanExtra("Variable name which you sent as an extra", defaultValue);
44 голосов
/ 17 февраля 2011

Обновлено Обратите внимание, что я упоминал об использовании SharedPreference . Он имеет простой API и доступен во всех приложениях. Но это неуклюжее решение и риск для безопасности, если вы передаете конфиденциальные данные. Лучше всего использовать намерения. Он содержит обширный список перегруженных методов, которые можно использовать для лучшей передачи разных типов данных между действиями. Посмотрите на intent.putExtra . Эта ссылка довольно хорошо описывает использование putExtra.

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

public class MyActivity extends Activity {
    public static final String ARG_PARAM1 = "arg_param1";
...
public static getIntent(Activity from, String param1, Long param2...) {
    Intent intent = new Intent(from, MyActivity.class);
        intent.putExtra(ARG_PARAM1, param1);
        intent.putExtra(ARG_PARAM2, param2);
        return intent;
}

....
// Use it like this.
startActivity(MyActvitiy.getIntent(FromActivity.this, varA, varB, ...));
...

Затем вы можете создать намерение для планируемой деятельности и убедиться, что у вас есть все параметры. Вы можете адаптировать для фрагментов. Простой пример выше, но вы поняли.

41 голосов
/ 31 августа 2017

Это помогает мне видеть вещи в контексте. Вот два примера.

Передача данных вперед

enter image description here

Основная деятельность

  • Поместите данные, которые вы хотите отправить, в Intent с парой ключ-значение. См. этот ответ для соглашений по именованию для ключа.
  • Начните второе занятие с startActivity.

MainActivity.java

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    // "Go to Second Activity" button click
    public void onButtonClick(View view) {

        // get the text to pass
        EditText editText = (EditText) findViewById(R.id.editText);
        String textToPass = editText.getText().toString();

        // start the SecondActivity
        Intent intent = new Intent(this, SecondActivity.class);
        intent.putExtra(Intent.EXTRA_TEXT, textToPass);
        startActivity(intent);
    }
}

Второе занятие

  • Вы используете getIntent(), чтобы получить Intent, который начал второе действие. Затем вы можете извлечь данные с помощью getExtras() и ключа, который вы определили в первом упражнении. Поскольку наши данные являются строкой, мы просто будем использовать getStringExtra здесь.

SecondActivity.java

public class SecondActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);

        // get the text from MainActivity
        Intent intent = getIntent();
        String text = intent.getStringExtra(Intent.EXTRA_TEXT);

        // use the text in a TextView
        TextView textView = (TextView) findViewById(R.id.textView);
        textView.setText(text);
    }
}

Передача данных назад

enter image description here

Основная деятельность

  • Начните второе действие с startActivityForResult, предоставив ему произвольный код результата.
  • Переопределить onActivityResult. Это называется, когда заканчивается второе задание. Вы можете убедиться, что это фактически Второе действие, проверив код результата. (Это полезно, когда вы запускаете несколько разных действий из одного и того же основного действия.)
  • Извлеките данные, полученные из возврата Intent. Данные извлекаются с использованием пары ключ-значение. Я мог бы использовать любую строку для ключа, но я буду использовать предопределенный Intent.EXTRA_TEXT, так как я отправляю текст.

MainActivity.java

public class MainActivity extends AppCompatActivity {

    private static final int SECOND_ACTIVITY_REQUEST_CODE = 0;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    // "Go to Second Activity" button click
    public void onButtonClick(View view) {

        // Start the SecondActivity
        Intent intent = new Intent(this, SecondActivity.class);
        startActivityForResult(intent, SECOND_ACTIVITY_REQUEST_CODE);
    }

    // This method is called when the second activity finishes
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        // check that it is the SecondActivity with an OK result
        if (requestCode == SECOND_ACTIVITY_REQUEST_CODE) {
            if (resultCode == RESULT_OK) {

                // get String data from Intent
                String returnString = data.getStringExtra(Intent.EXTRA_TEXT);

                // set text view with string
                TextView textView = (TextView) findViewById(R.id.textView);
                textView.setText(returnString);
            }
        }
    }
}

Второе занятие

  • Поместите данные, которые вы хотите отправить обратно в предыдущую операцию, в Intent. Данные хранятся в Intent с использованием пары ключ-значение. Я решил использовать Intent.EXTRA_TEXT для моего ключа.
  • Установите результат на RESULT_OK и добавьте намерение, содержащее ваши данные.
  • Позвоните finish(), чтобы закрыть второе занятие.

SecondActivity.java

public class SecondActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);
    }

    // "Send text back" button click
    public void onButtonClick(View view) {

        // get the text from the EditText
        EditText editText = (EditText) findViewById(R.id.editText);
        String stringToPassBack = editText.getText().toString();

        // put the String to pass back into an Intent and close this activity
        Intent intent = new Intent();
        intent.putExtra(Intent.EXTRA_TEXT, stringToPassBack);
        setResult(RESULT_OK, intent);
        finish();
    }
}
37 голосов
/ 19 января 2010

Попробуйте сделать следующее:

Создайте простой «вспомогательный» класс (фабрика для ваших намерений), например:

import android.content.Intent;

public class IntentHelper {
    public static final Intent createYourSpecialIntent(Intent src) {
          return new Intent("YourSpecialIntent").addCategory("YourSpecialCategory").putExtras(src);
    }
}

Это будет фабрика для всех ваших намерений. Каждый раз, когда вам нужен новый Intent, создайте статический метод фабрики в IntentHelper. Чтобы создать новое намерение, вы должны просто сказать это так:

IntentHelper.createYourSpecialIntent(getIntent());

В вашей деятельности. Если вы хотите «сохранить» некоторые данные в «сеансе», просто используйте следующее:

IntentHelper.createYourSpecialIntent(getIntent()).putExtra("YOUR_FIELD_NAME", fieldValueToSave);

И отправь это намерение. В целевой деятельности ваше поле будет доступно как:

getIntent().getStringExtra("YOUR_FIELD_NAME");

Так что теперь мы можем использовать Intent как тот же старый сеанс (как в сервлетах или JSP ).

26 голосов
/ 15 февраля 2016

Вы также можете передавать объекты пользовательских классов, создавая parcelable class.Лучший способ сделать его пригодным для распаковки - написать свой класс, а затем просто вставить его на сайт, например http://www.parcelabler.com/. Нажмите на сборку, и вы получите новый код.Скопируйте все это и замените оригинальное содержание класса.Затем -

Intent intent = new Intent(getBaseContext(), NextActivity.class);
Foo foo = new Foo();
intent.putExtra("foo", foo);
startActivity(intent);

и получите результат в NextActivity, как -

Foo foo = getIntent().getExtras().getParcelable("foo");

Теперь вы можете просто использовать объект foo , как вы бы использовали.

23 голосов
/ 26 октября 2012

Другой способ - использовать открытое статическое поле, в котором вы храните данные, т.е.:100100

public class MyActivity extends Activity {

  public static String SharedString;
  public static SomeObject SharedObject;

//...
...