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

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

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

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

Ответы [ 52 ]

6 голосов
/ 04 мая 2017

Вы можете попробовать Shared Preference, это может быть хорошей альтернативой для обмена данными между действиями

Чтобы сохранить идентификатор сеанса -

SharedPreferences pref = myContexy.getSharedPreferences("Session 
Data",MODE_PRIVATE);
SharedPreferences.Editor edit = pref.edit();
edit.putInt("Session ID", session_id);
edit.commit();

Чтобы получить их -

SharedPreferences pref = myContexy.getSharedPreferences("Session Data", MODE_PRIVATE);
session_id = pref.getInt("Session ID", 0);
6 голосов
/ 27 октября 2012

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

Сначала вы должны прикрепить данные к объекту намерения с помощью класса Bundle. Затем вызовите упражнение, используя методы startActivity() или startActivityForResult().

Более подробную информацию можно найти на примере блога Передача данных в действие .

5 голосов
/ 23 июня 2017

Запустить другое действие с помощью параметров передачи этого действия через Bundle Object

Intent intent = new Intent(getBaseContext(), YourActivity.class);
intent.putExtra("USER_NAME", "xyz@gmail.com");
startActivity(intent);

Получить другое действие (YourActivity)

String s = getIntent().getStringExtra("USER_NAME");

Это нормально для простого типа данных.Но если вы хотите передать сложные данные между действиями, вам нужно сначала сериализовать их.

Здесь у нас есть Модель сотрудника

class Employee{
    private String empId;
    private int age;
    print Double salary;

    getters...
    setters...
}

Вы можете использовать Gson lib, предоставленный Google, для сериализации комплекса.данные как это

String strEmp = new Gson().toJson(emp);
Intent intent = new Intent(getBaseContext(), YourActivity.class);
intent.putExtra("EMP", strEmp);
startActivity(intent);

Bundle bundle = getIntent().getExtras();
String empStr = bundle.getString("EMP");
            Gson gson = new Gson();
            Type type = new TypeToken<Employee>() {
            }.getType();
            Employee selectedEmp = gson.fromJson(empStr, type);
4 голосов
/ 14 ноября 2013

Я использую статические поля в классе и получаю / устанавливаю их:

Как:

public class Info
{
    public static int ID      = 0;
    public static String NAME = "TEST";
}

Для получения значения используйте это в Деятельности:

Info.ID
Info.NAME

Для установки значения:

Info.ID = 5;
Info.NAME = "USER!";
4 голосов
/ 14 декабря 2013

Чарли Коллинз дал мне идеальный ответ , используя Application.class.Я не знал, что мы могли бы подкласс это так легко.Вот упрощенный пример использования пользовательского класса приложения.

AndroidManifest.xml

Дайте атрибут android:name для использования собственного класса приложения.

...
<application android:name="MyApplication"
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >
....

MyApplication.java

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

public class MyApplication extends Application {
    private MainActivity mainActivity;

    @Override
    public void onCreate() {
        super.onCreate();
    }

    public void setMainActivity(MainActivity activity) { this.mainActivity=activity; }
    public MainActivity getMainActivity() { return mainActivity; }
}

MainActivity.java

Установить глобальную ссылку "singleton" для экземпляра приложения.

public class MainActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ((MyApplication)getApplication()).setMainActivity(this);
    }
    ...

}

MyPreferences.java

Простой пример, где я использую основное действие из другого экземпляра действия.

public class MyPreferences extends PreferenceActivity
            implements SharedPreferences.OnSharedPreferenceChangeListener {
    @SuppressWarnings("deprecation")
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        addPreferencesFromResource(R.xml.preferences);
        PreferenceManager.getDefaultSharedPreferences(this)
            .registerOnSharedPreferenceChangeListener(this);
    }

    @Override
    public void onSharedPreferenceChanged(SharedPreferences prefs, String key) {
        if (!key.equals("autostart")) {
            ((MyApplication)getApplication()).getMainActivity().refreshUI();
        }
    }
}
4 голосов
/ 13 сентября 2014
/*
 * If you are from transferring data from one class that doesn't
 * extend Activity, then you need to do something like this.
 */ 

public class abc {
    Context context;

    public abc(Context context) {
        this.context = context;
    }

    public void something() {
        context.startactivity(new Intent(context, anyone.class).putextra("key", value));
    }
}
3 голосов
/ 10 октября 2018

Котлин

Пропуск с первого занятия

val intent = Intent(this, SecondActivity::class.java)
intent.putExtra("key", "value")
startActivity(intent)

Получить во второй деятельности

val value = getIntent().getStringExtra("key")

Предложение

Всегда помещайте ключи в постоянный файл для более управляемого пути.

companion object {
    val KEY = "key"
}
3 голосов
/ 01 сентября 2016

Попробуйте это:

CurrentActivity.java

Intent intent = new Intent(currentActivity.this, TargetActivity.class);
intent.putExtra("booktype", "favourate");
startActivity(intent);

TargetActivity.java

Bundle b = getIntent().getExtras();
String typesofbook = b.getString("booktype");
3 голосов
/ 26 февраля 2013

Я недавно выпустил Vapor API , фреймворк Android со вкусом jQuery, который упрощает все виды задач, подобных этой.Как уже упоминалось, SharedPreferences - это единственный способ сделать это.

VaporSharedPreferences реализован как Singleton, так что это один из вариантов, а в Vapor API он сильно перегружен .put(...) метод, так что вам не нужно явно беспокоиться о типе данных, который вы делаете - при условии, что он поддерживается.Это также свободно, так что вы можете объединять вызовы:

$.prefs(...).put("val1", 123).put("val2", "Hello World!").put("something", 3.34);

Также он может автоматически сохранять изменения и унифицировать процесс чтения и записи, поэтому вам не нужно явно извлекать редактор, напримервы делаете в стандартном Android.

В качестве альтернативы вы можете использовать Intent.В Vapor API вы также можете использовать цепной перегруженный метод .put(...) для VaporIntent:

$.Intent().put("data", "myData").put("more", 568)...

и передать его как дополнительный, как упомянуто в других ответах.Вы можете получить дополнительные данные из вашего Activity, и, кроме того, если вы используете VaporActivity, это делается для вас автоматически, поэтому вы можете использовать:

this.extras()

Чтобы получить их вдругой конец в Activity, на который вы переключаетесь.

Надеюсь, что это будет интересно некоторым:)

3 голосов
/ 23 июля 2018

Первая активность:

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

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

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