Як мені передавати дані між "Діяннями" в додатку Android?


1348

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

Після натискання sign-outя передаю session idкористувача, який увійшов, щоб вийти. Хтось може мене направляти, як тримати session idдоступними для всіх activities?

Будь-яка альтернатива цьому випадку


14
Я використав спільнуподобання, корисно також зберігати дані для входу у функцію пароля
пам’яті

Це працює для мене. stackoverflow.com/a/7325248/2125322 Подяки Darshan Computing
matasoy

stackoverflow.com/a/37774966/6456129 може бути корисним
Yessy

у таких випадках спробуйте створити клас commomUtils з методом sharedpreferenceces ... це дозволить зберегти код чистими та пов’язаними з ними даними. І ви легко зможете очистити певний набір даних лише одним методом очищення конкретних файлів prefrencesFile, не очищаючи жодних даних програми за замовчуванням ...
Muahmmad Tayyib

Відповіді:


1265

Найпростіший спосіб зробити це - передати ідентифікатор сеансу активності виходу в програму, Intentяку ви використовуєте для запуску діяльності:

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

Доступ до цього наміру щодо наступної діяльності:

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

У документах для комерційних мають більше інформації (загляньте в розділі під назвою «Extras»).


ОК, якщо я передаю ідентифікатор сеансу для активації підписки під час успішного входу, і чи буде вона працювати на будь-якій сторінці активності для виходу або вручну, мені доведеться призначити це значення для кожної діяльності ??? використовуючи вищевказану процедуру ??
УМАР

5
Так, вам потрібно буде зробити ідентифікатор сеансу доступним для кожної діяльності, де ви хочете дозволити користувачу виходити з системи. Крім того, ви можете зберігати його в об’єкті Application, але тоді вам доведеться керувати станом сеансу (перевірте, чи він дійсний перед використанням тощо).
Еріх Дуглас

1
Зауважте, що документація вказує на наступне: Додайте розширені дані до наміру. Назва має містити префікс пакета, наприклад, додаток com.android.contacts використовує такі назви, як "com.android.contacts.ShowAll".
Сергей Федоров

1
І читати дані з іншого використання діяльностіLong session_ids=getIntent().getExtras().getLong("EXTRA_SESSION_IDS");
Farid

1
Як ми можемо передавати дані, використовуючи setDataі в чому різниця між цими двома підходами? Який з них кращий?
Хосейн Акаджані

1402

У вашій поточній активності створіть нове 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
}

Використовуйте цю техніку для передачі змінних від однієї діяльності до іншої.


58
Просто інформація для тих, хто такий сліпий, як я: якщо ви введете ціле число у вашій поточній діяльності, ви повинні отримати його в новому через extras.getInt("new_variable_name"). Якщо ви спробуєте отримати це через getString()android, побачите, що дано int і повертає null!
біш

4
що, якщо діяльність вже запущена, чи потрібно це робити startActivity(i);? Я можу сказати, чи можу я зробити активність A викликом B , і це повертає дані до активності A ? я розгублений?
Франсіско Корралес Моралес


Я віддаю перевагу рядковій змінній. Ви завжди можете перетворити рядок у ціле число або плавати пізніше.
користувач914425

140

Як передав Еріх, передача наміру додатків - це хороший підхід.

Об'єкт Application є, однак, іншим способом, і іноді легше працювати з одним і тим же станом у кількох видах діяльності (на відміну від необхідності їх отримання / розміщення скрізь) або об'єктів, складніших за примітиви та рядки.

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

Також майте на увазі, що інші підходи, які ви можете бачити, як статика, можуть бути проблематичними, оскільки вони можуть призвести до витоку пам'яті . Додаток також допомагає вирішити це.


8
+1 для проблеми статики. ймовірно, очищення може бути вирішено шляхом комбінування синглтона з методом onCreate / onTerminate Клас програми.
Сид

10
Гей, я знаю, що ця тема була досить довгою, але надане посилання зараз в глухий кут. Чи можна десь знайти приклад?
JuiCe

Як цього досягти за допомогою програми? @CharlieCollins
Banee Ishaque K

