Bagaimana cara mengirim data antara Aktivitas di aplikasi Android?

1349

Saya memiliki skenario di mana, setelah masuk melalui halaman masuk, akan ada keluar buttonpada masing-masing activity.

Saat mengklik sign-out, saya akan melewati session idpengguna yang masuk untuk keluar. Adakah yang bisa membimbing saya tentang cara menjaga session idketersediaan untuk semua activities?

Alternatif apa pun untuk kasus ini

UMAR
sumber
14
saya menggunakan sharedpreference bermanfaat juga untuk menyimpan data login pada fitur kata sandi
remeber
Ini bekerja untuk saya. stackoverflow.com/a/7325248/2125322 Terima kasih Darshan Computing
matasoy
stackoverflow.com/a/37774966/6456129 mungkin membantu
Yessy
untuk kasus seperti itu cobalah membuat kelas commomUtils dengan Metode sharedprefereces ... ini akan menjaga kode tetap bersih dan data terkait di suatu tempat. Dan Anda akan dapat dengan mudah menghapus set data tertentu hanya dengan satu metode membersihkan
file preferensi

Jawaban:

1266

Cara termudah untuk melakukannya adalah dengan melewatkan id sesi ke aktivitas keluar yang IntentAnda gunakan untuk memulai aktivitas:

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

Akses maksud itu pada aktivitas berikutnya:

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

The docs untuk Niat memiliki informasi lebih lanjut (lihat bagian berjudul "Ekstra").

Erich Douglass
sumber
ok jika saya lulus id sesi untuk aktivitas signout pada login yang berhasil dan apakah itu akan berfungsi pada halaman aktivitas untuk signout atau secara manual saya harus menetapkan nilainya pada setiap kegiatan ??? menggunakan prosedur di atas ??
UMAR
5
Ya, Anda harus membuat ID sesi tersedia untuk setiap aktivitas tempat Anda ingin mengizinkan pengguna untuk keluar. Atau, Anda bisa menyimpannya di objek Aplikasi, tetapi kemudian Anda harus mengelola status sesi (periksa apakah itu valid sebelum menggunakan, dll).
Erich Douglass
1
Perlu diketahui bahwa dokumentasi menunjukkan hal-hal berikut: Tambahkan data yang diperluas ke maksud. Nama harus menyertakan awalan paket, misalnya aplikasi com.android.contacts akan menggunakan nama seperti "com.android.contacts.ShowAll".
Serguei Fedorov
1
Dan untuk membaca data dari penggunaan Aktivitas lainLong session_ids=getIntent().getExtras().getLong("EXTRA_SESSION_IDS");
Farid
1
Bagaimana kita bisa meneruskan data menggunakan setDatadan apa perbedaan antara dua pendekatan ini? Mana yang lebih baik?
Hosein Aqajani
1402

Di 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 aktivitas lainnya.

pengguna914425
sumber
58
Hanya info untuk mereka yang buta seperti saya: jika Anda memasukkan bilangan bulat dalam aktivitas Anda saat ini, Anda harus mendapatkannya di yang baru via extras.getInt("new_variable_name"). Jika Anda mencoba untuk mendapatkannya melalui getString()android, lihat bahwa int diberikan dan mengembalikan nol!
bish
4
bagaimana jika aktivitas sudah berjalan, apakah perlu dilakukan startActivity(i);? Maksud saya, dapatkah saya membuat aktivitas A menyebut aktivitas B , dan yang mengembalikan data ke aktivitas A ? apakah saya bingung
Francisco Corrales Morales
Saya lebih suka variabel string. Anda selalu dapat mengonversi string menjadi integer atau float nanti.
user914425
140

Melewati ekstra Intent adalah pendekatan yang baik seperti yang dicatat Erich.

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

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

Perlu diingat juga bahwa pendekatan lain yang mungkin Anda lihat, seperti statika, dapat menimbulkan masalah karena dapat menyebabkan kebocoran memori . Aplikasi membantu menyelesaikan ini juga.

