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

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

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

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

30 ответов


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

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

доступ, что намерение на следующей деятельности

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

на docs для целей имеет больше информации (посмотрите раздел под названием "дополнительно").


В вашей текущей деятельности, создать новый 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
}

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


передает намерение дополнительно это хороший подход, как отметил Эрих.

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

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

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


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

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");
}

вы просто должны отправить дополнительные услуги при вызове вашего намерения.

такой:

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);

Обновлено обратите внимание, что я упомянул использование SharedPreference. Она имеет простой API и доступен в деятельности приложения. Но это неуклюжее решение и представляет собой угрозу безопасности, если вы передаете конфиденциальные данные. Лучше всего использовать намерения. Он имеет обширный список перегруженных методов, которые можно использовать для лучшей передачи различных типов данных между мероприятиями. Взгляните на намерениях.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, ...));
...

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


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

создайте простой класс "helper" (фабрика для ваших намерений), например:

import android.content.Intent;

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

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

IntentHelper.createYourSpecialIntent(getIntent());

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

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

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

getIntent().getStringExtra("YOUR_FIELD_NAME");

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


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

Передача Данных Вперед

enter image description here

Основным Видом Деятельности

  • поместите данные, которые вы хотите отправить в намерение с парой ключ-значение. См.ответ для соглашений об именах для ключа.
  • начните второе действие с 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);
    }
}

Передача Данных Назад!--21-->

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();
    }
}

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

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

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

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

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


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

public class MyActivity extends Activity {

  public static String SharedString;
  public static SomeObject SharedObject;

//...

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

String str = "My Data"; //Data you want to send
Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.putExtra("name",str); //Here you will add the data into intent to pass bw activites
v.getContext().startActivity(intent);

вы также должны импортировать

import android.content.Intent;

затем в следующей Acitvity (SecondActivity) вы должны извлечь данные из намерения, используя следующий код.

String name = this.getIntent().getStringExtra("name");

можно использовать SharedPreferences...

  1. ведение журнала. Идентификатор сеанса хранилища времени в SharedPreferences

    SharedPreferences preferences = getSharedPreferences("session",getApplicationContext().MODE_PRIVATE);
    Editor editor = preferences.edit();
    editor.putString("sessionId", sessionId);
    editor.commit();
    
  2. в файле signout. Идентификатор сеанса выборки времени в sharedpreferences

    SharedPreferences preferences = getSharedPreferences("session", getApplicationContext().MODE_PRIVATE);
    String sessionId = preferences.getString("sessionId", null);
    

если у вас нет требуемого идентификатора сеанса, удалите sharedpreferences:

SharedPreferences settings = context.getSharedPreferences("session", Context.MODE_PRIVATE);
settings.edit().clear().commit();

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


стандартный подход.

Intent i = new Intent(this, ActivityTwo.class);
AutoCompleteTextView textView = (AutoCompleteTextView) findViewById(R.id.autocomplete);
String getrec=textView.getText().toString();
Bundle bundle = new Bundle();
bundle.putString(“stuff”, getrec);
i.putExtras(bundle);
startActivity(i);

Теперь во втором действии извлеките свои данные из пакета:

получить пакет

Bundle bundle = getIntent().getExtras();

извлечь данные...

String stuff = bundle.getString(“stuff”); 

Активность

 int n= 10;
 Intent in = new Intent(From_Activity.this,To_Activity.class);
 Bundle b1 = new Bundle();
 b1.putInt("integerNumber",n);
 in.putExtras(b1);
 startActivity(in);

Активность