Ось оновлений приклад цього тут, із дуже старої книги :) github.com/charlieCollins/android-in-practice/blob/master/ch07/…
Чарлі Коллінз

@JuiCe Повідомлення в блозі розробників Android про витоки пам’яті більше недійсне.
Едрік

94

Клас джерела:

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

3
Чи може ціль колись бути нульовою? Чи слід перевірити, що це недійсне значення?
Мікро


85

Вам просто потрібно надсилати додаткові під час виклику свого наміру.

Подобається це:

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

3
Зауважте, що документація вказує на наступне: Додайте розширені дані до наміру. Назва має містити префікс пакета, наприклад, додаток com.android.contacts використовує такі назви, як "com.android.contacts.ShowAll".
Сергей Федоров

Це дублікат найвідповідальнішої відповіді, яка була за 2 роки до цієї відповіді, та відповіді Сахіла Махаджана Мідж, який на 1 рік старший. Єдина відмінність: приклади для booleanта тих, хто longбажає коментувати IMO, а не відповіді.
Мурмель

48

Це допомагає мені бачити речі в контексті. Ось два приклади.

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

введіть тут опис зображення

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

  • Помістіть дані, які ви хочете надіслати, у намірі з парою ключ-значення. Дивіться цю відповідь щодо іменування конвенцій для ключа.
  • Почніть другу діяльність з 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);
    }
}

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

введіть тут опис зображення

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

  • Почніть Другу активність startActivityForResult, надавши їй довільний код результату.
  • Override 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();
    }
}

3
Нічого, дякую! Це було саме те, що я шукав. Цілком зрозуміло, що при використанні камери чи інших зовнішніх пристроїв я очікую результатів, але не думав використовувати їх всередині. Ти перший, хто це так відкрито виклав.
користувач3195231

45

Оновлено Зауважте, що я згадав про використання 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, ...));
...

Тоді ви можете створити наміри для передбачуваної діяльності та переконатися у наявності всіх параметрів. Ви можете адаптувати фрагменти до. Простий приклад вище, але ви отримуєте ідею.


2
Мені найбільше подобається ваша відповідь ... Передача її за допомогою наміру означає, що майже скрізь, коли я розпочинаю діяльність, вам доведеться пам’ятати, щоб включити sessionId. Помістивши його у SharedPreferences, ви можете отримати його будь-коли від будь-якої діяльності. : 0)
bytebender

@bytebender Я знаю, що це дещо пізно для відповіді, я вдячний, що вам подобається моя оригінальна відповідь за її простоту, але я був би обережний, щоб зберігати ідентифікатор сесії в спільних налаштуваннях. Якщо потрібно зберегти його на жорсткому сховищі, тоді використовуйте шифрування. Якщо ви можете використовувати рамки аутентифікації, що використовують JWT, вона буде включати refreshTokens, які є більш безпечними для довготривалого зберігання, а потім збережіть поточний маркер сеансу як публічну властивість спеціального об’єкта програми, щоб легко отримати доступ до маркерів аутентифікації та зменшити накладні витрати на активність підписи про наміри.
сердитийТіг

38

Спробуйте зробити наступне:

Створіть простий клас "помічник" (фабрика для ваших намірів), наприклад:

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


28

Ви також можете передавати об'єкти користувацького класу, зробивши клас парцеляції . Найкращий спосіб зробити його розбірним - це написати свій клас, а потім просто вставити його на сайт на зразок http://www.parcelabler.com/ . Натисніть на збірку, і ви отримаєте новий код. Скопіюйте все це та замініть вихідний вміст класу. Тоді-

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

і отримати результат у NextActivity like-

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

Тепер ви можете просто використовувати об'єкт foo, як ви б використовували.


23

Інший спосіб полягає у використанні загальнодоступного статичного поля, в якому ви зберігаєте дані, тобто:

public class MyActivity extends Activity {

