Android: Hangisi daha iyi - birden çok etkinlik mi yoksa görünümleri manuel olarak değiştirmek mi?


115

Android için bazı uygulamalar geliştirdim ve bu sorular her zaman kalıyor:

Kullanıcı arayüzümü nasıl yapılandırmalıyım? Aktiviteden sonra aktiviteyi başlatmalı ve telefonu "geri" düğmesini yapmak için bırakmalı mıyım yoksa daha optimize edilmiş, ancak uygulaması daha karmaşık olan, Görünümleri manuel olarak değiştirip ardından "Geri" düğmesi işlevini manuel olarak yaparak mı seçmeliyim?

Sizce (veya bildiğiniz) daha iyi uygulama nedir?


4
Yeni okuyucular için, lütfen bu sorunun oldukça eski olduğunu ve bugün sorunun "birden çok görünüm veya birden çok etkinlik" yerine "birden çok parça veya birden çok etkinlik" olma olasılığının daha yüksek olduğunu unutmayın. Stackoverflow.com/a/10794086/199364 adresinde GÜNCELLEME bölümüne bakın . Ayrıca, parçalar ve etkinliklerle ilgili diğer yığın akışı konuları için google - birçok iyi yanıt.
ToolmakerSteve

Yanıtlar:


99

Birden fazla Faaliyetin neredeyse her zaman daha mantıklı olduğunu söyleyebilirim. Sadece Android'in sürekli olarak kendi görünümlerini değiştirmek için tasarlandığını düşünmüyorum - çok şey kaçırıyorsunuz. Kendinizi geri uygulamalısınız, Aktiviteler arası geçişler yaşamazsınız, bir uygulamayı doğru durumda devam ettirmek için çok fazla dahili mantık uygulamanız gerekir. Uygulamanızı Etkinlikler'e ayırmazsanız, daha sonra uygulamanızın akışını değiştirmek çok daha zor hale gelir. Bu aynı zamanda, çok sayıda küçük kod parçasına göre işlenmesi çok daha zor olabilen bir mega Aktivite ile sonuçlanır.

Hızın gerçekten bir sorun olduğunu hayal etmekte güçlük çekiyorum; eğer öyleyse, her Aktiviteyi başlatma şeklinizde bir sorun vardır. Örneğin, Serileştirilebilir nesneleri Etkinlikler arasında geçirmeye çalıştım ve bu inanılmaz derecede yavaş oldu; Nesneleri geçmek için daha hızlı bir yönteme geçtiğimde, Faaliyetleri başlatma hızı muazzam bir şekilde arttı.

Ayrıca, Aktivite ve Görev Tasarımı için Android yönergelerinin Görünümleri değiştirmekten hiç bahsetmediğini düşünüyorum; Görünüm olarak Aktivite tasarımının etrafında merkezlenmiştir.


5
Son zamanlarda animasyonlar kullanan ve farklı Görünümler arasında sorunsuz aktarım yapan bazı harika uygulamalar (örneğin Pulse) gördüğümü belirtmek isterim.
Danail

3
Size katılıyorum, ancak birçok görsel efekt yalnızca görünüm geçişleri arasında mevcuttur ve ergo ile güzel kodlama arasında ortaya çıkan bir soruna neden olan etkinlikler arasında değil
AsTeR

Bu son derece ilginç bir konu. Bu noktada nihayetinde 4 görünümü uygulayacak bir uygulamaya sahibim. Hepsini bu cevapta belirtilen "Mega Aktivite" ile sonuçlanan 1 aktivite içerisinde yapıyorum. Bunu öncelikle uygulamamın tam olarak iOS muadili gibi görünmesini ve hissetmesini sağlamak için yapıyorum. Bunun AĞIR bir şekilde başarmaya çalıştığınız şeye bağlı olduğuna katılıyorum. Harika Soru ve Cevap +1 :-)
trumpetlicks

Bir iOS kullanıcı arayüzü yapmak kötü bir fikirdir. Tek başına Hvis, birden fazla etkinliği kullanmamak için yanlış bir nedendir.
slott