 Bundle b2 = getIntent().getExtras();
 int m = 0;
 if(b2 != null)
  {
     m = b2.getInt("integerNumber");
  }

вы можете отправлять данные между действиями, используя объект intent. Считайте, что у вас есть два вида деятельности, а именно FirstActivity и SecondActivity.

Внутри FirstActivity:

Использование Intent:

i = new Intent(FirstActivity.this,SecondActivity.class);
i.putExtra("key", value);
startActivity(i)

Внутри SecondActivity

Bundle bundle= getIntent().getExtras();

теперь вы можете использовать различные методы класса bundle для получения значений, передаваемых из FirstActivity по ключу.

Е. Г. bundle.getString("key"),bundle.getDouble("key") ,bundle.getInt("key") etc.


если вы хотите передать растровое изображение между активностями / фрагментами


активность

для передачи растрового изображения между Activites

Intent intent = new Intent(this, Activity.class);
intent.putExtra("bitmap", bitmap);

и в классе активности

Bitmap bitmap = getIntent().getParcelableExtra("bitmap");

фрагмент

для передачи растрового изображения между Фрагменты

SecondFragment fragment = new SecondFragment();
Bundle bundle = new Bundle();
bundle.putParcelable("bitmap", bitmap);
fragment.setArguments(bundle);

получить внутри SecondFragment

Bitmap bitmap = getArguments().getParcelable("bitmap");

Передача Больших Растровых Изображений

если вы получаете неудачную транзакцию связывания, это означает, что вы превышаете буфер транзакции связывания, передавая большой элемент из одного действия в другое действие.

поэтому в этом случае вам нужно сжать растровое изображение как массив байта, а затем распакуйте его в другом действии, такой

в FirstActivity

Intent intent = new Intent(this, SecondActivity.class);

ByteArrayOutputStream stream = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.JPG, 100, stream);
byte[] bytes = stream.toByteArray(); 
intent.putExtra("bitmapbytes",bytes);

и во втором действии

byte[] bytes = getIntent().getByteArrayExtra("bitmapbytes");
Bitmap bmp = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);

Intent intent = new Intent(YourCurrentActivity.this, YourActivityName.class);
intent.putExtra("NAme","John");
intent.putExtra("Id",1);
startActivity(intent);

вы можете получить его в другом действии. Два способа:--4-->

int id = getIntent.getIntExtra("id", /* defaltvalue */ 2);

второй способ:

Intent i = getIntent();
String name = i.getStringExtra("name");

дополнительный ответ: Соглашения об именах для ключевой строки

фактический процесс передачи данных уже получил ответ, однако большинство ответов используют жестко закодированные строки для имени ключа в намерении. Это обычно нормально, когда используется только в вашем приложении. Однако документация рекомендует С помощью EXTRA_* константы для стандартных типов данных.

Пример 1: Использование Intent.EXTRA_* ключи!--20-->

первое действие

Intent intent = new Intent(getActivity(), SecondActivity.class);
intent.putExtra(Intent.EXTRA_TEXT, "my text");
startActivity(intent);

второе действие:

Intent intent = getIntent();
String myText = intent.getExtras().getString(Intent.EXTRA_TEXT);

Пример 2: определение собственного static final ключ

если один из Intent.EXTRA_* строки не соответствуют вашим потребностям, вы можете определить свой собственный в начале первого действия.

static final String EXTRA_STUFF = "com.myPackageName.EXTRA_STUFF";

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

первое действие:

Intent intent = new Intent(getActivity(), SecondActivity.class);
intent.putExtra(EXTRA_STUFF, "my text");
startActivity(intent);

второе действие:

Intent intent = getIntent();
String myText = intent.getExtras().getString(FirstActivity.EXTRA_STUFF);

Пример 3: Использование строкового ключа ресурса

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

строки.в XML

 <string name="EXTRA_STUFF">com.myPackageName.MY_NAME</string>

первое действие

Intent intent = new Intent(getActivity(), SecondActivity.class);
intent.putExtra(getString(R.string.EXTRA_STUFF), "my text");
startActivity(intent);

второе действие

Intent intent = getIntent();
String myText = intent.getExtras().getString(getString(R.string.EXTRA_STUFF));

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

для сохранения идентификатора сеанса -

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);

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

предположим, что у меня есть 2 мероприятия, LoginActivity и HomeActivity. Я хочу передать 2 параметра (имя пользователя и пароль) от LoginActivity to HomeActivity.

во-первых, я создаю свой HomeIntent

public class HomeIntent extends Intent {

    private static final String ACTION_LOGIN = "action_login";
    private static final String ACTION_LOGOUT = "action_logout";

    private static final String ARG_USERNAME = "arg_username";
    private static final String ARG_PASSWORD = "arg_password";