Charlie Collins
sumber
8
+1 untuk masalah statika. mungkin pembersihan dapat diatasi dengan menggabungkan singleton dengan kelas Aplikasi onCreate / onTerminate.
Syd
10
Hai, saya tahu utas ini cukup lama, tapi tautan yang disediakan sekarang jalan buntu. Apakah ada tempat saya dapat menemukan contoh?
JuiCe
Bagaimana cara mencapai ini menggunakan Aplikasi? @CharlieCollins
Ishaque K
Berikut ini contoh terbaru dari ini di sini, dari buku yang sangat lama :) github.com/charlieCollins/android-in-practice/blob/master/ch07/…
Charlie Collins
@JuiCe Posting blog Pengembang Android tentang kebocoran memori tidak lagi tidak valid.
Edric
94

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 (kelasAktivitas Baru):

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");
}
Ny. Rahman
sumber
3
Bisakah niatnya menjadi nol? Haruskah kita memeriksa bahwa itu bukan nol?
Micro
Ini adalah duplikat dari jawaban paling banyak dipilih 3 tahun yang lebih tua dan jawaban Sahil Mahajan Mj dan jawaban Mayank Saini
Murmel
85

Anda hanya perlu mengirim ekstra saat menelepon niat Anda.

Seperti ini:

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

Sekarang pada OnCreatemetode Anda, SecondActivityAnda dapat mengambil ekstra seperti ini.

Jika nilai yang Anda kirim ada dilong :

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

Jika nilai yang Anda kirim adalahString :

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

Jika nilai yang Anda kirim adalahBoolean :

Boolean value = getIntent().getBooleanExtra("Variable name which you sent as an extra", defaultValue);
Mayank Saini
sumber
3
Perlu diketahui bahwa dokumentasi menunjukkan hal-hal berikut: Tambahkan data yang diperluas ke maksud. Nama harus menyertakan awalan paket, misalnya aplikasi com.android.contacts akan menggunakan nama seperti "com.android.contacts.ShowAll".
Serguei Fedorov
Ini adalah duplikat dari jawaban paling banyak dipilih yang telah ada selama 2 tahun sebelum jawaban ini dan jawaban Sahil Mahajan Mj yang 1 tahun lebih tua. Hanya perbedaan: contoh untuk booleandan longpengambil yang bernilai IMO komentar, bukan jawaban.
Murmel
48

Ini membantu saya melihat berbagai hal dalam konteks. Berikut ini dua contoh.

Melewati Data Maju

masukkan deskripsi gambar di sini

Aktifitas utama

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

Aktivitas kedua

  • Anda menggunakan getIntent()untuk Intentmemulai 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 menggunakan di getStringExtrasini.

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

masukkan deskripsi gambar di sini

Aktifitas utama

  • Mulailah Aktivitas Kedua dengan startActivityForResult, berikan kode hasil yang sewenang-wenang.
  • Timpa onActivityResult. Ini disebut ketika Aktivitas Kedua selesai. Anda dapat memastikan bahwa itu sebenarnya 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 dapat menggunakan string apa pun untuk kunci tetapi saya akan menggunakan yang sudah ditentukan sebelumnya Intent.EXTRA_TEXTkarena 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);
            }
        }
    }
}

Aktivitas kedua

  • Masukkan data yang ingin Anda kirim kembali ke aktivitas sebelumnya ke dalam Intent. Data disimpan dalam Intentmenggunakan pasangan kunci-nilai. Saya memilih untuk menggunakan Intent.EXTRA_TEXTkunci saya.
  • Tetapkan hasilnya ke RESULT_OKdan tambahkan maksud menyimpan 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();
    }
}
Suragch
sumber
3
Wow Terimakasih! Ini yang saya cari. Cukup jelas ketika menggunakan kamera atau eksternal lain yang saya harapkan hasilnya kembali, tetapi saya tidak berpikir untuk menggunakannya secara internal. Anda yang pertama mengatakannya secara terbuka.
user3195231
45

Catatan yang diperbarui bahwa saya telah menyebutkan penggunaan SharedPreference . Ini memiliki API sederhana dan dapat diakses di seluruh aktivitas aplikasi. Tetapi ini adalah solusi yang canggung, dan merupakan risiko keamanan jika Anda memberikan data sensitif. Lebih baik menggunakan niat. Ini memiliki daftar luas metode kelebihan beban yang dapat digunakan untuk mentransfer berbagai tipe data antara aktivitas dengan lebih baik. Lihatlah intent.putExtra . Tautan ini menyajikan penggunaan putExtra dengan cukup baik.

