Uygulama Bileşenleri

► Kısa anlatım

Bu bölümde Android uygulamalarını oluşturmak için kullandığımız bileşenleri incelemeye çalışacağız.

Uygulama bileşenleri, bir Android uygulamasının en önemli yapı taşlarıdır. Her bir bileşen sistemin uygulamanıza giriş yapabileceği farklı bir nokta oluşturur.

Android işletim sisteminde 4 farklı uygulama bileşeni kullanılmaktadır:

Aktiviteler (Activities)

Aktivite bir kullanıcı arayüzüne sahip tek bir ekranı ifade eder. Bir program içinde bir tanesi ana aktivite olmak üzere birden fazla aktivite tanımlanabilir. Aktivite aslında kullanıcının işlemler gerçekleştirmek için kullandığı bir penceredir. Bu pencere üzerinde etiket, metin giriş alanları ve buton gibi program elemanları yer alır. Her aktivitede yer alan elemanları göstermek için ayrı bir .xml dosyası oluşturulur. Aktiviteler Activity sınıfından türetilir.

Servisler (Services)

Servisler uzun süren işlemleri veya uzaktan çalışmaları gerçekleştirmek için arka planda çalışan bileşenlerdir. Servislerin bir kullanıcı arayüzü yoktur. Örneğin, kullanıcı farklı bir uygulama ile çalışırken, servis arka planda müzik çalar. Aktivite gibi farklı bir bileşen servisi başlatabilir, çalıştırabilir veya iletişime geçmek için servise bağlanır. Bir servis Service sınıfından türetilir.

İçerik sağlayıcıları (Content Providers)

İçerik sağlayıcısı, uygulamaya ait paylaşılan verileri yönetir. Verileri, uygulamanızın erişim sağlayabileceği web veya disk üzerindeki bir dosya sistemine veya bir SQLite veritabanına kaydedebilirsiniz. İçerik sağlayıcısı ile, diğer uygulamalar, yetki sahibi olduğu takdirde, verileri sorgulayabilir veya değiştirebilir. Android sistemi kullanıcının irtibat bilgisini yöneten bir içerik sağlayıcısı vardır. İçerik sağlayıcısı, uygulamanıza özel bilgileri okumak ve yazmak için kullanılır. Bir içerik sağlayıcısı ContentProvider sınıfından türetilir.

Mesaj alıcıları (Broadcast Receivers)

Mesaj alıcı, sistem mesajlarına işlem yapan bir bileşendir. Ekranın kapatıldığı, bataryanın düşük olduğu veya resim kaydedilmesi gibi bir çok mesaj sistem kaynaklıdır. Uygulamalar, diğer uygulamalara cihaza bazı verilerin indirildiğini ve kullanıma hazır olduğunu bildirmek için mesaj gönderebilir. Mesaj alıcıları bir kullanıcı arayüzü kullanmaz, ancak bir mesaj iletildiğini kullanıcıya bildirmek üzere bir durum çubuğu bildirimi oluşturur. Mesaj alıcıları BroadcastReceiver sınıfından türetilir ve Intent nesnesi olarak dağıtılır.

Android işletim sisteminde, bir uygulama diğer bir uygulamanın bileşenini çalıştırarak kullanabilir.

Örneğin, eğer kullanıcının cihazın kamerası ile bir fotoğraf çekmesini isterseniz, büyük olasılıkla bu işlemi farklı bir uygulama gerçekleştirir ve uygulamanız aynı işlemi kendi başına yapmak yerine onu kullanır. Bunun için, işlemi yapan kodu uygulamanıza dahil etmenize veya bağlantı yapmanıza gerek yoktur. Sadece, kamera uygulamasında fotoğraf çeken aktiviteyi başlatmanız yeterlidir. Tamamlandığında, kullanılmak üzere fotoğraf uygulamanıza aktarılır. Kullanıcı için, kamera uygulaması uygulamanızn bir parçası olarak görülür.

Sistem bir bileşeni çalıştırdığında, uygulamayı devreye sokar ve bileşen için gerekli sınıfları oluşturur. Örneğin, eğer uygulamanız fotoğraf çeken kamera uygulamasındaki aktiviteyi çalıştırdığında, aktivite programınız dahilinde değil, kamera uygulaması içinde çalışır.

