Android: Apa yang lebih baik - banyak aktivitas atau berpindah tampilan secara manual?

115

Saya telah mengembangkan beberapa aplikasi untuk Android, dan pertanyaan ini selalu muncul:

Bagaimana cara menyusun UI saya? Haruskah saya meluncurkan aktivitas setelah aktivitas dan meninggalkan ponsel untuk membuat tombol "kembali", atau haruskah saya memilih yang lebih dioptimalkan, tetapi lebih rumit untuk diterapkan, dengan cara beralih Tampilan secara manual dan kemudian secara manual melakukan fungsi tombol "Kembali"?

Menurut Anda (atau ketahui) apa praktik yang lebih baik?

Danail
sumber
4
Untuk pembaca baru, harap perhatikan bahwa pertanyaan ini cukup lama, dan saat ini pertanyaannya lebih cenderung berupa "banyak fragmen atau beberapa aktivitas", daripada "beberapa tampilan atau aktivitas ganda". Lihat PEMBARUAN di stackoverflow.com/a/10794086/199364 . Selain itu, google untuk topik stackoverflow lain tentang fragmen vs aktivitas - banyak jawaban bagus.
ToolmakerSteve

Jawaban:

99

Saya akan mengatakan bahwa beberapa Aktivitas hampir selalu lebih masuk akal. Saya hanya berpikir Android tidak dirancang untuk terus-menerus berpindah tampilan - Anda kehilangan banyak hal. Anda harus mengimplementasikan Back sendiri, Anda tidak mendapatkan transisi antar-Aktivitas, Anda harus menerapkan banyak logika internal untuk melanjutkan aplikasi dalam keadaan yang benar. Jika Anda tidak mempartisi aplikasi Anda menjadi Aktivitas, itu akan membuat jauh lebih sulit nantinya untuk mengubah aliran aplikasi Anda. Ini juga menghasilkan satu mega-Aktivitas yang bisa jauh lebih sulit untuk ditangani daripada banyak potongan kode yang lebih kecil.

Saya kesulitan membayangkan bahwa kecepatan benar-benar menjadi masalah; jika ya, maka ada yang salah dengan cara Anda menginisialisasi setiap Aktivitas. Sebagai contoh, saya mencoba untuk melewatkan objek Serializable antara Aktivitas, dan itu terbukti sangat lambat; ketika saya beralih ke metode yang lebih cepat untuk mengoper objek, kecepatan peluncuran Aktivitas meningkat pesat.

Selain itu, saya pikir ini memberi tahu bahwa pedoman Android untuk Aktivitas dan Desain Tugas tidak menyebutkan peralihan Tampilan sama sekali; itu berpusat di sekitar desain Activity-as-View.

Dan Lew
sumber
5
Hanya untuk menyebutkan, bahwa saya telah melihat beberapa aplikasi hebat akhir-akhir ini (misalnya Pulse) yang menggunakan animasi dan transfer lancar antara Tampilan mereka yang berbeda, semuanya dalam satu Aktivitas.
Danail
3
Saya setuju dengan Anda tetapi banyak efek visual yang hanya tersedia antara transisi tampilan dan bukan antara aktivitas yang mendorong masalah yang muncul antara ergo dan pengkodean yang bagus
AsTeR
Ini adalah topik yang sangat menarik. Saya saat ini memiliki aplikasi yang pada akhirnya akan mengimplementasikan 4 tampilan. Saya melakukan semuanya dalam 1 aktivitas yang menghasilkan "Aktivitas Besar" yang dinyatakan dalam jawaban ini. Saya melakukannya terutama untuk membuat aplikasi saya terlihat dan terasa PERSIS seperti aplikasi iOS. Saya setuju bahwa berat itu tergantung pada apa yang Anda coba capai. Pertanyaan Hebat, dan Jawaban +1 :-)
terompet
Membuat UI iOS adalah ide yang buruk. Hvis sendiri adalah alasan yang salah untuk tidak menggunakan banyak kegiatan.
slott
3
@Daniel: Saat saya beralih ke metode yang lebih cepat untuk mengoper objek, kecepatan peluncuran Aktivitas meningkat pesat. Bisakah Anda memberikan beberapa detail tambahan atau materi referensi untuk hal yang sama?
Bhargav Jhaveri
21