3
@Daniel: Nesneleri geçmek için daha hızlı bir yönteme geçtiğimde, Faaliyetleri başlatma hızı inanılmaz derecede arttı. Lütfen bunlarla ilgili bazı ek ayrıntılar veya referans materyali sağlayabilir misiniz?
Bhargav Jhaveri

21

Birden fazla tam ekran Görünümüne sahip bir Android uygulaması için tek bir etkinliğin daha iyi bir tasarım olabileceği bazı örnekleri belirtmek isterim:

  • Uygulama ekranları birbirine sıkı sıkıya bağlıysa ve hepsinin üzerinde çalıştığı ortak bir Nesneyi paylaşıyorsa. Bu durumda, Nesnenin etrafından geçmek bir Paket gerektirebilir ve kopyaları olacağı için hataya açık olabilir. İyi bir örnek bir sihirbaz olabilir . Evet, ortak Nesneye erişmek için statikleri kullanabilirsiniz, ancak statik Android'de tehlikeli olabilir (yapılandırma değişikliklerini düşünün!)

  • Ekranlar arasında gerçekten harika animasyonlar istiyorsanız. Belki bir kuşun bir ekranda havalanmasını ve başka bir ekrana inmesini istersiniz. Her ekran bir etkinlik olduğunda bunu yapmayı deneyin!

Öte yandan, ekranlarınızdan biri herhangi bir sayıda başka uygulama tarafından gösterilmek üzere tasarlanmışsa, o ekran kendi Etkinliği olmalıdır.

GÜNCELLEME Mart 2014:

Bu noktada soru şimdi Fragman seçimini içermelidir. Bence Görünümler muhtemelen 3'ün en az olası seçeneği: Etkinlik, Parça, Görünüm. Geri düğmesini kullanan ekranlar uygulamak istiyorsanız, o zaman ya Aktiviteler ya da Parçacıklar olmalıdır çünkü her ikisi de geri düğmesini yerel olarak kullanır. Geri düğmesinin çalışması için FragmentManager arka yığınına parçaların eklenmesi gerekecek. Parçaları, diyalogları ve arka yığını yönetmek biraz can sıkıcı olabilir!

GÜNCELLEME Eylül 2018:

Google'daki bazı geliştiriciler , yeni gezinme mimarisi bileşenini kullanan tek etkinlikli uygulamaları önermektedir .


Fragments hakkında konuşmak için UPDATE eklediğiniz için TEŞEKKÜR EDERİZ. Bugünkü önemli seçimin Fragment vs Activity'in ne zaman kullanılacağı konusunda tamamen hemfikirim.
ToolmakerSteve

11

Ayrıca, uygulamanızı birden çok uygulamayla uygulamanın Activities, kullanıcıya bir bütün olarak platformla daha tutarlı bir deneyim sağlayacağını unutmayın. Deneyimin bir kısmı yerleşik Google uygulamaları kullanılarak şekillenecektir, bu nedenle kullanıcılar, telefonda zaten yüklü olanlara benzer şekilde davranırsa, uygulamanızı kullanmak muhtemelen daha kolay olacaktır.


4

Diğerlerinden farklı olarak, her ikisinin bir karışımını kullanıyorum, örneğin,
1. Uygulama başladığında bir ana menü var
2. Aramayı tıklıyorsunuz, sizi arama etkinliğine götürüyor
3. Ardından, görünümü değiştirip gösteren bir filtre düğmesi var seçenekleri filtrelersiniz
4. Filtre görünümünün sonunda iki düğme vardır, "Ara" veya "İptal"
düğmesine basarsınız ve tekrar Arama Görünümüne dönersiniz (etkinliği değiştirmeden) 5. Şimdi, kullanıcı telefona geri dönerse düğmesi arama filtresi seçenekleri yerine ana menüye geri dönüyor. Sanırım doğru davranış.

Kullanıcının doğal hissedeceği şekilde kullanın. Ve her şeyi tek bir aktivitede tutmak onu karmaşık hale getirecektir.


3