  public static String SharedString;
  public static SomeObject SharedObject;

//...

5
Мені дуже цікаво, чому ваша пропозиція не отримала голосів, це простіше і практичніше.
Поризм

7
гм ... це не порушує принципів ОО?
Крістіан Вільма

2
@ChristianVielma добре, це більше схоже на сіру зону ... ти можеш це зробити багатьма способами, мені здається, чисте "геть", тож ... саме ти (розробник) приймати рішення, якщо це працює добре для вас чи ні, мені подобається цей шлях, тому що простіше прослідкувати, але він може дуже швидко забруднитися ...
ComputerSaysNo

2
чому ти кажеш, що це забрудниться? Чи не iOS робить це для передачі даних між контролерами перегляду, встановлюючи "властивості", подібні до цього? Це набагато простіше, ніж використання намірів
Террі Бу

2
Так, ви передаєте дані між контролерами перегляду, але не зі статичними властивостями. Проблема полягає в тому, що це не властивість потрібного екземпляра діяльності. Те, як Android запускає діяльність через startActivity (), не дає миттєво створити об'єкт та дозволить розробнику встановити змінну екземпляра. Це досить дратує ...
Шон

20

Найзручніший спосіб передачі даних між видами діяльності - передача намірів. У першій діяльності, з якої потрібно надіслати дані, слід додати код,

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

2
Це дублікат найвищої голосової відповіді, яка була там ще на 1 рік.
Мурмель

19

Ви можете використовувати SharedPreferences...

  1. Ведення журналів. Ідентифікатор сеансу зберігання в часіSharedPreferences

    SharedPreferences preferences = getSharedPreferences("session",getApplicationContext().MODE_PRIVATE);
    Editor editor = preferences.edit();
    editor.putString("sessionId", sessionId);
    editor.commit();
  2. Вийти з аккаунта. Час отримання сеансу ідентифікатора в спільних налаштуваннях

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

Якщо у вас немає необхідного ідентифікатора сеансу, видаліть спільні налаштування:

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

Це дуже корисно, оскільки ви один раз зберігаєте значення, а потім отримуєте будь-яку діяльність.


17

Стандартний підхід.

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

1
Дублікат, як уже було запропоновано PRABEESH RK у 2012 році. І може бути зведений до i.putExtras()/, getIntent().getString()що пропонується ще 6 відповідей ...
Murmel

17

З діяльності

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

1
Дублікат: БазовийBundle підхід вже був запропонований PRABEESH RK у 2012 році та Ajay Venugopal , Kishna . І може бути зведений до i.putExtras()/, getIntent().getString()що пропонується ще 8 відповідей ...
Murmel

11

Ви можете пересилати дані між видами діяльності, використовуючи об'єкт наміру. Розглянемо у вас є два види діяльності , а саме FirstActivityта SecondActivity.

Всередині FirstActivity:

Використання намірів:

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

Всередині SecondActivity

Bundle bundle= getIntent().getExtras();

Тепер ви можете використовувати різні методи класу розшарування, щоб отримати значення, передані від FirstActivity по ключу.

Наприклад bundle.getString("key"), bundle.getDouble("key"), і bundle.getInt("key")т.д.


1
Дублікат: BundleБазований підхід вже був запропонований PRABEESH RK у 2012 році та Ajay Venugopal . І може бути зведений до i.putExtras()/, getIntent().getString()що пропонується ще 7 відповідей ...
Murmel

11

Якщо ви хочете перенести растрову карту між активами / фрагментами


Діяльність

Для передачі растрової карти між 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);

І у SecondActivity

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

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

Ви можете отримати його в іншій діяльності. Два способи:

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

Другий спосіб:

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


8

Ось моя найкраща практика, і вона дуже допомагає, коли проект величезний і складний.

Припустимо, що у мене є 2 види діяльності, LoginActivityі HomeActivity. Я хочу передати 2 параметра (ім'я користувача і пароль) від LoginActivityдо 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());
    }
}

Готово! Класно :) Я просто хочу поділитися своїм досвідом. Якщо ви працюєте над малим проектом, це не повинно бути великою проблемою. Але коли ви працюєте над великим проектом, це дуже болить, коли ви хочете зробити рефакторинг або виправити помилки.


7

Додатковий відповідь: Названня конвенцій для ключового рядка

Фактичний процес передачі даних вже відповів, проте більшість відповідей використовують жорстко закодовані рядки для ключового імені у Намір. Зазвичай це нормально, коли використовується лише у вашому додатку. Однак документація рекомендує використовувати EXTRA_*константи для стандартизованих типів даних.