Dalam meneruskan data antar aktivitas, pendekatan yang saya sukai adalah membuat metode statis untuk aktivitas yang relevan yang mencakup parameter yang diperlukan untuk meluncurkan maksud. Yang kemudian menyediakan pengaturan dan pengambilan parameter dengan mudah. Jadi 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 beradaptasi untuk fragmen. Contoh sederhana di atas, tetapi Anda mendapatkan ide.

angryITguy
sumber
2
Saya paling suka jawaban Anda ... Melewatinya dengan maksud berarti bahwa hampir di mana pun saya memulai kegiatan, Anda harus ingat untuk memasukkan sessionId. Dengan meletakkannya di SharedPreferences Anda dapat memperolehnya kapan saja dari aktivitas apa pun. : 0)
bytebender
@bytebender Saya tahu ini agak terlambat untuk tanggapan, saya menghargai bahwa Anda menyukai jawaban asli saya karena simlpicity, tapi saya akan berhati-hati untuk menyimpan ID sesi dalam preferensi bersama. Jika Anda harus menyimpannya di hard drive maka gunakan enkripsi. Jika Anda dapat menggunakan kerangka kerja otentikasi yang menggunakan JWT, itu akan mencakup refreshTokens yang lebih aman untuk penyimpanan jangka panjang, dan kemudian menyimpan token sesi saat ini sebagai properti publik dari objek Aplikasi kustom untuk dengan mudah mengakses token otentikasi, dan mengurangi overhead pada aktivitas tanda tangan niat.
angryITguy
38

Coba lakukan hal berikut:

Buat kelas "pembantu" 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 membutuhkan Intent baru, buat metode pabrik statis di IntentHelper. Untuk membuat Intent baru Anda harus mengatakannya seperti ini:

IntentHelper.createYourSpecialIntent(getIntent());

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

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

Dan kirimkan Intent ini. Dalam Kegiatan target, 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 ).

ponkin
sumber
28

Anda juga dapat melewatkan objek kelas kustom dengan membuat kelas parcelable . Cara terbaik untuk membuatnya parcelable adalah dengan menulis kelas Anda dan kemudian cukup menempelkannya ke situs seperti http://www.parcelabler.com/ . Klik build dan Anda akan mendapatkan kode baru. Salin semua ini dan ganti konten kelas asli. 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 objek foo seperti yang akan Anda gunakan.

Vaibhav Sharma
sumber
23

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

public class MyActivity extends Activity {

  public static String SharedString;
  public static SomeObject SharedObject;

//...
Komputer berkata tidak
sumber
5
Saya benar-benar bertanya-tanya mengapa saran Anda tidak mendapatkan suara, itu lebih sederhana dan lebih praktis.
Porizm
7
um ... bukankah ini melanggar prinsip OO?
Christian Vielma
2
@ChristianVielma yah, ini lebih seperti daerah abu-abu ... Anda dapat melakukannya dengan banyak cara, bagi saya sepertinya bersih "lolos", jadi ... terserah Anda (pengembang) untuk membuat keputusan jika berfungsi baik untuk Anda atau tidak, saya suka cara ini karena lebih mudah diikuti, tetapi bisa menjadi sangat kotor sangat cepat ...
ComputerSaysNo
2
mengapa Anda mengatakan ini menjadi kotor? Tidakkah iOS melakukan ini untuk mengirimkan data antara viewcontrollers dengan mengatur "properties" yang mirip dengan ini? Ini jauh lebih mudah daripada menggunakan niat
Terry Bu
2
Ya, Anda meneruskan data antara pengontrol tampilan, tetapi tidak dengan properti statis . Masalahnya adalah itu bukan properti pada contoh aktivitas yang diinginkan. Cara Android meluncurkan aktivitas melalui startActivity (), itu tidak langsung membuat objek dan memungkinkan pengembang untuk mengatur variabel contoh. Ini sangat menjengkelkan ...
Shawn
20

Cara yang paling mudah untuk mengirimkan data antar aktivitas adalah dengan melewatkan maksud. Dalam 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");
Sahil Mahajan Mj
sumber
2
Ini adalah duplikat dari jawaban paling banyak dipilih yang telah ada bahkan selama 1 tahun lebih.
Murmel
19

Anda bisa menggunakan SharedPreferences...