Her şey uygulamaya, daha iyi performans elde etmeye çalıştığınız şeye, daha pürüzsüz bir kullanıcı arayüzüne bağlıdır. IMHO Sizin belirttiğiniz gibi daha karmaşık olmasına rağmen Faaliyetleri manuel olarak kontrol etmenin ikinci yaklaşımını tercih ediyorum. Bu, android sekmeler projemde kullandığım bir yaklaşımdır, ayrıca ActivityGroup adlı bir sınıfa göz atmak isteyebilirsiniz (paketten emin değilsiniz), aralarında geçiş yapabileceğiniz birden fazla aktiviteye sahip olmanıza izin verir, bu sınıf hakkında iyi bir şey geçiş yaptığınızda etkinliklerinizin yüklenmemesi, ancak kötü bir şey, ana uygulamanızı yüklemenin daha uzun sürmesidir.

Sadece benim fikrim.


1

Karşılaştığım görünümler arasında geçiş yapma sorunu çöp toplayıcıdan da kaynaklanıyor. Görünüşe göre etkinlikten ayrıldığınızda GC tetikleniyor, görünümden değil. Dolayısıyla, örneğin oldukça karmaşık alt görünümlere sahip sekmeleri değiştirmek, neredeyse kaçınılmaz olarak yığın taşması istisnasına yol açacaktır.


3
StackOverflowError hemen hemen yalnızca Java'da sonsuz özyinelemeniz varsa gerçekleşir, belki OutOfMemoryError'ı düşünüyorsunuz? Bir Java programcısı olarak, çöp toplayıcının ne zaman ve nerede tetikleneceği konusunda gerçekten endişelenmemelisiniz.
satur9nine

2
Android'de stackoverflow, görünüm hiyerarşisi çok derin olduğunda da gerçekleşir.
Danail

0

Birden fazla etkinlik düzeniyle ilgili o kadar çok sorun yaşadım ki, onu seçmek için iyi bir neden olmadıkça bunu kesinlikle önermiyorum.

Birden çok faaliyetin dezavantajı

Birden çok etkinlik kullanmak, etkinlikten veri döndürmek için kodu yeniden düzenlemek çok zordur.

Bir 'alt' aktivite olarak adlandırırsanız, o zaman ana aktivite sonlandırılabilir. Ancak, düzgün bir cihazda hata ayıklarken bunu asla yaşamazsınız, bu nedenle her zaman kaydetme durumu ve doğru kurtarma durumu ile ilgilenmeniz gerekir. Bu bir acı. Bir kitaplıktaki bir yöntemi (yani başka bir etkinlik) çağırdığınızı düşünün ve bu yöntem geri döndüğünde uygulamanızın durumunu sanal makinedeki tüm nesnelerdeki tüm alanlarla (yani etkinlik. restoreIntance). Bu çılgınlık.

Ayrıca tam tersi, bir alt etkinliği açtığınızda, alt etkinlik görüntülenirken uygulama simge durumuna küçültüldüğünde olduğu gibi alt etkinlik ilk ortaya çıktığından beri VM ölmüş olabilir.

İlgili uygulama durumunu depolamak için tek bir yere sahip olmak çok daha temiz ve benim durumumda, çoğu zaman VM öldürülürse, kullanıcıyı ana ekrana döndürmek ve işlerini yeniden yapmalarına izin vermek istiyorum çünkü Kullanıcıların% 0,1'inin deneyimleyeceği 30-50 saat kodlama kaydetme / sürdürme işlevini harcamayın.

Alternatif

Parçalar veya sadece aktivite görünümlerinizi kendiniz yönetin. Görünümleri manuel olarak yönetmek, istenirse geçişler içeren etkinliklere / bölümlere bazı görünüm değiştirme alternatifleri kodlamayı gerektirir.

Ve hayır, kabul edilen cevapta önerildiği gibi, tek bir mega uygulaması dışında herhangi bir şekilde bir mega aktivite anlamına gelmez. Sadece kod tabanının uygun parçalara göre biraz daha fazla tasarlanmasını gerektirir, çünkü görünümleri yönetmek için biraz daha fazla iş vardır, ancak etkinlik durumu ve diğer tuhaflıkları yönetmek için çok daha az iş vardır.

Muhtemelen alakalı: Reddit: Resmi: Google resmi olarak tek etkinlikli uygulama mimarisini öneriyor

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.