Lebih
Bagaimana saya meneruskan data antara Kegiatan di aplikasi Android?
Saya memiliki sebuah skenario di mana, setelah login melalui halaman login, akan ada tanda-out tombol
di masing-masing kegiatan
.
Dengan mengklik keluar
, aku akan melewati id sesi
yang ditandatangani pada pengguna untuk sign-out. Yang bisa membimbing saya tentang cara untuk menjaga session id
, tersedia untuk semua kegiatan
?
Alternatif lain untuk kasus ini
1285
53
Dalam Aktivitas anda saat ini, membuat
Niat
:Kemudian dalam Aktivitas baru, mengambil nilai-nilai tersebut:
Menggunakan teknik ini untuk lulus variabel dari satu aktivitas ke Aktivitas yang lain.
Cara termudah untuk melakukan hal ini akan lulus session id untuk signout kegiatan di
Niat
anda're menggunakan untuk memulai kegiatan:Akses yang berniat aktivitas berikutnya:
The docs untuk Maksud yang memiliki informasi lebih lanjut (lihat bagian yang berjudul "Ekstra").
Lewat Maksud tambahan adalah pendekatan yang baik sebagai Erich mencatat.
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/taruh di mana-mana), atau benda-benda yang lebih kompleks dari yang primitif dan String.
Anda dapat memperpanjang Aplikasi, dan kemudian mengatur/mendapatkan apapun yang anda inginkan ada dan akses dari setiap Kegiatan (dalam aplikasi yang sama) dengan getApplication().
Juga perlu diingat bahwa pendekatan-pendekatan lain yang mungkin anda lihat, seperti statika, dapat menjadi masalah karena mereka dapat menyebabkan kebocoran memori. Aplikasi ini membantu memecahkan masalah ini juga.
Sumber kelas:
Tujuan Kelas (NewActivity kelas):
Anda hanya perlu mengirim tambahan sambil menelepon anda maksud.
Seperti ini:
Sekarang di
OnCreate
metodeanda SecondActivity
anda dapat mengambil ekstra seperti ini.Jika nilai yang anda dikirim dalam
lama
:Jika nilai yang dikirim adalah
String
:Jika nilai yang dikirim adalah
Boolean
:Updated Catatan yang telah saya sebutkan penggunaan SharedPreference. Ia memiliki API sederhana dan dapat diakses di aplikasi's kegiatan. Tapi ini adalah kikuk solusi, dan risiko keamanan jika anda melewati seluruh data sensitif. It's terbaik untuk menggunakan intent. Ini memiliki daftar ekstensif kelebihan beban metode yang dapat digunakan baik untuk transfer berbagai jenis data yang berbeda antara kegiatan. Silahkan lihat di maksud.putExtra. Ini link menyajikan penggunaan putExtra cukup baik.
Dalam menyampaikan data antar kegiatan, saya pendekatan yang lebih disukai adalah untuk menciptakan sebuah metode statis untuk aktivitas yang relevan yang mencakup parameter-parameter yang dibutuhkan peluncuran maksud. Yang kemudian memberikan kemudahan setup dan mengambil parameter. Sehingga dapat terlihat seperti ini
Kemudian anda dapat membuat sebuah maksud untuk tujuan kegiatan dan memastikan anda memiliki semua parameter. Anda dapat beradaptasi untuk fragmen. Contoh sederhana di atas, tetapi anda mendapatkan ide.
Ini membantu saya untuk melihat hal-hal dalam konteks. Berikut ini adalah dua contoh.
Melewati Data Ke Depan
Aktivitas Utama
startActivity
.MainActivity.java
Kedua Kegiatan
getIntent()
untuk mendapatkanMaksud
yang memulai aktivitas kedua. Kemudian anda dapat mengekstrak data dengangetExtras()
dan tombol yang anda tetapkan pada kegiatan pertama. Karena data kami adalah sebuah String, kita hanya akan menggunakangetStringExtra
di sini.SecondActivity.java
Lewat Data Kembali
Aktivitas Utama
startActivityForResult
, menyediakan sewenang-wenang kode hasil.onActivityResult
. Ini disebut ketika Kedua Kegiatan selesai. Anda dapat memastikan bahwa itu adalah benar-benar Kegiatan yang Kedua dengan memeriksa kode hasil. (Hal ini berguna ketika anda memulai beberapa kegiatan yang berbeda dari kegiatan utama.)Niat
. Data diekstrak menggunakan pasangan kunci-nilai. Saya bisa menggunakan string untuk kunci tapi aku'll menggunakan standarNiat.EXTRA_TEXT
sejak saya'm mengirimkan teks.MainActivity.java
Kedua Kegiatan
Niat
. Data disimpan dalamNiat
menggunakan pasangan kunci-nilai. Saya memilih untuk menggunakanNiat.EXTRA_TEXT
untuk saya kunci.RESULT_OK
dan tambahkan maksud memegang data anda.finish()
untuk menutup Aktivitas Kedua.SecondActivity.java
Cobalah untuk melakukan hal-hal berikut:
Membuat sederhana "pembantu" kelas (pabrik untuk anda Maksud), seperti ini:
Ini akan menjadi pabrik untuk semua Maksud anda. Setiap kali anda perlu Intent baru, membuat statis metode pabrik di IntentHelper. Untuk membuat Intent baru, anda hanya harus mengatakan seperti ini:
Dalam aktivitas anda. Bila anda ingin "simpan" beberapa data dalam "sesi" hanya digunakan sebagai berikut:
Dan mengirim Maksud ini. Dalam sasaran Kegiatan bidang anda akan tersedia seperti:
Jadi sekarang kita dapat menggunakan Intent suka sama sesi (seperti di servlet atau JSP]1).
Anda juga dapat melewati kelas kustom objek dengan membuat parcelable kelas. Cara terbaik untuk membuat itu parcelable adalah untuk menulis kelas anda dan kemudian hanya paste ke situs seperti http://www.parcelabler.com/. Klik pada membangun dan anda akan mendapatkan kode baru. Copy semua ini dan mengganti isi kelas. Kemudian-
dan dapatkan hasilnya di NextActivity suka-
Sekarang anda hanya dapat menggunakan foo objek seperti anda akan digunakan.
Cara lain adalah dengan menggunakan public static bidang di mana anda menyimpan data, yaitu:
Cara yang paling nyaman untuk meneruskan data antara kegiatan ini dengan melewati maksud. Dalam kegiatan pertama dari mana anda ingin mengirim data, anda harus menambahkan kode,
Anda juga harus impor
Kemudian di depan Acitvity(SecondActivity), anda harus mengambil data dari intent menggunakan kode berikut.
Anda dapat menggunakan
SharedPreferences
...SharedPreferences
SharedPreferences preferensi = getSharedPreferences("sesi",getApplicationContext().MODE_PRIVATE); Editor editor = preferensi.edit(); editor.putString("sessionId", sessionId); editor.commit();
SharedPreferences preferensi = getSharedPreferences("sesi", getApplicationContext().MODE_PRIVATE); String sessionId = preferensi.getString("sessionId", null);
Jika anda don't memiliki id sesi, kemudian menghapus sharedpreferences:
Yang sangat berguna, karena suatu saat anda menyimpan nilai dan kemudian mengambil mana saja dari aktivitas.
Pendekatan standar.
Sekarang kedua kegiatan mengambil data anda dari bundel:
Dapatkan bundel
Ekstrak data...
Dari Aktivitas
Aktivitas
Anda dapat mengirim data antara kegiatan dengan menggunakan intent objek. Anggap anda memiliki dua kegiatan yaitu
FirstActivity
danSecondActivity
.Dalam FirstActivity:
Menggunakan Intent:
Dalam SecondActivity
Sekarang anda dapat menggunakan berbagai bundel kelas metode untuk mendapatkan nilai-nilai yang diwariskan dari FirstActivity oleh Kunci.
E. g.
bundel.getString("kunci")
,bundel.getDouble("kunci")
,bundel.getInt("kunci")
dll.Jika anda ingin tranfer bitmap antara Kegiatan/Fragmen
Aktivitas
Untuk lulus bitmap antara Kegiatan
Dan dalam Kegiatan kelas
Fragmen
Untuk lulus bitmap antara Fragmen
Untuk menerima dalam SecondFragment
Transfer Besar Bitmap
Jika anda mendapatkan gagal pengikat transaksi, ini berarti anda melebihi pengikat penyangga transaksi dengan mentransfer elemen besar dari satu kegiatan ke kegiatan lain.
Jadi dalam hal ini anda harus kompres bitmap sebagai byte's array dan kemudian membukanya di lain kegiatan, seperti ini
Di FirstActivity
Dan di SecondActivity
Anda dapat mengambilnya di kegiatan lain. Dua cara:
Cara kedua adalah:
Di sini saya praktek terbaik dan itu banyak membantu ketika proyek besar dan kompleks.
Misalkan saya punya 2 kegiatan,
LoginActivity
danHomeActivity
. Saya ingin lulus 2 parameter (username & password) dariLoginActivity
untukHomeActivity
.Pertama, saya membuat
HomeIntent
Berikut adalah bagaimana saya lulus data di saya LoginActivity
Langkah terakhir, di sini adalah bagaimana saya menerima data dalam
HomeActivity
Selesai! Keren :) aku hanya ingin berbagi pengalaman saya. Jika anda bekerja pada proyek kecil ini seharusnya't menjadi masalah besar. Tetapi ketika anda bekerja pada proyek besar, itu benar-benar sakit ketika anda ingin melakukan refactoring atau memperbaiki bug.
Tambahan Jawaban: Konvensi Penamaan untuk Kunci String
Sebenarnya proses lewat data sudah dijawab, namun sebagian besar jawaban menggunakan kode keras string untuk nama kunci yang di Maksud. Hal ini biasanya baik bila digunakan hanya dalam aplikasi anda. Namun, dokumentasi merekomendasikan menggunakan
EXTRA_*
konstanta untuk standar tipe data.*Contoh 1: Menggunakan `Niat.EXTRA_` kunci**
Kegiatan pertama
Kedua kegiatan:
Contoh 2: Mendefinisikan sendiri
static final
kunciJika salah satu dari
Niat.EXTRA_*
String tidak sesuai dengan kebutuhan anda, anda dapat menentukan sendiri pada awal kegiatan pertama.Termasuk nama paket adalah konvensi jika anda hanya menggunakan tombol dalam aplikasi anda sendiri. Tapi itu adalah suatu keharusan untuk menghindari konflik penamaan jika anda membuat beberapa jenis layanan yang aplikasi lain dapat memanggil dengan suatu Maksud.
Kegiatan pertama:
Kedua kegiatan:
Contoh 3: Menggunakan String sumber daya kunci
Meskipun tidak disebutkan dalam dokumentasi, jawaban merekomendasikan menggunakan String sumber daya untuk menghindari ketergantungan antar kegiatan.
strings.xml
Kegiatan pertama
Kedua aktivitas
Anda dapat menggunakan
Niat
Cara lain bisa menggunakan singleton pattern juga:
Dari FirstActivity
Pada SecondActivity