Android uygulamalarının tek bir giriş noktası yoktur (örneğin main() fonksiyonu yoktur).

Sistem her bir uygulamayı ayrı bir bellek biriminde diğer uygulamalara erişimi sınırlayan dosya izinleriyle çalıştırdığından, uygulamanız diğer bir uygulamadaki bir bileşeni direk olarak çalıştıramaz. Bu işlemi Android sistemi gerçekleştirebilir. Diğer bir uygulamadaki bileşeni çalıştırmak için isteğinizi gösteren bir mesajı sisteme gönderdiğinizde, sistem bileşeni sizin için çalıştırır.

Bileşenleri Aktifleştirme

Aktivite, hizmet ve mesaj alıcıları eşzamanlı olmayan intent adlı mesajlarla aktif hale getirilirler.

intent mesajları çalışma zamanında bileşenleri birbirlerine bağlar. Sizin uygulamanıza veya diğer uygulamalara ait tüm bileşenlere istek gönderen bir sistem olarak çalışır.

Bir intent belirli bir bileşeni aktif hale getirmek için bir mesaj gönderen Intent nesnesi ile oluşturulur.

Aktivite ve hizmetler için, intent bir şeyi görüntülemek veya göndermek gibi uygulanacak bir hareket tanımlar. Örneğin, intent bir aktivitenin bir resim göstermesi veya bir web sayfası açması için bir istek içerebilir. Bazı durumlarda, bir sonuç elde etmek için bir aktivite başlatabilirsiniz. Elde edilen sonuç yine intent içine döndürülür. Örneğin, kullanıcının bir kişinin irtibat bilgilerini almak için bir intent oluşturulabilir.

Mesaj alıcıları için, intent yayınlanacak bildirimi tanımlar (örneğin, cihaz bataryasının düşük olduğunu gösteren bir mesaj gibi).

İçerik sağlayıcısı ise, bir ContentResolver nesnesinden istek geldiğinde aktif hale getirilir.

İçerik çözümleyici, içerik sağlayıcı ile ilgili olan tüm doğrudan işlemleri yönetir. İçerik sağlayıcı ile işlem yapması gereken bileşenler direk olarak iletişime geçmek yerine, ContentResolver nesnesi metotlarını kullanarak işlemlerini gerçekleştirirler. Böylelikle, içerik sağlayıcı ile bilgi isteğinde bulunan bileşen arasında güvenlik amaçlı bir soyutlama katmanı oluşturulur.

Her bileşeni aktfi hale getirmek için farklı bir metod kullanılır:

Aktivite: startActivity() veya startActivityForResult() metotlarını bir intent parametresi ile çalıştırarak.

Service: startService() veya bindService() (hizmete bağlanmak için) metotlarını bir intent parametresi ile çalıştırarak.

Mesaj alıcısı: sendBroadcast(), sendOrderedBroadcast() veya sendStickyBroadcast() metotlarını bir intent parametresi ile çalıştırarak.

İçerik sağlayıcı: ContentResolver nesnesindeki query() metodunu çağırarak.

Manifest Dosyası

Android sistemi bir uygulama bileşenini başlatmadan önce, uygulamanın AndroidManifest.xml dosyasını okuyarak bileşenin varlığını kontrol etmelidir. Bir uygulamaya ait bütün bileşenlerin uygulamanın ana proje dizininde olması gereken bu dosya içinde bildirimi yapılmalıdır.

Manifest dosyası uygulamaya ait bileşenlerin bildirimine ek olarak aşağıdaki işlemleri de yapar:

> İnternet girişi veya kullanıcı bilgilerinin sadece okunur girişi gibi kullanıcı izinlerini belirlemek.

> Uygulamanın gerektirdiği minimum API seviyesini bildirmek.

> Uygulamanın gerektirdiği veya kullandığı donanım ve yazılım özelliklerini bildirmek (kamera, bluetooth hizmeti gibi).

> Android API'leri dışında uygulamanın gerektirdiği API kütüphaneleri (Google Maps kütühanesi gibi).

Bileşen bildirimi

