Sorunsuz kullanım için tasarım yapın

Uygulamanız hızlı ve duyarlı olsa bile belirli tasarım kararları, diğer uygulamalar veya iletişim kutularıyla planlanmayan etkileşimler, yanlışlıkla veri kaybı, istenmeyen engellemeler vb. nedenlerle kullanıcılar için sorunlara neden olabilir. Bu sorunları önlemek için uygulamalarınızın çalıştığı bağlamı ve uygulamanızı etkileyebilecek sistem etkileşimlerini anlamak yardımcı olur. Kısacası, sistem ve diğer uygulamalarla sorunsuz etkileşime giren bir uygulama geliştirmeye çalışmalısınız.

Bir uygulamanın arka plan işlemindeki (ör. bir hizmet veya yayın alıcısı) bir etkinliğe yanıt olarak iletişim kutusunun açılması sık karşılaşılan bir sorunsuzluk sorunudur. Bu, özellikle uygulamanızı emülatörde ayrı olarak derleyip test ederken zararsız bir davranış gibi görünebilir. Ancak uygulamanız gerçek bir cihazda çalıştırıldığında, arka plan işleminizde iletişim kutusu görüntülenirken uygulamanız kullanıcı odağı olmayabilir. Sonuçta uygulamanız, etkin uygulamanın arkasındaki iletişim kutusunu görüntüleyebilir veya mevcut uygulamanın odağını alıp kullanıcının yaptığı işin önünde bu iletişim kutusunu görüntüleyebilir (örneğin, bir telefon araması yapmak gibi). Bu davranış, uygulamanız veya kullanıcı için işe yaramaz.

Bu sorunlardan kaçınmak için uygulamanızın kullanıcıyı bilgilendirmek için uygun sistem tesisini (Notification sınıflarını) kullanması gerekir. Uygulamanız, dikkatini çekmek ve kullanıcının dikkatini kesmek yerine durum çubuğunda bir simge görüntüleyerek bildirimleri kullanarak kullanıcıya bir etkinlik gerçekleştiğine dair sinyal gönderebilir.

Sorunsuzluk sorununa bir başka örnek de onPause() ve diğer yaşam döngüsü yöntemlerini doğru bir şekilde uygulamadığı için bir etkinliğin durum veya kullanıcı verilerini istemeden kaybetmesidir. Alternatif olarak, uygulamanız başka uygulamalar tarafından kullanılması amaçlanan verileri açığa çıkarıyorsa bunu örneğin, herkesin okuyabileceği bir ham dosya veya veritabanı yapmak yerine bir ContentProvider aracılığıyla ortaya çıkarmanız gerekir.

Bu örneklerin ortak noktası, sistem ve diğer uygulamalarla iyi bir iş birliği yapmayı içermeleridir. Android sistemi, uygulamaları kara kutu kod parçaları yerine bir tür serbest bir şekilde birleştirilmiş bileşenlerin federasyonu olarak ele alacak şekilde tasarlanmıştır. Böylece geliştirici olarak tüm sistemi, bu bileşenlerin çok daha büyük bir federasyonu olarak görebilirsiniz. Bu, diğer uygulamalarla temiz ve sorunsuz entegrasyon yapmanızı sağladığından size fayda sağlar. Bu nedenle, iyilik sağlamak için kendi kodunuzu tasarlamanız gerekir.

Bu belgede, yaygın sorunsuzluk sorunları ve bunlardan nasıl kaçınılabileceği anlatılmıştır.

Verileri bırakma

Android'in bir mobil platform olduğunu asla unutmayın. Bunu söylemeniz çok bariz görünebilir, ancak başka bir Etkinliğin (örneğin, "Gelen Telefon Araması" uygulaması) kendi Etkinliğinizin üzerinde her an karşınıza çıkabileceğini unutmayın. Bu, onSaveInstanceState() ve onPause() yöntemlerini tetikler ve muhtemelen uygulamanızın sonlandırılmasına yol açar.

