Pertanyaan Bagaimana cara mengirim data antara Aktivitas di aplikasi Android?


Saya memiliki skenario di mana, setelah masuk melalui halaman login, akan ada sign-out button pada setiap activity.

Saat mengklik sign-out, Saya akan melewati session id pengguna yang masuk untuk keluar. Adakah yang bisa membimbing saya tentang bagaimana menjaga session id tersedia untuk semua activities?

Setiap alternatif untuk kasus ini


1052
2018-01-19 06:06


asal


Jawaban:


Cara termudah untuk melakukan ini adalah dengan meneruskan id sesi ke aktivitas signout di Intent yang Anda gunakan untuk memulai aktivitas:

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

Akses maksud itu untuk aktivitas selanjutnya

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

Itu dokumen untuk Intents memiliki lebih banyak informasi (lihat bagian berjudul "Ekstra").


973
2018-01-19 06:12



Dalam Aktivitas Anda saat ini, buat yang baru Intent:

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

Kemudian di Aktivitas baru, ambil nilai-nilai itu:

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

Gunakan teknik ini untuk meneruskan variabel dari satu Aktivitas ke yang lainnya.


1310
2017-09-06 19:41



Lewat Maksud ekstra adalah pendekatan yang baik seperti yang dicatat Erich.

Itu Aplikasi objek adalah cara lain, dan kadang-kadang lebih mudah ketika berhadapan dengan keadaan yang sama di beberapa aktivitas (sebagai lawan harus mendapatkan / meletakkannya di mana-mana), atau objek yang lebih kompleks daripada primitif dan String.

Anda dapat memperpanjang Aplikasi, kemudian menetapkan / mendapatkan apa pun yang Anda inginkan di sana dan mengaksesnya dari Aktivitas apa pun (dalam aplikasi yang sama) dengan getApplication ().

Juga perlu diingat bahwa pendekatan lain yang mungkin Anda lihat, seperti statika, dapat menjadi masalah karena mereka dapat menyebabkan kebocoran memori. Aplikasi membantu menyelesaikan ini juga.


120
2018-01-20 03:55



Kelas sumber:

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

Kelas Tujuan (kelas 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");
}

78
2018-02-06 12:23



Anda hanya perlu mengirim ekstra sambil menelepon niat Anda.

Seperti ini:

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

Sekarang di OnCreate metode Anda SecondActivity Anda dapat mengambil tambahan seperti ini.

Jika nilai yang Anda kirim masuk long:

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

Jika nilai yang Anda kirim adalah a String:

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

Jika nilai yang Anda kirim adalah a Boolean:

Boolean value = getIntent().getBooleanExtra("Variable name which you sent as an extra", defaultValue);

71
2018-05-24 11:26



Diperbarui Perhatikan bahwa saya telah menyebutkan penggunaan SharedPreference. Ini memiliki API sederhana dan dapat diakses di seluruh aktivitas aplikasi. Tapi ini adalah solusi canggung, dan merupakan risiko keamanan jika Anda menyebarkan data sensitif. Lebih baik menggunakan maksud. Ini memiliki daftar ekstensif metode kelebihan beban yang dapat digunakan untuk mentransfer lebih baik banyak jenis data yang berbeda di antara kegiatan. Silahkan lihat intent.putExtra. Ini link menyajikan penggunaan putExtra dengan cukup baik.

Dalam melewatkan data antar aktivitas, pendekatan yang saya sukai adalah membuat metode statis untuk kegiatan yang relevan yang mencakup parameter yang diperlukan untuk meluncurkan maksud tersebut. Yang kemudian menyediakan pengaturan dan pengambilan parameter dengan mudah. Jadi itu bisa terlihat seperti ini

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

Kemudian Anda dapat membuat maksud untuk aktivitas yang dimaksud dan memastikan Anda memiliki semua parameter. Anda dapat menyesuaikan untuk fragmen. Contoh sederhana di atas, tetapi Anda mendapatkan ide.


37
2018-02-17 03:06



Coba lakukan hal berikut:

Buat kelas "penolong" sederhana (pabrik untuk Maksud Anda), seperti ini:

import android.content.Intent;

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