Manifest dosyasının öncelikli amacı sistemi uygulama bileşenleri hakkında bilgilendirmektir. Aşağıdaki satırlar manifest dosyası içinde bir aktivite bildirimini göstermektedir:

<?xml version="1.0" encoding="utf-8"?>
<manifest ... >
    <application android:icon="@drawable/app_icon.png" ... >
        <activity android:name="com.example.project.ExampleActivity"
                  android:label="@string/example_label" ... >
        </activity>
        ...
    </application>
</manifest>

<application> elemanındaki android:icon özelliği uygulamada kullanılan ikon dosyasını gösterir.

<activity> elemanındaki, android:name özelliği Activity sınıfından türetilen alt sınıfın tam yol tanımlamasını ve android:label özelliği aktivitenin kullanıcı tarafından görülen adını tanımlayan bir karakter dizisini gösterir.

Tüm uygulama bileşenlerinin bildirimi benzer şekilde yapılmalır:

  • <activity> Aktivite elemanları
  • <service> Hizmet elemanları
  • <receiver> Mesaj alıcıları elemanları
  • <provider> İçerik sağlayıcı elemanları

Program kaynak dosyalarınızda yer alan, ancak manifest dosyalarında bildirimi yapılmayan aktivite, hizmet ve içerik sağlayıcıları sistem tarafından görülmez ve çalıştırılmaz. Ancak, mesaj alıcılarının manifest dosyasında bildirimi yapılabilir veya program içinde dinamik olarak oluşturulabilir (BroadcastReceiver nesnesi olarak) ve registerReceiver() metodu ile sisteme kaydı yapılır.

Bileşen bildirimi kabiliyetleri

Aktivite, servsi ve mesaj alıcıları başlatmak için intent'ler içinde bileşenin sınıf adını kullanılır. Intent'ler gerçek gücünü hareketlerinden alır. Intent hareketiyle gerçekleştirmek istediğiniz hareketi ve isteğe bağlı olarak hareketi uygulayacağınız veriyi tanımlayabilir ve sistemin hareketi uygulayacak ve başlatacak bir cihaz bileşenini bulmasını sağlayabilirsiniz. Eğer intent tarafından tanımlanan hareketi uygulayacak birden fazla bileşen varsa, aralarından seçimi kullanıcı yapar.

Sistem bir intent'e karşılık veren bileşenleri belirlemek için cihazdaki diğer uygulamaların manifest dosyasındaki intent filtreleri ile alınan intent'i karşılaştırır.

Uygulamanızın manifest dosyasında bir bileşen bildirimi yaptığınızda, isteğe bağlı olarak bileşenin yeeterliliklerini bildiren intent filtrelerini dahil ederek diğer uygulamalardaki intent'lere karşılık verebilir. Bileşen bildirim elemanının altına bir <intent-filter> elemanı ekleyerek bileşeniniz için bir intent filter bildirimi yapabilirsiniz.

Uygulama gereksinimlerini bildirme

Android işletim sistemi ile çalışan bir çok farklı cihaz vardır. Bu cihazların tamamı aynı özellik ve kabiliyetleri sağlamaz. Uygulamanız tarafından gerek duyulan özelliklere sahip olmayan cihazlara uygulamanızın kurulmasını engellemek için, manifest dosyasında cihaz ve yazılım gerekliliklerini bildirerek uygulamanızın desteklediği cihaz türleri için bir profil tanımlamak önemlidir. Bu bildirimlerin çoğu bilgilendirme amaçlıdır ve sistem onları okumaz, ancak Google Play gibi hizmetler, kullanıcılar uygulama araştırdıklarında filtreleme sağlamak için, onları okur.

Örneğin, eğer uygulamanız bir kamera gerektiriyor ve APIs Android 2.1 (API Level 7) API'leri kullanıyorsa, bu gereksinim bildirimlerini manifest dosyanızda yapmanız gerekir. Bu düzenlemeyle, kamerası olmayan ve Android 2.1'den daha düşük bir sürüme sahip bir cihaz uygulamanızı Google Play'den kurulumunu yapamaz.