Приклад 1: Використання Intent.EXTRA_*клавіш

Перша діяльність

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: Використання ресурсного ключа String

Хоча це не зазначено в документації, ця відповідь рекомендує використовувати ресурс String, щоб уникнути залежностей між видами діяльності.

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

7

Можна використовувати 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();


6

Передача даних між видами діяльності відбувається головним чином за допомогою об'єкта наміру.

Спочатку ви повинні приєднати дані до об’єкту наміру із використанням Bundleкласу. Потім зателефонуйте на активність за допомогою будь-якого startActivity()або startActivityForResult()методу.

Ви можете знайти додаткову інформацію про це на прикладі публікації блогу " Передача даних до активності" .


Це більш-менш те саме , що безпосередньо використовувати надані наміром методи ( Intent#putExtra()). Але додає інше Bundleі ускладнює справи.
Мурмель

6

Ви можете спробувати спільне налаштування, це може бути хорошою альтернативою для обміну даними між видами діяльності

Щоб зберегти ідентифікатор сесії -

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

Дублікат: Цей підхід вже був підкріплений Раві Парсанією у 2014 році
Мурмель

5

Почніть іншу активність з цієї діяльності, передайте параметри через Об'єкт зв’язку

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

5

Котлін

Перехід від першої активності

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

Займіться другою діяльністю

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

Пропозиція

Завжди кладіть ключі в постійний файл для більш керованого способу.

companion object {
    val KEY = "key"
}

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

4

Чарлі Коллінз дав мені ідеальну відповідь, використовуючи 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

Встановіть глобальну посилання "одиночка" на екземпляр програми.

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

Нещодавно я випустив Vapor API , систему Android з ароматом jQuery, яка робить всілякі завдання подібними. Як було сказано, SharedPreferencesодин із способів ви могли це зробити.

VaporSharedPreferencesреалізується як Singleton, так що це один варіант, а в Vapor API він має сильно перевантажений .put(...)метод, тому вам не доведеться чітко турбуватися про тип даних, який ви здійснюєте - за умови, що він підтримується. Він також добре володіє, тому ви можете здійснювати ланцюжки дзвінків:

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

Він також необов'язково автоматично зберігає зміни та уніфікує процес читання та запису під кришкою, тому вам не потрібно явно отримувати редактор, як у стандартних Android.

Можна також скористатися Intent. У API Vapor ви також можете скористатись можливим .put(...)методом перевантаження на VaporIntent:

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

І передайте це як додаткове, про що йдеться в інших відповідях. Ви можете отримати додаткові дані зі свого Activity, і, якщо ви користуєтеся VaporActivityцим, робиться для вас автоматично, щоб ви могли використовувати:

this.extras()

Щоб отримати їх на іншому кінці, у якому Activityви переходите.

Сподіваюся, що когось цікавить :)


@BaneeIshaqueK да, вибачте, не підтримували це деякий час. Оновили посилання, щоб вказати безпосередньо на Github для проекту, якщо це допоможе. пс. Не впевнений, що я думав за цю ліцензію ... вибачення
Дарій

4

Перша активність:

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

4

Ви можете передавати дані між видами діяльності в додатку трьома способами

  1. Намір
  2. SharedPreferences
  3. Застосування

передача даних у намірі має деяку межу. Для великої кількості даних ви можете використовувати обмін даними на рівні програми, а зберігання їх у SharedPreference збільшує розмір вашої програми


3

Використовуйте глобальний клас:

public class GlobalClass extends Application
{
    private float vitamin_a;


    public float getVitaminA() {
        return vitamin_a;
    }

    public void setVitaminA(float vitamin_a) {
        this.vitamin_a = vitamin_a;
    }
}

Ви можете зателефонувати сетерам та геттерам цього класу з усіх інших класів. Для цього вам потрібно зробити об’єкт GlobalClass в кожному Actitity:

GlobalClass gc = (GlobalClass) getApplication();

Тоді ви можете зателефонувати, наприклад:

gc.getVitaminA()

Переважна заявка - це дублікат відповіді Кого,
Мермель
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.