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?

1.png

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:

bd.putStringArray("StringArray", new String[]{"haha" ," Haha"});
//Anda boleh menukar StringArray kepada jenis data lain, seperti int, float, dll...

Baca tatasusunan:

String[] str = bd.getStringArray("StringArray")

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.putStringArrayListExtra(nama, nilai)
intent.putIntegerArrayListExtra(nama, nilai)

Baca Koleksi:

intent.getStringArrayListExtra(name)
intent.getIntegerArrayListExtra(name)

<🎜 2) Senaraikan< Objek>

Paksa senarai menjadi jenis Boleh Bersiri dan kemudian masukkannya (Bundle boleh digunakan sebagai medium)

Tulis ke dalam koleksi:

putExtras(key, ( Serializable)list)

Baca koleksi:

(Senarai<Objek> ;) getIntent().getSerializable(key)

PS: Kelas Object perlu melaksanakan antara muka Serializable


3) Map<String, Object>, atau lebih kompleks

Penyelesaiannya ialah :Balut Senarai dalam lapisan luar

//Lepasi parameter yang lebih kompleks
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;
nama Rentetan peribadi;
//...
}



Tulis data:



Buku buku =new Book();
book.setTitle("Java Programming Thoughts");
Author author=new Author();
author.setId(1);

author setName("Bruce Eckel");book.setAuthor(author);Intent intent=new Intent(this,SecondActivity.class);

intent.putExtra("book",new Gson(). toJson(book) );
startActivity(niat);

读取数据:

String bookJson=getIntent().getStringExtra("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:

①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

Beberapa penjelasan:

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:

//Antara Muka Penerangan Dalaman, Anda tidak perlu  mengurus   
@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;  
    }  
};

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:

  • 1) Apabila menggunakan memori, Parcelable mempunyai prestasi yang lebih tinggi daripada Serializable, jadi disyorkan untuk menggunakan Parcelable.
  • 2) Boleh bersiri akan menjana sejumlah besar pembolehubah sementara semasa penyirian, menyebabkan GC kerap.
  • 3) Parcelable tidak boleh digunakan apabila data hendak disimpan pada cakera, kerana Parcelable tidak dapat menjamin integriti data. Kesinambungan dalam menghadapi perubahan dunia luar. Walaupun Serializable kurang cekap, masih disyorkan untuk menggunakan Serializable pada masa ini.

5. Niat melepasi Bitmap

bitmap melaksanakan antara muka Parcelable secara lalai dan boleh dihantar terus

Kod pelaksanaan:

Bitmap bitmap = null;
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

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:

kelas MyApp melanjutkan Aplikasi {
private String myState;
public String getState(){
return myState;
}
public void setState(String s){
myState = s;
}
}

2) Kenyataan dalam AndroidManifest.xml:

<application android:name=".MyApp" android: icon ="@drawable/icon"
android:label="@string/app_name">

3) Panggil jika perlu:

kelas Blah melanjutkan Aktiviti {
@Override
public void onCreate(Bundle b){
...
MyApp appState = ((MyApp)getApplicationContext());
Keadaan rentetan = appState.getState();
...
}
}

Penulisan definisi tinggi

: Objek global Aplikasi boleh diperolehi di mana-mana lokasi.


Applicaiton ialah komponen sistem. Ia juga mempunyai kitaran hayatnya sendiri. Kita boleh mendapatkannya di onCraete Objek aplikasi. Siarkan kod yang diubah suai!

MyApp kelas melanjutkan Aplikasi {
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;
}

}

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~


7. Parameter mod Singleton melepasi

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 :

kelas awam XclSingleton
{
//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~