  1. Penebangan. Id sesi penyimpanan waktu diSharedPreferences

    SharedPreferences preferences = getSharedPreferences("session",getApplicationContext().MODE_PRIVATE);
    Editor editor = preferences.edit();
    editor.putString("sessionId", sessionId);
    editor.commit();
  2. Keluar. Waktu ambil id sesi dalam preferensi bersama

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

Jika Anda tidak memiliki id sesi yang diperlukan, maka hapus preferensi yang dibagikan:

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

Itu sangat berguna, karena suatu saat Anda menyimpan nilai dan kemudian mengambil aktivitas di mana saja.

Ravi Parsania
sumber
17

Pendekatan standar.

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

Sekarang dalam aktivitas kedua Anda mengambil data Anda dari bundel:

Dapatkan bundelnya

Bundle bundle = getIntent().getExtras();

Ekstrak data ...

String stuff = bundle.getString(“stuff”); 
Ajay Venugopal
sumber
1
Gandakan sebagaimana telah diusulkan oleh PRABEESH RK pada tahun 2012. Dan dapat direduksi menjadi i.putExtras()/ getIntent().getString()yang diusulkan oleh 6 jawaban lain ...
Murmel
17

Dari Aktivitas

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

Ke Aktivitas

 Bundle b2 = getIntent().getExtras();
 int m = 0;
 if(b2 != null)
  {
     m = b2.getInt("integerNumber");
  }
Gavine Joyce
sumber
1
Duplikat: BundlePendekatan berbasis sudah diusulkan oleh PRABEESH RK pada 2012 dan Ajay Venugopal , Krishna . Dan dapat direduksi menjadi i.putExtras()/ getIntent().getString()yang diusulkan oleh 8 jawaban lain ...
Murmel
11

Anda dapat mengirim data antara aktivitas menggunakan objek maksud. Anggap Anda memiliki dua kegiatan yaitu FirstActivitydan SecondActivity.

Di dalam FirstActivity:

Menggunakan Intent:

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

Di dalam SecondActivity

Bundle bundle= getIntent().getExtras();

Sekarang Anda dapat menggunakan metode kelas bundel yang berbeda untuk mendapatkan nilai yang diberikan dari FirstActivity oleh Key.

Misalnya bundle.getString("key"), bundle.getDouble("key"), bundle.getInt("key")dll

Krishna
sumber
1
Duplikat: BundlePendekatan berbasis sudah diusulkan oleh PRABEESH RK pada 2012 dan Ajay Venugopal . Dan dapat direduksi menjadi i.putExtras()/ getIntent().getString()yang diusulkan oleh 7 jawaban lain ...
Murmel
11

Jika Anda ingin mentransfer bitmap antara Activites / Fragments


Aktivitas

Untuk melewatkan bitmap antara Activites

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

Dan di kelas Activity

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

Pecahan

Untuk melewatkan bitmap antara Fragmen

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

Untuk menerima di dalam SecondFragment

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

Mentransfer Bitmap Besar

Jika Anda mendapatkan transaksi binder yang gagal, ini berarti Anda melebihi buffer transaksi binder dengan mentransfer elemen besar dari satu aktivitas ke aktivitas lain.

Jadi dalam hal ini Anda harus mengompres bitmap sebagai array byte dan kemudian mengompresnya dalam aktivitas lain , seperti ini

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

Dan di SecondActivity

byte[] bytes = getIntent().getByteArrayExtra("bitmapbytes");
Bitmap bmp = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
capt.swag
sumber
9
Intent intent = new Intent(YourCurrentActivity.this, YourActivityName.class);
intent.putExtra("NAme","John");
intent.putExtra("Id",1);
startActivity(intent);

Anda dapat mengambilnya di aktivitas lain. Dua arah:

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

Cara kedua adalah:

Intent i = getIntent();
String name = i.getStringExtra("name");
Dilavar Malek
sumber
Ini adalah duplikat dari jawaban paling banyak dipilih 3 tahun yang lebih tua dan jawaban Sahil Mahajan Mj dan jawaban Mayank Saini dan jawaban Md. Rahman
Murmel
8

Ini adalah praktik terbaik saya dan sangat membantu ketika proyek ini besar dan kompleks.

Misalkan saya punya 2 kegiatan, LoginActivitydan HomeActivity. Saya ingin meneruskan 2 parameter (nama pengguna & kata sandi) dari LoginActivityke HomeActivity.

Pertama, saya buat 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);
    }
}