İsterseniz, bildirimi uygulamanızın kamera kullandığını fakat şart olmadığını gösterecek şekilde de yapabilirsiniz. Bu durumda, uygulamanız çalışma zamanında aygıtın bir kamerası olup olmadığını belirleyecek bir kontrol gerçekleştirir ve eğer mevcut değilse kamerayı kullanan özellikleri devre dışı bırakır.

Uygulamanızı tasarlamak ve geliştirmek için dikkate alacağınız bazı önemli cihaz özellikleri aşağıdadır:

Ekran boyutu ve çözünürlüğü

Cihazları ekran türlerine göre sınıflandırmak için, ANdroid her bir cihaz için 2 özellik tanımlar: Ekranın fiziksel boyutu ve ekran çözünürlüğü (piksel değeri). Android sistemi farklı türlerdeki ekranları basit bir şekilde gruplandırmak için genelleştirir:

Ekran boyutları: küçük, normal, büyük ve ekstra büyük

Ekran çözünürlüğü: düşük, orta, yüksek ve ekstra yüksek çözünürlük

Ön tanımlı olarak, uygulamanız bütün ekran boyutları ve çözünürlükleri ile uyumludur, çünkü Android sistemi kullanıcı arabirimi ve resim kaynakları için gerekli ayarlamaları yapar. Ancak, alternatif çıktı kaynakları kullanarak ve manifest dosyanızda <supports-screens> elemanı ile uygulamanızın tam olarak hangi ekran boyutlarını desteklediğini bildirerek, belirli ekran boyutları özel boyutta görünüm oluşturmanız ve belirli çözünürlükler için özel resimler sağlamanız gerekir.

Girdi düzenlemesi

Bir çok cihaz donanım klavyesi veya trackball gibi farklı bir tür kullanıcı veri giriş sistemi kullanır. Pek sık rastlanmasada, eğer uygulamanız özel bir veri girişi donanımı gerektiriyorsa, bu gereksinimi <uses-configuration> elemanı ile manifest dosyasında yapmanız gerekir.

Cihaz özellikleri

Android ile çalıştırılan bir cihazda bulunan veya bulunmayan kamera, ışık sensörü, bluetooth veya OpenGL'nin kesin bir sürümü gibi bir çok donanım ve yazılım özelliği vardır. Android ile çalışan bütün cihazlarda belirli bir özelliğin mevcut olduğunu kabul etmemelisiniz, bu nedenle <uses-feature> elemanını kullanarak uygulamanız tarafından kullanılan herhangi bir özelliğin bildirmini yapmanız gerekir.

Platform sürümü

Android ile çalışan farklı cihazlar farklı Android sürümleri ile çalışır. Her yeni sürüm bir önceki sürümde yer almayan API'ler içerir. Eğer 1.0 sürümünden sonra eklenen API'ler kullanıyorsanız, <uses-sdk> elemanını kullanarak minimum API seviyesinin bildirimini yapmanız gerekir.

Uygulamanız için bütün bu gerekliliklerin bildiriminizi yapmanız önemlidir, çünkü, Google Play'de uygulamanızı yayınladığınızda, her bir cihaz için uygun olan uygulamaların belirlenmesi için bu bildirimler kullanılır.

Uygulama Kaynakları (Application Resources)

Bir Android uygulaması program kaynak kodlarının yanısıra, resim ve ses dosyaları ile uygulamanın görsel şekli ile ilgili herşeyden oluşan kaynakları içerir. Örneğin, aktivitenin kullanıcı arayüzünün animasyon, menü, stil, renk ve görüntüsü XML dosyalar ile tanımlanabilir. Uygulama kaynaklarını kullanarak, uygulamanızın çeşitli özelliklerini, program kodunu değiştirmeden, kolayca güncelleyebilirsiniz.

Android projenizde yer alan her kaynak için, SDK derleyicisi benzersiz bir int ID tanımlar. Bu ID uygulamanızdaki kodlar veya XML içinde tanımlanmış diğer kaynaklar tarafından erişim için kullanılır.

Kaynakları program kodundan ayrı olarak tanımlamanın en önemli yönlerinden biri, size farklı cihaz konfigürasyonları için alternatif kaynaklar sağlama olanağı vermesidir.