Saya ingin menunjukkan beberapa contoh ketika satu aktivitas mungkin merupakan desain yang lebih baik untuk aplikasi Android yang memiliki lebih dari satu Tampilan layar penuh:

  • Jika layar aplikasi digabungkan dengan erat dan berbagi Objek umum tempat semuanya beroperasi. Dalam kasus ini, mengedarkan Objek mungkin memerlukan Bundel dan dapat rawan kesalahan karena akan ada salinannya. Contoh yang bagus mungkin adalah seorang penyihir . Ya, Anda dapat menggunakan statis untuk mengakses Objek umum tetapi statis dapat berbahaya di Android (pikirkan perubahan konfigurasi!)

  • Jika Anda menginginkan animasi yang sangat keren di antara layar. Mungkin Anda ingin burung lepas landas di satu layar dan mendarat di layar lain. Coba lakukan itu ketika setiap layar adalah aktivitas!

Di sisi lain, jika salah satu layar Anda dirancang untuk ditampilkan oleh sejumlah aplikasi lain, maka layar itu haruslah Aktivitasnya sendiri.

UPDATE Maret 2014:

Pada titik ini pertanyaannya sekarang harus mencakup pilihan Fragmen. Menurut saya, Views mungkin adalah pilihan yang paling tidak mungkin dari 3: Aktivitas, Fragmen, Tampilan. Jika Anda ingin mengimplementasikan layar yang menggunakan tombol kembali maka itu harus Activties atau Fragments karena keduanya menangani tombol kembali secara native. Fragmen perlu ditambahkan ke tumpukan belakang FragmentManager agar tombol kembali berfungsi. Mengelola fragmen, dialog, dan back-stack bisa jadi sedikit mengganggu!

UPDATE Sept 2018:

Beberapa pengembang di Google merekomendasikan aplikasi aktivitas tunggal menggunakan komponen arsitektur navigasi baru .

satur9nine
sumber
TERIMA KASIH telah menambahkan UPDATE untuk membicarakan tentang Fragmen. Sangat setuju bahwa pilihan penting hari ini adalah kapan menggunakan Fragmen vs Aktivitas.
ToolmakerSteve
11

Ingat juga bahwa mengimplementasikan aplikasi Anda dengan beberapa Activitiesakan memberikan pengalaman yang lebih koheren kepada pengguna dengan platform secara keseluruhan. Sebagian dari pengalaman akan dibentuk dengan menggunakan aplikasi Google bawaan, sehingga pengguna mungkin akan lebih mudah menggunakan aplikasi Anda jika perilakunya mirip dengan yang sudah diinstal di ponsel.

Erich Douglass
sumber
4

Berbeda dari yang lain saya menggunakan campuran keduanya, misalnya,
1. Ada menu utama saat aplikasi dijalankan
2. Anda klik pada pencarian, membawa Anda ke aktivitas pencarian
3. Lalu ada tombol filter, yang hanya mengalihkan tampilan dan pertunjukan Anda memfilter opsi
4. Ada dua tombol di akhir tampilan filter, Anda menekan "Cari" atau "Batal" dan Anda kembali ke Tampilan Pencarian lagi (tanpa mengalihkan aktivitas)
5. Sekarang jika pengguna menekan telepon kembali tombol dia dibawa kembali ke menu utama alih-alih opsi filter pencarian. Yang saya kira adalah perilaku yang benar.

Gunakan dengan cara yang akan membuat pengguna merasa alami. Dan menyimpan semuanya dalam satu aktivitas akan membuatnya kompleks.

happyhardik
sumber
3

