Penyampaian data kompleks niat
Pengenalan kepada bahagian ini:
Dalam bahagian sebelumnya kita mempelajari beberapa kegunaan asas Niat dan mempelajari tentang tujuh sifat Niat, Niat eksplisit dan Niat Tersirat, dan cara menyesuaikan Niat tersirat, dan akhirnya memberikan anda beberapa Niat sistem yang biasa digunakan! Perkara yang akan diterangkan oleh bahagian ini kepada anda ialah masalah penghantaran data Niat~Baiklah, mari mulakan bahagian ini~
1 Niat lulus data ringkas
Juga Ingat bagaimana kita belajar dalam Aktiviti bagaimana untuk menghantar data mudah antara satu sama lain antara dua Aktiviti?
Anda boleh menyimpan data secara terus dengan memanggil kaedah putExtra() Niat, dan kemudian memanggil getXxxExtra selepas mendapat Niat. Jenis data yang sepadan; jika berbilang diluluskan, anda boleh menggunakan objek Bundle sebagai bekas dan mula-mula memindahkan data dengan memanggil putXxx Bundle Simpannya dalam Bundle, kemudian panggil putExtras() kaedah Niat untuk menyimpan Bundle dalam Niat, dan kemudian selepas mendapatkan Niat, Panggil getExtras() untuk mendapatkan bekas Bundle, dan kemudian panggil getXXXnya untuk mendapatkan data yang sepadan! Selain itu, storan data agak serupa dengan <kunci, nilai> Peta!
2. Niat melepasi tatasusunan
Hei, jenis biasa tiada masalah, tetapi bagaimana jika ia adalah tatasusunan? Penyelesaiannya adalah seperti berikut:
Tulis ke dalam tatasusunan:
//Anda boleh menukar StringArray kepada jenis data lain, seperti int, float, dll...
Baca tatasusunan:
3. Niat melepasi koleksi
Nah, tatasusunan adalah sangat mudah Okay, kemudian mari kita lulus koleksi sekali lagi~ Ini adalah lebih rumit sedikit, dan ia akan dikendalikan mengikut situasi:
1) Senaraikan<Jenis data asas atau String>
Tulis koleksi:
intent.putIntegerArrayListExtra(nama, nilai)
Baca Koleksi:
intent.getIntegerArrayListExtra(name)
<🎜 2) Senaraikan< Objek>
Paksa senarai menjadi jenis Boleh Bersiri dan kemudian masukkannya (Bundle boleh digunakan sebagai medium)
Tulis ke dalam koleksi:
Baca koleksi:
PS: Kelas Object perlu melaksanakan antara muka Serializable
3) Map<String, Object>, atau lebih kompleks
Penyelesaiannya ialah :Balut Senarai dalam lapisan luar
Peta<String, Objek> map1 = HashMap<String, Object>();
map1.put("key1", "value1");
map1.put("key2", "value2"); Map<String , Object>>();
list.add(map1);
Intent intent = new Intent(); ;
Bundle bundle = new Bundle();
//Senarai mesti ditakrifkan untuk lulus ArrayList<Object> Ini perlu
ArrayList bundlelist = baharu ArrayList() ;
bundlelist.add(list);
bundle.putParcelableArrayList("list",bundlelist); >
Terdapat dua cara untuk menghantar objek: menukar objek menjadi rentetan Json atau bersiri melalui Serializable atau Parcelable Ia tidak disyorkan untuk menggunakan penghurai Json terbina dalam Android Anda boleh menggunakan pustaka pihak ketiga fastjson atau Gson.
1) Tukar objek kepada rentetan Json
Contoh penghuraian Gson: Model:
Pengarang kelas awam{ id int peribadi; nama Rentetan peribadi;
//...}Pengarang kelas awam{
int peribadi id;}
Tulis data:
Buku buku =new Book();
book.setTitle("Java Programming Thoughts");
author setName("Bruce Eckel");book.setAuthor(author);Intent intent=new Intent(this,SecondActivity.class);
intent.putExtra("book",new Gson(). toJson(book) );读取数据:
Book book=new Gson().fromJson(bookJson ,Book.class);
Log.d(TAG,"tajuk buku->"+book.getTitle());
Log.d(TAG,"nama pengarang buku->"+buku. getAuthor().getName());
2) Gunakan Serializable, Parcelable untuk mensirikan objek
1. Pelaksanaan Serializable:
①Business Bean implementasi: Serializable Interface. , tulis kaedah getter dan setter
②Intent lulus dalam contoh objek dengan memanggil putExtra(Nama rentetan, nilai boleh bersiri) Sudah tentu, jika terdapat berbilang objek, kita juga boleh terlebih dahulu Bundle.putSerializable(x,x);
③Aktiviti baharu memanggil kaedah getSerializableExtra() untuk mendapatkan contoh objek: cth:Product pd = (Product) getIntent().getSerializableExtra("Product");
④Panggil kaedah dapatkan objek untuk mendapatkan parameter yang sepadan
2 pelaksanaan:
Proses umum:
Beberapa penjelasan:①Business Beans mewarisi antara muka Parcelable, mengatasi kaedah writeToParcel dan bersiri objek anda menjadi objek Parcel;
② Tulis semula kaedah describeContents, penerangan antara muka kandungan, pulangkan 0 secara lalai , sudah tentu, jika terdapat berbilang objek, kita boleh dahulu Letakkan Bundle.putParcelable(x,x) dalam Bundle, dan kemudian Intent.putExtras() boleh
Dengan writeToParcel Map objek anda ke dalam objek Parcel, dan kemudian petakan objek Parcel melalui createFromParcel menjadi objek anda. Anda juga boleh menganggap Parcel sebagai strim, dan menulis objek ke dalam strim melalui writeToParcel. Membaca objek daripada strim melalui createFromParcel, tetapi proses ini memerlukan anda untuk melaksanakannya, jadi tulis Susunan dan susunan bacaan mestilah konsisten.
Contoh kod untuk melaksanakan antara muka Parcelable:
Android Studio menjana pemalam Parcleable: Pemalam Intellij/Andriod Studio android-parcelable-intellij-plugin
Selagi ALT+Insert, anda boleh terus menjana kod antara muka Parcleable. Selain itu: Objek parcelable digunakan secara meluas dalam Android, dan melaksanakan antara muka Parcable sangat menyusahkan anda
Rangka kerja sumber terbuka pihak ketiga: Parceler, saya belum mencubanya lagi kerana masalah dengan Maven. Alamat rujukan: [Dijana secara automatik oleh Android Parcelable] 3 Perbandingan dua kaedah bersiri: Perbandingan antara. dua: bitmap melaksanakan antara muka Parcelable secara lalai dan boleh dihantar terus Kod pelaksanaan: Jika anda menghantar data mudah dan terdapat permintaan sedemikian, Aktiviti1 -> Aktiviti3 - >
Anda ingin menghantar data tertentu dalam Aktiviti ke Aktiviti4, bagaimana untuk melakukannya? Bolehkah anda menghantarnya dari halaman ke halaman? Jelas sekali tidak saintifik, bukan? Jika anda mahu data tertentu tersedia di mana-mana, anda boleh mempertimbangkan untuk menggunakan objek global Aplikasi! Sistem Android mencipta objek Aplikasi apabila setiap program sedang berjalan, dan hanya satu akan dibuat, jadi Aplikasi
Ia adalah kelas dalam corak tunggal, dan kitaran hayat objek Aplikasi adalah yang paling lama dalam keseluruhan program.
Tempohnya adalah sama dengan kitaran hayat program ini. Jika anda ingin menyimpan lebih banyak nilai statik (tetap dan tidak boleh diubah, tetapi juga boleh diubah), jika anda ingin menggunakan
Aplikasi memerlukan kelas tersuai untuk melaksanakan kelas Aplikasi dan memberitahu sistem bahawa Aplikasi tersuai kami yang digunakan.
Daripada lalai sistem, langkah ini ialah menambah: atribut nama pada teg aplikasi kami dalam AndroidManifest.xml! Bahagian utama kod: 1) Kelas Aplikasi Tersuai: 2) Kenyataan dalam AndroidManifest.xml: 3) Panggil jika perlu: Penulisan definisi tinggi Applicaiton ialah komponen sistem. Ia juga mempunyai kitaran hayatnya sendiri. Kita boleh mendapatkannya di onCraete
Objek aplikasi. Siarkan kod yang diubah suai! Kemudian kami boleh terus menghubungi: MyApp.getInstance() di mana-mana sahaja untuk mendapatkan objek global Aplikasi! Nota: Objek Aplikasi wujud dalam ingatan, dan ia mungkin dimatikan oleh sistem, seperti Senario ini: Kami menyimpan akaun pengguna dalam aplikasi dalam Activity1, dan kemudian mendapatkan akaun pengguna dalam Activity2 dan memaparkannya! Jika kita mengklik butang utama dan kemudian menunggu lama, sistem akan mematikan aplikasi kita untuk menuntut semula memori. Pada masa ini, kami kembali
Buka aplikasi ini, sungguh ajaib pada masa ini, anda kembali ke halaman Activity2, tetapi jika anda mendapat Aplikasi sekali lagi pada masa ini
Jika akaun pengguna dimasukkan, atur cara akan melaporkan NullPointerException dan kemudian ranap~ Sebab ranap sistem di atas berlaku adalah kerana objek Aplikasi baru dibuat Anda mungkin berfikir bahawa Apl dimulakan semula.
Sebenarnya, tidak, hanya buat Aplikasi baharu, dan kemudian mulakan Aktiviti apabila pengguna pergi terakhir kali, dengan itu mencipta Apl
Tiada ilusi untuk dibunuh! Oleh itu, jika ia adalah data yang lebih penting, anda disyorkan untuk menyetempatkannya Selain itu, apabila menggunakan data tersebut
Periksa nilai pembolehubah untuk tidak batal! Perkara lain ialah: ini bukan sahaja benar untuk pembolehubah Aplikasi, tetapi juga untuk objek tunggal dan pembolehubah statik awam.
Ia juga akan menjadi seperti ini~ Aplikasi di atas adalah berdasarkan satu ciri mod tunggal bahawa ia boleh memastikan bahawa kelas sistem A mempunyai tepat satu contoh.
Ini sangat mudah dicapai, menetapkan parameter dalam A dan mengaksesnya terus dalam B. Ini adalah yang paling berkesan daripada beberapa kaedah. Contoh kod: (kod datang daripada Internet~) ①Tentukan kelas tunggal :
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel parcel, int flags){ <🎜 tulis saya
parcel.writeString(pengarang);
parcel.writeInt(publishTime);
}
statik awam akhir Parcelable.Creator<Book> PENCIPTA = Pencipta baharu<Buku>() {
@Override
Buku awam[] newArray(int saiz) {
kembali baharu [saiz];
}
@Override
Buku awam buatDariParcel(sumber Parcel) {
mBook.bookName = source.readString();
mBook.author = source.readString();
mBook.publishTime = source.readInt();
kembali mBook;
}
};5. Niat melepasi Bitmap
Intent intent = new Intent();
Bundle bundle = new Bundle();
bundle.putParcelable("bitmap", bitmap) ;
intent.putExtra("bundle", bundle);6 Menyusahkan untuk menyampaikannya, tentukan data global secara langsung
private String myState;
public String getState(){
return myState;
}
public void setState(String s){
myState = s;
}
}
android:label="@string/app_name">
@Override
public void onCreate(Bundle b){
...
MyApp appState = ((MyApp)getApplicationContext());
Keadaan rentetan = appState.getState();
...
}
}
Private String myState;
private static MyApp instance;
public static MyApp getInstance(){
return instance;
}
public String getState(){
return myState;
}
public void setState(String s){
myState = s;< }< 🎜 🎜>
@Override
public void onCreate(){
onCreate();
instance = this;
}
}7. Parameter mod Singleton melepasi
{
//Kejadian mod tunggal
statik peribadi Cipta tika
awam disegerakkan statik XclSingleton getInstance(){
jika(contoh == null){
contoh = new XclSingleton();
}
kembalikan contoh;
}
HashMap<String, Object> mMap; 🎜> }
public void put(String key,Object value){
mMap.put(key,value);
}
public Object get(String key)
{
kembalikan mmM ap.get (kunci);
}
("key1", "value1");
XclSingleton.getInstance().put("key2", "value2");
Ringkasan bahagian ini:
Baiklah, itu sahaja tentang penghantaran data kompleks Niat Selain menggunakan Niat untuk menghantar data yang kompleks, bahagian ini juga mengajar anda
Gunakan corak Aplikasi dan tunggal untuk lulus parameter! Saya percaya ia akan membawa kemudahan kepada semua orang dalam penghantaran data, terima kasih~