Diğer Etkinlik göründüğünde kullanıcı, uygulamanızdaki verileri düzenliyorsa uygulamanız öldürüldüğünde büyük olasılıkla bu verileri kaybeder. Elbette, önce devam eden çalışmayı kaydetmezseniz. "Android Yöntemi" tam da bunu yapmaktır: Girişi kabul eden veya düzenleyen Android uygulamaları onSaveInstanceState() yöntemini geçersiz kılmalı ve durumlarını uygun bir şekilde kaydetmelidir. Kullanıcı uygulamayı tekrar ziyaret ettiğinde verilerini alabilir.

Bu davranışın iyi kullanımına örnek olarak posta uygulaması verilebilir. Kullanıcı başka bir etkinlik başlarken bir e-posta oluşturuyorsa uygulama, işlenen e-postayı taslak olarak kaydedmelidir.

Ham verileri gösterme

Sokakta iç çamaşırınızla yürüyemiyorsanız verileriniz de size yardımcı olmaz. Bazı uygulama türlerini herkesin okuması için herkese sunmak mümkün olsa da bu genellikle en iyi fikir değildir. Ham verilerin gösterilmesi, diğer uygulamaların veri biçiminizi anlamasını gerektirir. Bu biçimi değiştirirseniz benzer şekilde güncellenmeyen diğer uygulamaları bozarsınız.

"Android Yolu" temiz, iyi düşünülmüş ve bakımı yapılabilir bir API aracılığıyla verilerinizi diğer uygulamalara sunmak için bir ContentProvider oluşturmaktır. ContentProvider, birbirlerine sıkı sıkıya bağlı iki kod parçasını bölmek ve bileşenlerine ayırmak için Java dili arayüzü eklemeye çok benzer. Bu, ContentProvider tarafından sunulan arayüzü değiştirmeden verilerinizin dahili biçimini ve diğer uygulamaları etkilemeden değiştirebileceğiniz anlamına gelir.

Kullanıcıyı rahatsız etmeyin

Kullanıcı bir uygulama (örneğin, telefon araması sırasında Telefon uygulaması gibi) çalıştırıyorsa bunu bilerek yapmış olması son derece güvenlidir. Bu nedenle, mevcut Etkinlikteki kullanıcı girdilerine doğrudan yanıt vermek dışında filizlenme faaliyetlerinden kaçınmalısınız.

Yani arka planda çalışan BroadcastReceiver'lardan veya Hizmetlerden startActivity() çağrısı yapmayın. Aksi halde o anda çalışan uygulama kesintiye uğrar ve kullanıcının canı sıkılabilir. Belki daha da kötüsü, Etkinliğiniz bir "tuş vuruşu makinesi" haline gelebilir ve kullanıcının önceki Etkinlik'e sağlarken girdiği girdinin bir kısmını alabilir. Uygulamanızın ne yaptığına bağlı olarak, bu kötü bir haber olabilir.

Etkinlik kullanıcı arayüzlerini doğrudan arka planda oluşturmak yerine, Bildirimler'i ayarlamak için NotificationManager'ı kullanmanız gerekir. Bu reklamlar durum çubuğunda görünür ve kullanıcı, dilediği zaman bu düğmeleri tıklayarak uygulamanızın ne göstermesi gerektiğini görebilir.

(Tüm bunların kendi Etkinliğinizin zaten ön planda olduğu durumlar için geçerli olmadığını unutmayın. Bu durumda, kullanıcı girişe yanıt olarak bir sonraki Etkinliğinizi görmeyi bekler.)

Yapacak çok şeyiniz mi var? Bir ileti dizisinde yap

Uygulamanızın pahalı veya uzun süreli hesaplamalar yapması gerekiyorsa muhtemelen bunu bir iş parçacığına taşımalısınız. Bu, korkunç "Uygulama Yanıt Vermiyor" iletişim kutusunun kullanıcıya gösterilmesini engeller ve nihai sonuç, uygulamanızın acımasız bir şekilde kullanımdan kaldırılması olur.

