Saya memiliki skenario di mana, setelah masuk melalui halaman masuk, akan ada keluar button
pada masing-masing activity
.
Saat mengklik sign-out
, saya akan melewati session id
pengguna yang masuk untuk keluar. Adakah yang bisa membimbing saya tentang cara menjaga session id
ketersediaan untuk semua activities
?
Alternatif apa pun untuk kasus ini
Jawaban:
Cara termudah untuk melakukannya adalah dengan melewatkan id sesi ke aktivitas keluar yang
Intent
Anda gunakan untuk memulai aktivitas:Akses maksud itu pada aktivitas berikutnya:
The docs untuk Niat memiliki informasi lebih lanjut (lihat bagian berjudul "Ekstra").
sumber
Long session_ids=getIntent().getExtras().getLong("EXTRA_SESSION_IDS");
setData
dan apa perbedaan antara dua pendekatan ini? Mana yang lebih baik?Di Aktivitas Anda saat ini, buat yang baru
Intent
:Kemudian di Aktivitas baru, ambil nilai-nilai itu:
Gunakan teknik ini untuk meneruskan variabel dari satu aktivitas ke aktivitas lainnya.
sumber
extras.getInt("new_variable_name")
. Jika Anda mencoba untuk mendapatkannya melaluigetString()
android, lihat bahwa int diberikan dan mengembalikan nol!startActivity(i);
? Maksud saya, dapatkah saya membuat aktivitas A menyebut aktivitas B , dan yang mengembalikan data ke aktivitas A ? apakah saya bingungMelewati 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.
sumber
Kelas sumber:
Kelas Tujuan (kelasAktivitas Baru):
sumber
Anda hanya perlu mengirim ekstra saat menelepon niat Anda.
Seperti ini:
Sekarang pada
OnCreate
metode Anda,SecondActivity
Anda dapat mengambil ekstra seperti ini.Jika nilai yang Anda kirim ada di
long
:Jika nilai yang Anda kirim adalah
String
:Jika nilai yang Anda kirim adalah
Boolean
:sumber
boolean
danlong
pengambil yang bernilai IMO komentar, bukan jawaban.Ini membantu saya melihat berbagai hal dalam konteks. Berikut ini dua contoh.
Melewati Data Maju
Aktifitas utama
startActivity
.MainActivity.java
Aktivitas kedua
getIntent()
untukIntent
memulai aktivitas kedua. Kemudian Anda dapat mengekstrak data dengangetExtras()
dan kunci yang Anda tetapkan dalam aktivitas pertama. Karena data kami adalah String, kami hanya akan menggunakan digetStringExtra
sini.SecondActivity.java
Melewati Data Kembali
Aktifitas utama
startActivityForResult
, berikan kode hasil yang sewenang-wenang.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.)Intent
. Data diekstraksi menggunakan pasangan kunci-nilai. Saya dapat menggunakan string apa pun untuk kunci tetapi saya akan menggunakan yang sudah ditentukan sebelumnyaIntent.EXTRA_TEXT
karena saya mengirim teks.MainActivity.java
Aktivitas kedua
Intent
. Data disimpan dalamIntent
menggunakan pasangan kunci-nilai. Saya memilih untuk menggunakanIntent.EXTRA_TEXT
kunci saya.RESULT_OK
dan tambahkan maksud menyimpan data Anda.finish()
untuk menutup Aktivitas Kedua.SecondActivity.java
sumber
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
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.
sumber
Coba lakukan hal berikut:
Buat kelas "pembantu" sederhana (pabrik untuk Maksud Anda), seperti ini:
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:
Dalam aktivitas Anda. Saat Anda ingin "menyimpan" beberapa data dalam "sesi" cukup gunakan yang berikut ini:
Dan kirimkan Intent ini. Dalam Kegiatan target, bidang Anda akan tersedia sebagai:
Jadi sekarang kita bisa menggunakan Intent seperti sesi lama yang sama (seperti di servlets atau JSP ).
sumber
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-
dan dapatkan hasilnya di NextActivity seperti-
Sekarang Anda cukup menggunakan objek foo seperti yang akan Anda gunakan.
sumber
Cara lain adalah dengan menggunakan bidang statis publik tempat Anda menyimpan data, yaitu:
sumber
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,
Anda juga harus mengimpor
Kemudian di Acitvity berikutnya (SecondActivity), Anda harus mengambil data dari maksud menggunakan kode berikut.
sumber
Anda bisa menggunakan
SharedPreferences
...Penebangan. Id sesi penyimpanan waktu di
SharedPreferences
Keluar. Waktu ambil id sesi dalam preferensi bersama
Jika Anda tidak memiliki id sesi yang diperlukan, maka hapus preferensi yang dibagikan:
Itu sangat berguna, karena suatu saat Anda menyimpan nilai dan kemudian mengambil aktivitas di mana saja.
sumber
Pendekatan standar.
Sekarang dalam aktivitas kedua Anda mengambil data Anda dari bundel:
Dapatkan bundelnya
Ekstrak data ...
sumber
i.putExtras()
/getIntent().getString()
yang diusulkan oleh 6 jawaban lain ...Dari Aktivitas
Ke Aktivitas
sumber
Bundle
Pendekatan berbasis sudah diusulkan oleh PRABEESH RK pada 2012 dan Ajay Venugopal , Krishna . Dan dapat direduksi menjadii.putExtras()
/getIntent().getString()
yang diusulkan oleh 8 jawaban lain ...Anda dapat mengirim data antara aktivitas menggunakan objek maksud. Anggap Anda memiliki dua kegiatan yaitu
FirstActivity
danSecondActivity
.Di dalam FirstActivity:
Menggunakan Intent:
Di dalam SecondActivity
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")
dllsumber
Bundle
Pendekatan berbasis sudah diusulkan oleh PRABEESH RK pada 2012 dan Ajay Venugopal . Dan dapat direduksi menjadii.putExtras()
/getIntent().getString()
yang diusulkan oleh 7 jawaban lain ...Jika Anda ingin mentransfer bitmap antara Activites / Fragments
Aktivitas
Untuk melewatkan bitmap antara Activites
Dan di kelas Activity
Pecahan
Untuk melewatkan bitmap antara Fragmen
Untuk menerima di dalam SecondFragment
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
Dan di SecondActivity
sumber
Anda dapat mengambilnya di aktivitas lain. Dua arah:
Cara kedua adalah:
sumber
Ini adalah praktik terbaik saya dan sangat membantu ketika proyek ini besar dan kompleks.
Misalkan saya punya 2 kegiatan,
LoginActivity
danHomeActivity
. Saya ingin meneruskan 2 parameter (nama pengguna & kata sandi) dariLoginActivity
keHomeActivity
.Pertama, saya buat
HomeIntent
Inilah cara saya meneruskan data di LoginActivity saya
Langkah terakhir, berikut adalah cara saya menerima data
HomeActivity
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.
sumber
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_*
kunciAktivitas pertama
Aktivitas kedua:
Contoh 2: Menentukan
static final
kunci Anda sendiriJika salah satu dari
Intent.EXTRA_*
String tidak sesuai dengan kebutuhan Anda, Anda dapat menentukan sendiri di awal aktivitas pertama.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:
Aktivitas kedua:
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
Aktivitas pertama
Aktivitas kedua
sumber
Kamu bisa menggunakan
Intent
Cara lain bisa menggunakan pola singleton juga:
Dari FirstActivity Anda
Di SecondActivity
sumber
Pengoperan data antar aktivitas terutama melalui objek yang dimaksudkan.
Pertama, Anda harus melampirkan data ke objek maksud dengan menggunakan
Bundle
kelas. Kemudian panggil aktivitas menggunakan salah satustartActivity()
ataustartActivityForResult()
metode.Anda dapat menemukan informasi lebih lanjut tentang itu, dengan contoh dari posting blog Melewati data ke suatu Aktivitas .
sumber
Intent#putExtra()
). Tetapi menambahkan yang lainBundle
dan membuat segalanya lebih rumit.Anda dapat mencoba Preferensi Bersama, ini mungkin merupakan alternatif yang baik untuk berbagi data di antara berbagai kegiatan
Untuk menyimpan id sesi -
Untuk mendapatkan mereka -
sumber
Mulai aktivitas lain dari parameter lulus aktivitas ini melalui Bundle Object
Ambil aktivitas lain (YourActivity)
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
Anda dapat menggunakan Gson lib yang disediakan oleh google untuk membuat serial data yang kompleks seperti ini
sumber
Kotlin
Lulus dari Aktivitas Pertama
Dapatkan di Aktivitas Kedua
Saran
Selalu masukkan kunci dalam file konstan untuk cara yang lebih terkelola.
sumber
sumber
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:name
atribut untuk menggunakan kelas aplikasi Anda sendiri.MyApplication.java
Gunakan ini sebagai pemegang referensi global. Ini berfungsi dengan baik dalam proses yang sama.
MainActivity.java
Tetapkan referensi "singleton" global ke instance aplikasi.
MyPreferences.java
Contoh sederhana di mana saya menggunakan aktivitas utama dari instance aktivitas lain.
sumber
Saya baru-baru ini merilis Vapor API , kerangka kerja Android rasa jQuery yang membuat segala macam tugas seperti ini lebih sederhana. Seperti disebutkan,
SharedPreferences
adalah salah satu cara Anda bisa melakukan ini.VaporSharedPreferences
diimplementasikan 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: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 padaVaporIntent
:Dan berikan sebagai tambahan, sebagaimana disebutkan dalam jawaban lain. Anda dapat mengambil ekstra dari Anda
Activity
, dan selanjutnya jika Anda menggunakanVaporActivity
ini dilakukan untuk Anda secara otomatis sehingga Anda dapat menggunakan:Untuk mengambilnya di ujung lain dalam
Activity
Anda beralih ke.Berharap itu menarik bagi sebagian orang :)
sumber
Aktivitas pertama:
Aktivitas kedua:
sumber
Anda dapat mengirimkan data antar aktivitas dalam aplikasi dalam 3 cara
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
sumber
Gunakan kelas global:
Anda dapat memanggil setter dan getter dari kelas ini dari semua kelas lainnya. Lakukan itu, Anda perlu membuat GlobalClass-Object di setiap Aktitas:
Maka Anda dapat menelepon misalnya:
sumber