Inilah cara saya meneruskan data di LoginActivity saya

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

    }
}

Langkah terakhir, berikut adalah cara saya menerima data 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());
    }
}

Selesai! Keren :) Saya hanya ingin berbagi pengalaman. Jika Anda mengerjakan proyek kecil ini seharusnya tidak menjadi masalah besar. Tetapi ketika Anda mengerjakan proyek besar, itu benar-benar menyakitkan ketika Anda ingin melakukan refactoring atau memperbaiki bug.

THANN Phearum
sumber
7

Jawaban Tambahan: Konvensi Penamaan untuk String Kunci

Sebenarnya proses mengirimkan data sudah dijawab, namun sebagian besar jawaban menggunakan string kode keras untuk nama kunci di Intent. Ini biasanya baik jika digunakan hanya dalam aplikasi Anda. Namun, dokumentasi merekomendasikan penggunaan EXTRA_*konstanta untuk tipe data standar.

Contoh 1: Menggunakan Intent.EXTRA_*kunci

Aktivitas pertama

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

Aktivitas kedua:

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

Contoh 2: Menentukan static finalkunci Anda sendiri

Jika salah satu dari Intent.EXTRA_*String tidak sesuai dengan kebutuhan Anda, Anda dapat menentukan sendiri di awal aktivitas pertama.

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

Termasuk nama paket hanya sebuah konvensi jika Anda hanya menggunakan kunci di aplikasi Anda sendiri. Tapi itu adalah suatu keharusan untuk menghindari konflik penamaan jika Anda membuat semacam layanan yang aplikasi lain dapat memanggil dengan Intent.

Aktivitas pertama:

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

Aktivitas kedua:

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

Contoh 3: Menggunakan kunci sumber daya String

Meskipun tidak disebutkan dalam dokumentasi, jawaban ini merekomendasikan penggunaan sumber daya String untuk menghindari ketergantungan antara aktivitas.

strings.xml

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

Aktivitas pertama

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

Aktivitas kedua

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

Kamu bisa menggunakan Intent

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

Cara lain bisa menggunakan pola singleton juga:

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

Dari FirstActivity Anda

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

Di SecondActivity

private List<Model> dataList = DataHolder.getInstance().getDataList();
Sachin
sumber
Gandakan: Pendekatan niat sudah diusulkan oleh paling atas sebagai jawaban dan jawaban Sahil Mahajan Mj dan jawaban Mayank Saini ini dan jawaban Md Rahman. , Jawaban Dilavar M , jawaban android pengembang , sahulab . Singleton: Rodion Altshuler menjawab
Murmel
6

Pengoperan data antar aktivitas terutama melalui objek yang dimaksudkan.

Pertama, Anda harus melampirkan data ke objek maksud dengan menggunakan Bundlekelas. Kemudian panggil aktivitas menggunakan salah satu startActivity()atau startActivityForResult()metode.

Anda dapat menemukan informasi lebih lanjut tentang itu, dengan contoh dari posting blog Melewati data ke suatu Aktivitas .

PRABEESH RK
sumber
Ini kurang lebih sama dengan menggunakan metode yang disediakan Intent secara langsung ( Intent#putExtra()). Tetapi menambahkan yang lain Bundledan membuat segalanya lebih rumit.
Murmel
6

Anda dapat mencoba Preferensi Bersama, ini mungkin merupakan alternatif yang baik untuk berbagi data di antara berbagai kegiatan

Untuk menyimpan id sesi -

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

Untuk mendapatkan mereka -

SharedPreferences pref = myContexy.getSharedPreferences("Session Data", MODE_PRIVATE);
session_id = pref.getInt("Session ID", 0);
Rohit Gurjar
sumber
Duplikat: Pendekatan ini sudah didukung oleh Ravi Parsania pada tahun 2014
Murmel
5

Mulai aktivitas lain dari parameter lulus aktivitas ini melalui Bundle Object

Intent intent = new Intent(getBaseContext(), YourActivity.class);
intent.putExtra("USER_NAME", "[email protected]");
startActivity(intent);

Ambil aktivitas lain (YourActivity)

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

Ini ok untuk tipe data jenis sederhana. Tetapi jika Anda ingin mengirimkan data yang kompleks di antara aktivitas, Anda harus membuat serial terlebih dahulu.

Di sini kita memiliki Model Karyawan

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

    getters...
    setters...
}