Varsayılan olarak, bir Etkinlik'teki kodların yanı sıra Görünümlerinin tamamı aynı iş parçacığında çalışır. Bu, kullanıcı arayüzü etkinliklerini de işleyen aynı iş parçacığıdır. Örneğin, kullanıcı bir tuşa bastığında Etkinlik'in ana iş parçacığının sırasına bir key-down etkinliği eklenir. Etkinlik işleyici sisteminin bu etkinliği hızlı bir şekilde kaldırması ve işlemesi gerekir. Aksi takdirde, birkaç saniye sonra uygulama askıya alınır ve kullanıcı için etkinliği sonlandırmayı teklif eder.

Uzun süredir çalışan kodunuz varsa Etkinliğinizde satır içinde çalıştırdığınızda kod etkinlik işleyici iş parçacığında çalıştırılır ve etkinlik işleyicinin etkili bir şekilde engellenmesi sağlanır. Bu durum, giriş işlemeyi geciktirir ve ANR iletişim kutularının açılmasına neden olur. Bunu önlemek için hesaplamalarınızı bir iş parçacığına taşıyın. Bu Tasarımda Duyarlılık dokümanında bunun nasıl yapılacağı açıklanmaktadır.

Tek bir etkinlik ekranını aşırı yüklemeyin

Kullanılmaya değer uygulamalarda muhtemelen birkaç farklı ekran bulunur. Kullanıcı arayüzünüzün ekranlarını tasarlarken birden fazla Etkinlik nesnesi örneği kullandığınızdan emin olun.

Geliştirme geçmişinize bağlı olarak bir Etkinliği, uygulamanızın giriş noktası olması açısından Java Applet gibi bir aktivite olarak yorumlayabilirsiniz. Ancak bu pek doğru değildir: Bir Applet alt sınıfı, bir Java Applet'in tek giriş noktası olduğunda Etkinlik, uygulamanıza potansiyel olarak birkaç giriş noktasından biri olarak düşünülmelidir. "Ana" etkinliğiniz ile sahip olabileceğiniz diğer etkinlikler arasındaki tek fark, "ana" etkinliğin AndroidManifest..xml dosyanızdaki "android.intent.action.MAIN" işlemiyle ilgilendiğini belirten tek etkinlik olmasıdır.

Bu nedenle, uygulamanızı tasarlarken Etkinlik nesnelerinin bir federasyonu olarak düşünün. Bu, uzun vadede kodunuzun çok daha sürdürülebilir olmasını sağlar ve ayrıca Android'in uygulama geçmişi ve "sırt yığını" modelinde iyi bir yan etki olarak iyi performans gösterir.

Sistem temalarını genişletin

Kullanıcı arayüzünün görünümü ve tarzı konusunda, içeriği güzel bir şekilde birleştirmek önemlidir. Bekledikleri kullanıcı arayüzüyle zıtlık oluşturan uygulamalar, kullanıcıları rahatsız eder. Kullanıcı arayüzlerinizi tasarlarken mümkün olduğunca kendi arayüzünüzü kaydırmaya çalışmalısınız. Bunun yerine bir Tema kullanın. Temanın ihtiyacınız olan bu bölümlerini geçersiz kılabilir veya genişletebilirsiniz, ancak en azından diğer tüm uygulamalarla aynı kullanıcı arayüzü tabanından başlıyorsunuz. Tüm ayrıntılar için Stiller ve Temalar bölümünü inceleyin.

Kullanıcı arayüzünüzü birden fazla ekran çözünürlüğüyle çalışacak şekilde tasarlayın

Farklı Android destekli cihazlar farklı ekran çözünürlüklerini destekler. Hatta bazıları yatay moda geçerek çözünürlükleri anında değiştirebilir. Düzenlerinizin ve çekilebilir sayfalarınızın çeşitli cihaz ekranlarında düzgün bir şekilde görüntülenecek kadar esnek olmasını sağlamak önemlidir.

Neyse ki bunu yapmak çok kolay. Özetlemek gerekirse, anahtar çözünürlükleri için çiziminizin farklı sürümlerini (kullanıyorsanız) sağlamanız ve ardından düzeninizi farklı boyutlara uyum sağlayacak şekilde tasarlamanız gerekir. (Örneğin, sabit kodlanmış konumları kullanmaktan kaçının ve bunun yerine göreli düzenler kullanın.) Bu kadar çok yaparsanız, gerisini sistem halleder ve uygulamanız tüm cihazlarda harika görünür.