    public HomeIntent(Context ctx, boolean isLogIn) {
        this(ctx);
        //set action type
        setAction(isLogIn ? ACTION_LOGIN : ACTION_LOGOUT);
    }

    public HomeIntent(Context ctx) {
        super(ctx, HomeActivity.class);
    }

    //This will be needed for receiving data
    public HomeIntent(Intent intent) {
        super(intent);
    }

    public void setData(String userName, String password) {
        putExtra(ARG_USERNAME, userName);
        putExtra(ARG_PASSWORD, password);
    }

    public String getUsername() {
        return getStringExtra(ARG_USERNAME);
    }

    public String getPassword() {
        return getStringExtra(ARG_PASSWORD);
    }

    //To separate the params is for which action, we should create action
    public boolean isActionLogIn() {
        return getAction().equals(ACTION_LOGIN);
    }

    public boolean isActionLogOut() {
        return getAction().equals(ACTION_LOGOUT);
    }
}

вот как я передаю данные в моем LoginActivity

public class LoginActivity extends AppCompatActivity {
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);

        String username = "phearum";
        String password = "pwd1133";
        final boolean isActionLogin = true;
        //Passing data to HomeActivity
        final HomeIntent homeIntent = new HomeIntent(this, isActionLogin);
        homeIntent.setData(username, password);
        startActivity(homeIntent);

    }
}

последний шаг, вот как я получаю данные в HomeActivity

public class HomeActivity extends AppCompatActivity {

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

        //This is how we receive the data from LoginActivity
        //Make sure you pass getIntent() to the HomeIntent constructor
        final HomeIntent homeIntent = new HomeIntent(getIntent());
        Log.d("HomeActivity", "Is action login?  " + homeIntent.isActionLogIn());
        Log.d("HomeActivity", "username: " + homeIntent.getUsername());
        Log.d("HomeActivity", "password: " + homeIntent.getPassword());
    }
}

готово! Круто :) я просто хочу поделиться своим опытом. Если вы работаете над небольшим проектом, это не должно быть большой проблемой. Но когда вы работаете над большим проектом, это действительно больно, когда вы хотите сделать рефакторинг или исправление ошибок.


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

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

вы можете найти более подробную информацию об этом, с примером из сообщения в блоге передача данных в Activity.


Чарли Коллинз дал мне прекрасную ответ С помощью 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();
        }
    }
}

можно использовать Intent

Intent mIntent = new Intent(FirstActivity.this, SecondActivity.class);
mIntent.putExtra("data", data);
startActivity(mIntent);

другой способ может использовать синглтон шаблон также:

public class DataHolder {

 private static DataHolder dataHolder;
 private List<Model> dataList;

 public void setDataList(List<Model>dataList) {
    this.dataList = dataList;
 }

 public List<Model> getDataList() {
    return dataList;
 }

 public synchronized static DataHolder getInstance() {
    if (dataHolder == null) {
       dataHolder = new DataHolder();
    }
    return dataHolder;
 }
}

от вашего FirstActivity

private List<Model> dataList = new ArrayList<>();
DataHolder.getInstance().setDataList(dataList);

На SecondActivity

private List<Model> dataList = DataHolder.getInstance().getDataList();

/*
 * 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));
    }
}

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

как:

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

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

Info.ID
Info.NAME

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

Info.ID = 5;
Info.NAME = "USER!";

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

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");

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

Intent intent = new Intent(getBaseContext(), YourActivity.class);
intent.putExtra("USER_NAME", "[email protected]");
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);

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

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

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

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

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

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

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

this.extras()

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

надеюсь, что это представляет интерес для некоторых :)


Если вы используете Котлин:

В MainActivity1:

var intent=Intent(this,MainActivity2::class.java)
intent.putExtra("EXTRA_SESSION_ID",sessionId)
startActivity(intent)

В MainActivity2:

if (intent.hasExtra("EXTRA_SESSION_ID")){
    var name:String=intent.extras.getString("sessionId")
}

вы можете передавать данные между действиями в приложении 3 способами 1.Намерение 2.SharedPreferences 3.Применение

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