Ini akan menjadi pabrik untuk semua Maksud Anda. Setiap kali Anda perlu Intent baru, buat metode pabrik statis di IntentHelper. Untuk membuat Intent baru, Anda harus mengucapkannya seperti ini:

IntentHelper.createYourSpecialIntent(getIntent());

Dalam aktivitas Anda. Ketika Anda ingin "menyimpan" beberapa data dalam "sesi" cukup gunakan yang berikut:

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

Dan kirimkan Intent ini. Dalam target Kegiatan, bidang Anda akan tersedia sebagai:

getIntent().getStringExtra("YOUR_FIELD_NAME");

Jadi sekarang kita bisa menggunakan Intent seperti sesi lama yang sama (seperti di servlets atau JSP).


30
2018-01-19 07:16



Anda juga bisa mengirimkan objek kelas khusus dengan membuat dapat dipisahkan kelas. Cara terbaik untuk membuatnya dapat dibagi-bagi adalah dengan menulis kelas Anda dan kemudian cukup tempelkan ke situs seperti http://www.parcelabler.com/. Klik pada build dan Anda akan mendapatkan kode baru. Salin semua ini dan ganti isi kelas aslinya. Kemudian-

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

dan dapatkan hasilnya di NextActivity seperti-

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

Sekarang Anda cukup menggunakan foo objek seperti Anda akan digunakan.


22
2018-02-15 09:58



Ini membantu saya melihat hal-hal dalam konteks. Berikut dua contohnya.

Melewati Data Maju

enter image description here

Aktifitas utama

  • Masukkan data yang ingin Anda kirim dalam Intent dengan pasangan nilai kunci. Lihat jawaban ini untuk menamai konvensi untuk kunci.
  • Mulai Aktivitas Kedua dengan 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);
    }
}

Kegiatan Kedua

  • Kau gunakan getIntent() untuk mendapatkan Intent yang memulai aktivitas kedua. Kemudian Anda dapat mengekstrak data dengan getExtras() dan kunci yang Anda tetapkan dalam aktivitas pertama. Karena data kami adalah String, kami hanya akan menggunakannya getStringExtra sini.

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

Melewati Data Kembali

enter image description here

Aktifitas utama

  • Mulai Aktivitas Kedua dengan startActivityForResult, memberikannya kode hasil yang berubah-ubah.
  • Mengesampingkan onActivityResult. Ini disebut ketika Aktivitas Kedua selesai. Anda dapat memastikan bahwa ini sebenarnya adalah Aktivitas Kedua dengan memeriksa kode hasil. (Ini berguna ketika Anda memulai beberapa aktivitas berbeda dari aktivitas utama yang sama.)
  • Ekstrak data yang Anda dapatkan dari pengembalian Intent. Data diekstraksi menggunakan pasangan kunci-nilai. Saya bisa menggunakan string apa saja untuk kunci tetapi saya akan menggunakan yang telah ditentukan Intent.EXTRA_TEXT karena saya mengirim teks.

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

Kegiatan Kedua

  • Masukkan data yang ingin Anda kirim kembali ke aktivitas sebelumnya ke dalam Intent. Data disimpan dalam Intent menggunakan pasangan kunci-nilai. Saya memilih untuk menggunakan Intent.EXTRA_TEXT untuk kunci saya.
  • Setel hasilnya ke RESULT_OK dan tambahkan maksud memegang data Anda.
  • Panggilan finish() untuk menutup Aktivitas Kedua.

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

22
2017-08-31 10:35



Cara lain adalah menggunakan bidang statis publik tempat Anda menyimpan data, yaitu:

public class MyActivity extends Activity {

  public static String SharedString;
  public static SomeObject SharedObject;

//...

19
2017-10-25 22:34



Cara yang paling mudah untuk melewatkan data di antara aktivitas adalah dengan mengirimkan maksud. Di aktivitas pertama dari tempat Anda ingin mengirim data, Anda harus menambahkan kode,

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

Anda juga harus mengimpor

import android.content.Intent;

Kemudian di Acitvity berikutnya (SecondActivity), Anda harus mengambil data dari maksud menggunakan kode berikut.

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

15
2017-08-27 06:46