Ağın yavaş olduğunu varsayın

Android cihazlarda çeşitli ağ bağlantısı seçenekleri bulunur. Hepsinde bazı veri erişimi sağlamaları olacak, ancak bazıları diğerlerinden daha hızlı olacaktır. Bununla birlikte, en düşük ortak payda, GSM ağları için 3G olmayan veri hizmeti olan GPRS'dir. 3G özellikli cihazlar bile 3G olmayan ağlarda çok fazla zaman geçirdiğinden, yavaş ağlar uzun bir süre daha varlığını sürdürecek.

Bu nedenle, uygulamalarınızı her zaman ağ erişimlerini ve bant genişliğini en aza indirecek şekilde kodlamanız gerekir. Ağın hızlı olduğunu varsayamazsınız. Bu nedenle her zaman yavaş olacak şekilde planlamalısınız. Kullanıcılarınız daha hızlı ağlara bağlanıyorsa bu harika. Onların deneyimi daha da iyileşir. Yine de durumun tam tersi yaşamamak istersiniz: Bir süre kullanılabilen ancak kullanıcının herhangi bir anda bulunduğu yere bağlı olarak geri kalanını yavaşlatan uygulamalar muhtemelen pek popüler değildir.

Olası bir engel de, emülatör kullanıyorsanız bu tuzağa düşmenin, çünkü emülatörün masaüstü bilgisayarınızın ağ bağlantısını kullanmasıdır. Bunun hücre ağından çok daha hızlı olacağı neredeyse garanti edilmiştir. Bu nedenle, emülatörde daha yavaş ağ hızlarını simüle eden ayarları değiştirmek istersiniz. Bunu Android Studio'da AVD Manager aracılığıyla veya emülatörü başlatırken bir komut satırı seçeneği aracılığıyla yapabilirsiniz.

Dokunmatik ekran veya klavye olduğunu varsaymayın

Android, çeşitli cihaz form faktörlerini destekler. Örneğin, bazı Android cihazlarda tam "QWERTY" klavyeler bulunurken bazılarında 40 tuşlu, 12 tuşlu, hatta başka tuş yapılandırmalarına sahip olacağını söyleyebiliriz. Benzer bir şekilde, bazı cihazlarda dokunmatik ekran olsa da çoğunda yoktur.

Uygulamalarınızı oluştururken bunu göz önünde bulundurun. Belirli klavye düzenleri hakkında varsayımlarda bulunmayın. Tabii ki, uygulamanızı yalnızca bu cihazlarda kullanılabilecek şekilde kısıtlamak istiyorsanız.

Cihazın pilinden tasarruf edin

Bir mobil cihaz sürekli olarak duvara takılıysa çok mobil değildir. Mobil cihazlar pille çalışır ve bu pili ne kadar uzun süre şarj edebilirsek herkes, özellikle de kullanıcılar o kadar mutlu olur. Pil gücünü en çok kullanan iki tüketici de işlemci ve radyodur. Bu nedenle uygulamalarınızı mümkün olduğunca az iş yapacak şekilde yazmanız ve ağı olabildiğince seyrek kullanmanız önemlidir.

Uygulamanızın kullandığı işlemci süresini en aza indirmek etkili kod yazmak anlamına gelir. Radyonun kullanılmasından kaynaklanan güç tüketimini en aza indirmek için hata koşullarına özen gösterin ve yalnızca ihtiyacınız olanları getirin. Örneğin, başarısız olan bir ağ işlemini sürekli olarak yeniden denemeyin. Bir kez başarısız olduysa, bunun nedeni büyük olasılıkla kullanıcının sinyal almamasıdır. Bu nedenle, hemen denerseniz tekrar başarısız olur. Tek yapmanız gereken pil gücünü boşa çıkarmaktır.

Kullanıcılar oldukça zekidir: Programınız güce çok açsa bunu fark edeceklerine güvenebilirsiniz. O noktada emin olabileceğiniz tek şey, programınızın çok uzun süre yüklü kalmayacağıdır.