Как передать данные между действиями в приложении 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).
это помогает мне видеть вещи в контексте. Вот два примера.
Передача Данных Вперед
Основным Видом Деятельности
- поместите данные, которые вы хотите отправить в намерение с парой ключ-значение. См.ответ для соглашений об именах для ключа.
- начните второе действие с
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-->
Основным Видом Деятельности
- начните второе действие с
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
...
-
ведение журнала. Идентификатор сеанса хранилища времени в
SharedPreferences
SharedPreferences preferences = getSharedPreferences("session",getApplicationContext().MODE_PRIVATE); Editor editor = preferences.edit(); editor.putString("sessionId", sessionId); editor.commit();
-
в файле 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", "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);
я недавно вышел 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, увеличивает размер вашего приложения