Anda dapat menggunakan Gson lib yang disediakan oleh google untuk membuat serial data yang kompleks seperti ini

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);
DroidNinja
sumber
5

Kotlin

Lulus dari Aktivitas Pertama

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

Dapatkan di Aktivitas Kedua

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

Saran

Selalu masukkan kunci dalam file konstan untuk cara yang lebih terkelola.

companion object {
    val KEY = "key"
}
Khemraj
sumber
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));
    }
}
Dip Pokhrel
sumber
4

Charlie Collins memberi saya jawaban sempurna menggunakan Application.class. Saya tidak sadar bahwa kami dapat dengan mudah membuat subklasnya. Berikut adalah contoh yang disederhanakan menggunakan kelas aplikasi khusus.

AndroidManifest.xml

Berikan android:nameatribut untuk menggunakan kelas aplikasi Anda sendiri.

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

MyApplication.java

Gunakan ini sebagai pemegang referensi global. Ini berfungsi dengan baik dalam proses yang sama.

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

Tetapkan referensi "singleton" global ke instance aplikasi.

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

Contoh sederhana di mana saya menggunakan aktivitas utama dari instance aktivitas lain.

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

Saya baru-baru ini merilis Vapor API , kerangka kerja Android rasa jQuery yang membuat segala macam tugas seperti ini lebih sederhana. Seperti disebutkan, SharedPreferencesadalah salah satu cara Anda bisa melakukan ini.

VaporSharedPreferencesdiimplementasikan sebagai Singleton sehingga merupakan salah satu opsi, dan dalam Vapor API memiliki .put(...)metode yang kelebihan beban sehingga Anda tidak perlu khawatir secara eksplisit tentang jenis data yang Anda lakukan - asalkan didukung. Ini juga lancar, sehingga Anda dapat membuat panggilan:

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

Ini juga secara otomatis menyimpan perubahan, dan menyatukan proses membaca dan menulis di bawah tenda sehingga Anda tidak perlu secara eksplisit mengambil Editor seperti yang Anda lakukan di Android standar.

Atau Anda dapat menggunakan Intent. Dalam Vapor API, Anda juga dapat menggunakan .put(...)metode kelebihan muatan yang dapat dilantai pada VaporIntent:

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

Dan berikan sebagai tambahan, sebagaimana disebutkan dalam jawaban lain. Anda dapat mengambil ekstra dari Anda Activity, dan selanjutnya jika Anda menggunakan VaporActivityini dilakukan untuk Anda secara otomatis sehingga Anda dapat menggunakan:

this.extras()

Untuk mengambilnya di ujung lain dalam ActivityAnda beralih ke.

Berharap itu menarik bagi sebagian orang :)

Darius
sumber
@ BaneeIshaqueK ya, sudah lama tidak memelihara ini. Telah memperbarui tautan untuk mengarahkan langsung ke Github untuk proyek jika itu membantu. ps. Tidak yakin apa yang saya pikirkan untuk lisensi itu ... permintaan maaf
Darius
4

Aktivitas pertama:

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

Aktivitas kedua:

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

Anda dapat mengirimkan data antar aktivitas dalam aplikasi dalam 3 cara

  1. Maksud
  2. SharedPreferences
  3. Aplikasi

menyampaikan data dengan maksud memiliki beberapa batasan. Untuk sejumlah besar data, Anda dapat menggunakan berbagi data tingkat Aplikasi dan dengan menyimpannya di SharedPreference membuat ukuran aplikasi Anda bertambah

Lavanya Velusamy
sumber
3

Gunakan kelas global:

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

Anda dapat memanggil setter dan getter dari kelas ini dari semua kelas lainnya. Lakukan itu, Anda perlu membuat GlobalClass-Object di setiap Aktitas:

GlobalClass gc = (GlobalClass) getApplication();

Maka Anda dapat menelepon misalnya:

gc.getVitaminA()
Patricia Heimfarth
sumber
Aplikasi utama - ini adalah duplikat dari jawaban
Whome