Itu semua tergantung pada aplikasi, apa yang Anda coba untuk mencapai kinerja yang lebih baik, UI yang lebih halus. IMHO Saya lebih suka pendekatan kedua untuk mengendalikan Kegiatan secara manual meskipun itu lebih kompleks seperti yang Anda nyatakan. Ini adalah pendekatan yang telah saya gunakan dalam proyek tab android saya, Anda juga mungkin ingin melihat kelas yang disebut ActivityGroup (tidak yakin paketnya) yang memungkinkan Anda memiliki banyak aktivitas yang dapat Anda alihkan, hal yang baik tentang kelas ini adalah aktivitas Anda tidak diturunkan saat Anda beralih, tetapi hal buruknya adalah perlu waktu lebih lama untuk memuat aplikasi utama Anda.

Hanya pendapat saya.

Greg
sumber
1

Masalah dengan berpindah tampilan, yang saya temukan, juga disebabkan oleh pengumpul sampah. Tampaknya GC dipicu saat Anda keluar dari aktivitas, bukan tampilan. Jadi, mengubah tab dengan tampilan turunan yang cukup kompleks, misalnya, hampir pasti akan menyebabkan pengecualian stack overflow ..

zorglub76
sumber
3
StackOverflowError cukup banyak hanya terjadi di Java jika Anda memiliki rekursi tak terbatas, mungkin Anda memikirkan OutOfMemoryError? Sebagai programmer Java, Anda tidak perlu khawatir tentang kapan atau di mana pengumpul sampah dipicu.
satur9nine
2
di android stackoverflow terjadi jika hierarki tampilan terlalu dalam.
Danail
0

Saya telah mengalami begitu banyak masalah dengan beberapa layout aktivitas sehingga saya sangat tidak menyarankannya, kecuali jika ada alasan bagus untuk memilihnya.

Kerugian dari banyak aktivitas

Menggunakan banyak aktivitas, sangat sulit untuk memfaktor ulang kode untuk mengembalikan data dari aktivitas.

Jika Anda memanggil 'sub'-aktivitas maka aktivitas utama mungkin dimatikan. Tetapi Anda tidak pernah mengalaminya saat men-debug pada perangkat yang layak, oleh karena itu Anda harus selalu menangani status penyimpanan dan status pemulihan dengan benar. Itu menyakitkan. Bayangkan memanggil metode pada sebuah pustaka (mis. Aktivitas lain), dan Anda harus memastikan bahwa ketika metode itu mengembalikan, aplikasi Anda harus dapat membuat ulang statusnya sepenuhnya dengan semua bidang pada semua objek di VM (mis. Aktivitas. restoreIntance). Ini gila.

Begitu pula sebaliknya, saat Anda membuka subaktivitas, VM mungkin telah dimatikan sejak subaktivitas pertama kali muncul, seperti saat aplikasi diminimalkan saat subaktivitas ditampilkan.

Jauh lebih bersih hanya memiliki satu tempat untuk menyimpan status aplikasi yang relevan, dan dalam kasus saya, paling sering jika VM dimatikan, saya ingin mengembalikan pengguna ke layar utama, dan membiarkan mereka melakukan tugasnya lagi, karena saya tidak Tidak menghabiskan 30-50 jam coding menyimpan / melanjutkan fungsionalitas yang akan dialami oleh 0,1% pengguna.

Alternatif

Fragmen atau hanya mengelola tampilan aktivitas Anda sendiri. Mengelola tampilan secara manual, memerlukan pengkodean beberapa alternatif pengalihan tampilan untuk aktivitas / fragmen dengan transisi jika diinginkan.

Dan tidak, itu tidak berarti satu mega-aktivitas, seperti yang disarankan dalam jawaban yang diterima, dengan cara apa pun selain satu mega-app-nya. Ini hanya membutuhkan sedikit lebih banyak desain basis kode menjadi bagian-bagian yang pas, karena ada sedikit lebih banyak pekerjaan yang mengelola tampilan, meskipun lebih sedikit pekerjaan yang mengelola status aktivitas dan keanehan lainnya.

Mungkin relevan: Reddit: Resmi: Google secara resmi merekomendasikan arsitektur aplikasi aktivitas tunggal

arberg
sumber