Navigasi di dalam aplikasi Android

Pendahuluan


Dengan pengembangan Android, kami menggunakan berbagai solusi (pola) arsitektur. Sebagai contoh, Mvp , Mvvm , Mvi , dll ... Masing-masing pola ini memecahkan beberapa masalah penting, dan karena mereka tidak sempurna, mereka meninggalkan kita beberapa masalah yang belum terpecahkan. Sebagai contoh, tugas-tugas ini termasuk menavigasi dalam aplikasi (perutean), mentransfer informasi dari layar ke layar (berbicara layar, maksud saya Kegiatan, Fragmen atau Melihat), Menyimpan keadaan aplikasi ketika mengubah konfigurasi (perubahan konfigurasi).


Di perusahaan kami, kami juga menghadapi masalah ini, beberapa diselesaikan dengan cara yang mudah, tetapi yang pertama tidak menemukan solusi spesifik, setelah mencoba berbagai metode untuk menyelesaikannya, kami menulis perpustakaan Flowzard kami sendiri.


Tantangan


Di perusahaan kami, kami menggunakan arsitektur Mvp . Agar memiliki fleksibilitas maksimum saat menampilkan, mengubah, dan mentransfer data antar layar, kami mencoba mengikuti prinsip yang disebut Prinsip tanggung jawab tunggal . Prinsipnya menyatakan bahwa setiap modul harus menyelesaikan masalah tertentu. Dalam kasus kami, layar harus diisolasi dari tugas global dan harus menyelesaikan tugas spesifiknya untuk menunjukkan / menerima informasi. Dia seharusnya tidak tahu tentang layar lain sama sekali. Sehingga kami dapat mencapai fleksibilitas maksimal. Di bawah ini adalah contoh pengaturan dan penggunaan perpustakaan.


Flowzard


Buat aliran


class MainFlow(flowManager: FlowManager) : Flow(flowManager) { //      flow override fun onCreate(savedInstance: DataBunch?, data: DataBunch?) { super.onCreate(savedInstance, data) } } 

Buat flow navigator


Navigator melakukan dua fungsi: Buat wadah aliran (Aktivitas, Fragmen, Tampilan) untuk transisi antara aliran dan layar untuk transisi di dalam aliran.


 class DefaultFlowNavigator(activity: AppCompatActivity) : SimpleFlowNavigator(activity){ //    flow  Activity override fun getActivityIntent(id: String, data: Any?): Intent { return when (id) { Flows.SIGN_UP -> Intent(activity, SignupActivity::class.java) else -> throw RuntimeException("Cannot find activity for id=$id") } } } 

Jepret ke Aktivitas


Untuk mengaitkan Aktivitas dengan Flow, kami mewarisi FlowActivity dan menyediakan Navigator, dalam kasus kami DefaultFlowNavigator.


 class MainActivity : FlowActivity() { override val navigator: Navigator get() = DefaultFlowNavigator(this) } 

Buat FlowManager


 class DefaultFlowManager : FlowManager() { //    (main) flow override fun createMainFlow(): Flow { return MainFlow(this) } //    flow override fun createFlow(id: String): Flow { return when (id) { Flows.SIGN_UP -> SignupFlow(this) else -> throw RuntimeException("Cannot find flow for id=$id") } } } //   FlowManager  Application class App : Application(), FlowManagerProvider { private val flowManager = DefaultFlowManager() override fun getProvideManager(): FlowManager { return flowManager } } 

Perpesanan antara aliran dan layar


Ketika Anda mengklik tombol login, aktivitas mengirim pesan ke aliran utama. Flow membuat aliran SIGN_UP dan menunggu respons darinya. Jika login berhasil, aliran SIGN_UP mengirimkan hasilnya ke aliran utama dan onFlowResult: MainFlow dipanggil dengan kode dan objek hasil. Aliran utama memeriksa apakah hasilnya benar kemudian mengirim pesan kembali ke aktivasi yang telah berhasil dilakukan pengguna.


 class MainFlow(flowManager: FlowManager) : Flow(flowManager) { companion object { const val LOGIN_REQUEST_CODE = 1 } //     override fun onMessage(code: String, message: Any) { super.onMessage(code, message) if (code == "main" && message == "login") { newFlow(Flows.SIGN_UP, LOGIN_REQUEST_CODE) } } //       flow override fun onFlowResult(requestCode: Int, result: Result) { super.onFlowResult(requestCode, result) if (requestCode == LOGIN_REQUEST_CODE && result is Result.SUCCESS) { sendMessageFromFlow("main", true) } } } class MainActivity : FlowActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) loginButton.setOnClickListener { //   β€œlogin”   β€œmain” flow.sendMessage("main", "login") } //     β€œmain” setMessageListener("main") { if (it is Boolean && it) { statusTextView.text = "Logined" } } } } 

Menyimpan keadaan saat mengubah konfigurasi atau ketika suatu proses menghentikan sistem operasi


Karena Android menyimpan tumpukan Aktivitas dan Fragmen, aliran yang dibuat dengan wadah ini akan menyimpan dan memulihkan keadaannya. Dengan wadah Lihat, Anda harus menulis FlowManager khusus Anda karena perpustakaan belum memiliki manajer seperti itu. Di pembaruan berikutnya akan ada fitur untuk menyimpan data antara dari aliran.


Karena saya tidak ingin banyak kode dalam artikel, saya akan membatasi diri pada contoh ini. Berikut ini tautan ke repositori untuk studi terperinci tentang perpustakaan.

Source: https://habr.com/ru/post/id435248/


All Articles