Uygulamayla ilgili temel bilgiler

Android uygulamaları Kotlin, Java programlama dili ve C++ dilleri kullanılarak yazılabilir. Android SDK araçları, kodunuzu veri ve kaynak dosyalarıyla birlikte bir APK veya Android App Bundle'da derler.

.apk son ekine sahip bir arşiv dosyası olan Android paketi, çalışma zamanında gerekli bir Android uygulamasının içeriklerini içerir ve bu, Android destekli cihazların uygulamayı yüklemek için kullandığı dosyadır.

.aab son ekine sahip bir arşiv dosyası olan Android App Bundle, bir Android uygulama projesinin içeriklerini içerir. Bu içerikler, çalışma zamanında gerekli olmayan bazı ek meta veriler içerir. AAB, bir yayınlama biçimidir ve Android cihazlara yüklenemez. Bu, APK oluşturmayı ve imzalamayı daha sonraki bir aşamaya erteler.

Örneğin, uygulamanızı Google Play üzerinden dağıtırken, Google Play'in sunucuları yalnızca uygulamanın yüklenmesini isteyen ilgili cihazın gerektirdiği kaynakları ve kodu içeren optimize edilmiş APK'lar oluşturur.

Her Android uygulaması, aşağıdaki Android güvenlik özellikleriyle korunan kendi güvenlik korumalı alanında bulunur:

  • Android işletim sistemi, her uygulamanın farklı bir kullanıcı olduğu çok kullanıcılı bir Linux sistemidir.
  • Varsayılan olarak sistem her bir uygulamaya, yalnızca sistem tarafından kullanılan ve uygulama tarafından bilinmeyen benzersiz bir Linux kullanıcı kimliği atar. Sistem, bir uygulamadaki tüm dosyalara yönelik izinleri, yalnızca ilgili uygulamaya atanan kullanıcı kimliğinin erişebileceği şekilde ayarlar.
  • Her işlemin kendi sanal makinesi (VM) olduğundan, bir uygulamanın kodu diğer uygulamalardan ayrı olarak çalışır.
  • Varsayılan olarak her uygulama kendi Linux işleminde çalışır. Android sistemi, uygulama bileşenlerinden birinin yürütülmesi gerektiğinde işlemi başlatır ve ardından artık ihtiyaç kalmadığında veya sistemin başka uygulamalar için belleği kurtarması gerektiğinde işlemi kapatır.

Android sistemi en az ayrıcalık ilkesini uygular. Yani varsayılan olarak her uygulama, işini yapmak için gereken bileşenlere erişebilir ve başka hiçbir içeriğe erişemez. Bu işlem, uygulamanın izin verilmediği sistem parçalarına erişemediği çok güvenli bir ortam oluşturur.

Ancak, bir uygulamanın diğer uygulamalarla veri paylaşması ve sistem hizmetlerine erişmesi için çeşitli yollar vardır:

  • İki uygulama aynı Linux kullanıcı kimliğini paylaşacak şekilde ayarlanabilir. Bu durumda, birbirlerinin dosyalarına erişebilirler. Aynı kullanıcı kimliğine sahip uygulamalar, sistem kaynaklarından tasarruf etmek için aynı Linux işleminde çalışıp aynı sanal makineyi paylaşacak şekilde de ayar yapabilir. Ayrıca, uygulamaların aynı sertifika ile imzalanması gerekir.
  • Uygulamalar; cihazın konumu, kamerası ve Bluetooth bağlantısı gibi cihaz verilerine erişmek için izin isteyebilir. Kullanıcının bu izinleri açıkça vermesi gerekir. İzinler hakkında daha fazla bilgi edinmek için Android'de izinler bölümünü inceleyin.

Bu belgenin geri kalanında aşağıdaki kavramlar açıklanmaktadır:

  • Uygulamanızı tanımlayan temel çerçeve bileşenleri.
  • Bileşenleri ve uygulamanız için gerekli cihaz özelliklerini bildirdiğiniz manifest dosyası.
  • Uygulama kodundan ayrı olan ve uygulamanızın çeşitli cihaz yapılandırmaları için davranışını düzgün bir şekilde optimize etmesini sağlayan kaynaklar.

Uygulama bileşenleri

Uygulama bileşenleri, Android uygulamalarının temel yapı taşlarıdır. Her bileşen, sistemin veya kullanıcıların uygulamanıza girebileceği bir giriş noktasıdır. Bazı bileşenler birbirine bağlıdır.

Dört tür uygulama bileşeni vardır:

  • Etkinlikler
  • Hizmetler
  • Yayın alıcıları
  • İçerik sağlayıcılar

Her türün farklı bir amacı vardır ve bir bileşenin nasıl oluşturulup yok edildiğini tanımlayan ayrı bir yaşam döngüsü vardır. Aşağıdaki bölümlerde dört uygulama bileşeni türü açıklanmaktadır.

Etkinlikler
Etkinlik, kullanıcıyla etkileşimin giriş noktasıdır. Kullanıcı arayüzü olan tek bir ekranı temsil eder. Örneğin, bir e-posta uygulamasında yeni e-postaların listesini gösteren bir etkinlik, e-posta oluşturmak için başka bir etkinlik ve e-postaları okumak için başka bir etkinlik olabilir. Etkinlikler e-posta uygulamasında uyumlu bir kullanıcı deneyimi oluşturmak için birlikte çalışsa da her biri diğerlerinden bağımsızdır.

E-posta uygulaması izin veriyorsa farklı bir uygulama bu etkinliklerden herhangi birini başlatabilir. Örneğin, bir kamera uygulaması, kullanıcının resim paylaşmasına izin vermek için yeni bir e-posta oluşturma etkinliğinde e-posta uygulamasını başlatabilir.

Etkinlik, sistem ile uygulama arasında aşağıdaki temel etkileşimleri kolaylaştırır:

  • Sistemin etkinliği barındıran işlemi çalıştırmaya devam etmesi için, kullanıcının o anda önem verdiği şeyleri (ekranda ne olduğunu) takip etme.
  • Daha önce kullanılan hangi süreçlerde kullanıcının geri dönebileceği durdurulmuş etkinlikler olduğunu bilir ve bunları kullanılabilir durumda tutmak için bu süreçlere daha çok öncelik verebilirsiniz.
  • Kullanıcının önceki durumu geri yüklenen etkinliklere geri dönebilmesi için uygulamanın, sürecinin sonlandırılmasına yardımcı olur.
  • Uygulamaların birbirleri arasındaki kullanıcı akışlarını uygulaması ve sistemin bu akışları koordine etmesi için bir yöntem sağlar. Bunun birincil örneği paylaşımdır.

Bir etkinliği Activity sınıfının alt sınıfı olarak uygularsınız. Activity sınıfı hakkında daha fazla bilgi için Etkinliklere giriş bölümüne bakın.

Hizmetler
Hizmet, her türlü nedenden dolayı bir uygulamanın arka planda çalışmaya devam etmesini sağlayan genel amaçlı bir giriş noktasıdır. Uzun süreli işlemler veya uzak işlemler için arka planda çalışan bir bileşendir. Bir hizmet, kullanıcı arayüzü sağlamaz.

Örneğin, bir hizmet kullanıcı farklı bir uygulamayı kullanırken arka planda müzik çalabilir veya kullanıcının bir etkinlikle etkileşimini engellemeden ağ üzerinden veri getirebilir. Etkinlik gibi başka bir bileşen, hizmeti başlatabilir ve etkileşimde bulunmak için çalışmasına veya bağlanmasına izin verebilir.

Bir uygulamanın nasıl yönetileceğini sisteme bildiren iki tür hizmet vardır: başlatılan hizmetler ve bağlı hizmetler.

Başlatılan hizmetler, sisteme işleri tamamlanana kadar bunları çalışır durumda tutmasını söyler. Kullanıcı uygulamadan ayrıldıktan sonra bile bazı verileri arka planda senkronize etmek veya müzik çalmak olabilir. Verilerin arka planda senkronize edilmesi veya müzik çalınması, sistem tarafından farklı şekilde işlenen farklı başlatılmış hizmet türlerini temsil eder:

  • Müzik çalma işlemi, kullanıcının doğrudan farkında olduğu bir şeydir ve uygulama, ön planda olmak istediğini belirterek bu durumu sisteme iletir ve kullanıcıya müziğin çalıştığını bildiren bir bildirim gönderir. Bu durumda, hizmetten kopması kullanıcı kötü bir deneyim yaşayacağından sistem, hizmetin sürecini çalışır durumda tutmaya öncelik verir.
  • Normal bir arka plan hizmeti kullanıcının doğrudan farkında olmadığı bir şeydir. Bu nedenle sistem, sürecini yönetme konusunda daha özgürdür. Kullanıcı açısından öncelikli olan şeyler için RAM'e ihtiyacı varsa hizmetin sonlandırılmasına ve bir süre sonra hizmetin yeniden başlatılmasına neden olabilir.

Sınır hizmetler, başka bir uygulama (veya sistem) hizmetten yararlanmak istediğini belirttiği için çalışır. Bağlı hizmet başka bir işleme API sağlar ve sistem bu işlemler arasında bir bağımlılık olduğunu bilir. Yani A işlemi, B işlemindeki bir hizmete bağlıysa sistem B işlemini ve hizmetinin A için çalışmaya devam etmesi gerektiğini bilir. Ayrıca, A işlemi kullanıcının önemsediği bir işlemse B sürecini kullanıcının da önemsediği bir işlem olarak değerlendireceğini bilir.

Esneklikleri nedeniyle hizmetler her türlü üst düzey sistem kavramı için faydalı yapı taşlarıdır. Animasyonlu duvar kağıtları, bildirim dinleyicileri, ekran koruyucular, giriş yöntemleri, erişilebilirlik hizmetleri ve diğer birçok temel sistem özelliği, uygulamaların uyguladığı ve sistem çalışırken bağlandığı hizmetler olarak oluşturulmuştur.

Bir hizmet, Service alt sınıfı olarak uygulanır. Service sınıfı hakkında daha fazla bilgi için Hizmetlere genel bakış bölümüne bakın.

Not: Uygulamanız Android 5.0 (API düzeyi 21) veya sonraki sürümleri hedefliyorsa işlemleri planlamak için JobScheduler sınıfını kullanın. JobScheduler, işleri güç tüketimini azaltacak şekilde en uygun şekilde planlayarak ve Doze API ile çalışarak pil tasarrufu avantajına sahiptir. Bu sınıfı kullanma hakkında daha fazla bilgi için JobScheduler referans belgelerine bakın.

Yayın alıcıları
Yayın alıcısı, uygulamanın sistem genelindeki yayın duyurularına yanıt verebilmesi için sistemin normal kullanıcı akışının dışında uygulamaya etkinlik göndermesini sağlayan bir bileşendir. Yayın alıcıları, uygulamaya iyi tanımlanmış bir başka giriştir. Bu nedenle sistem, o anda çalışmayan uygulamalara bile yayın gönderebilir.

Örneğin bir uygulama, kullanıcıya yaklaşan bir etkinlik hakkında bilgi vermek üzere bir bildirim yayınlamak için alarm planlayabilir. Alarm, uygulamadaki bir BroadcastReceiver cihazına gönderildiği için alarm çalana kadar uygulamanın çalışır durumda kalmasına gerek yoktur.

Ekranın kapatıldığını, pilin azaldığını veya bir resim çekildiğini duyuran bir yayın gibi birçok yayının kaynağı sistemdir. Uygulamalar da yayın başlatabilir. Örneğin, bazı verilerin cihaza indirildiğini ve bu verilerin kullanılabilir olduğunu diğer uygulamalara bildirebilir.

Yayın alıcıları bir kullanıcı arayüzü görüntülemese de bir yayın etkinliği gerçekleştiğinde kullanıcıyı uyarmak için bir durum çubuğu bildirimi oluşturabilir. Bununla birlikte, daha yaygın olarak bir yayın alıcısı diğer bileşenlere giden bir ağ geçididir ve çok az miktarda iş yapmak için tasarlanmıştır.

Örneğin, bir yayın alıcısı JobScheduler kullanarak bir etkinliğe dayalı bazı işleri gerçekleştirmek için JobService programlayabilir. Yayın alıcıları genellikle birbirleriyle etkileşimde bulunan uygulamalar içerir. Bu nedenle, bunları kurarken güvenlik açısından ne gibi etkileri olacağını göz önünde bulundurmak önemlidir.

Bir yayın alıcısı, BroadcastReceiver alt sınıfı olarak uygulanır ve her yayın bir Intent nesnesi olarak teslim edilir. Daha fazla bilgi için BroadcastReceiver sınıfına bakın.

İçerik sağlayıcılar
İçerik sağlayıcı; dosya sisteminde, SQLite veritabanında, web'de veya uygulamanızın erişebildiği diğer tüm kalıcı depolama konumlarında depolayabileceğiniz paylaşılan bir uygulama veri kümesini yönetir. İçerik sağlayıcının izin vermesi durumunda, içerik sağlayıcı üzerinden diğer uygulamalar verileri sorgulayabilir veya değiştirebilir.

Örneğin, Android sistemi kullanıcının iletişim bilgilerini yöneten bir içerik sağlayıcı sağlar. Uygun izinlere sahip tüm uygulamalar, belirli bir kişi hakkında bilgi okumak ve yazmak için ContactsContract.Data kullanarak içerik sağlayıcıya sorgu gönderebilir.

İçerik sağlayıcıyı, veritabanı üzerindeki bir soyutlama olarak düşünmek cazip gelebilir çünkü bu yaygın durum için birçok API ve destek yerleşik olarak bulunur. Ancak sistem tasarımı açısından farklı bir temel amaçları vardır.

İçerik sağlayıcı, sisteme göre bir URI şemasıyla tanımlanan adlandırılmış veri öğelerini yayınlamak için bir uygulamaya giriş noktasıdır. Böylece, bir uygulama içerdiği verileri bir URI ad alanıyla nasıl eşlemek istediğine karar verebilir ve bu URI'ları, verilere erişmek için bunları kullanabilecek diğer varlıklara dağıtabilir. Sistemin bir uygulamayı yönetirken bunu yapmasına olanak tanıyan birkaç belirli özellik vardır:

  • URI atamak için uygulamanın çalışmaya devam etmesi gerekmez. Bu nedenle, URI'lar sahip uygulamalarının izninden çıktıktan sonra da kullanılabilir. Sistemin tek yapması gereken, sahip olan bir uygulama, uygulama verilerini karşılık gelen URI'dan aldığında uygulamanın hâlâ çalıştığından emin olmalıdır.
  • Bu URI'lar ayrıca önemli ve ayrıntılı bir güvenlik modeli sağlar. Örneğin, bir uygulama panosundaki bir resmin URI'sini yerleştirebilir, ancak diğer uygulamaların serbestçe erişememesi için içerik sağlayıcısını kilitli bırakabilir. İkinci bir uygulama panodaki bu URI'ye erişmeye çalıştığında sistem, bu uygulamanın geçici bir URI izin izni kullanarak verilere erişmesine izin verebilir. Böylece, uygulama yalnızca bu URI'nın arkasındaki verilere erişebilir ve ikinci uygulamada başka hiçbir şeye erişemez.

İçerik sağlayıcılar, uygulamanıza özel olan ve paylaşılmayan verileri okuyup yazmak için de kullanışlıdır.

İçerik sağlayıcı, ContentProvider sınıfının alt sınıfı olarak uygulanır ve diğer uygulamaların işlem gerçekleştirmesini sağlayan standart bir API grubu uygulamalıdır. Daha fazla bilgi için İçerik sağlayıcılar geliştirici kılavuzuna bakın.

Android sistem tasarımının benzersiz bir yönü, herhangi bir uygulamanın başka bir uygulamanın bileşenini başlatabilmesidir. Örneğin, kullanıcının cihaz kamerasıyla fotoğraf çekmesini istiyorsanız muhtemelen bunu yapan başka bir uygulama vardır. Uygulamanız, kendi fotoğraf çekmek için bir etkinlik geliştirmek yerine bu uygulamayı kullanabilir. Kamera uygulamasındaki kodu eklemeniz, hatta bağlamanız bile gerekmez. Bunun yerine etkinliği, fotoğraf çeken kamera uygulamasında başlatabilirsiniz. Tamamlandığında, ayrıca kullanabilmeniz için fotoğraf uygulamanıza geri de gönderilir. Kullanıcıya, kamera sanki uygulamanızın bir parçasıymış gibi görünür.

Sistem bir bileşeni başlattığında, halihazırda çalışmıyorsa uygulama için işlemi başlatır ve bileşen için gereken sınıfları somutlaştırır. Örneğin, uygulamanız fotoğraf çeken kamera uygulamasında etkinliği başlatırsa bu etkinlik uygulamanızın işleminde değil, kamera uygulamasına ait işlemde çalışır. Bu nedenle, diğer çoğu sistemdeki uygulamaların aksine Android uygulamalarının tek bir giriş noktası yoktur: main() işlevi yoktur.

Sistem her uygulamayı diğer uygulamalara erişimi kısıtlayan dosya izinleriyle ayrı bir işlemde çalıştırdığından, uygulamanız başka bir uygulamadan bir bileşeni doğrudan etkinleştiremez. Ancak Android sistemi bunu yapabilir. Bir bileşeni başka bir uygulamada etkinleştirmek için sisteme, belirli bir bileşeni başlatma niyetinizi belirten bir mesaj gönderirsiniz. Daha sonra sistem, bileşeni sizin için etkinleştirir.

Bileşenleri etkinleştir

Niyet adı verilen eşzamansız bir mesaj, şu dört bileşen türünden üçünü etkinleştirir: etkinlikler, hizmetler ve yayın alıcıları. Intent'ler çalışma zamanında bağımsız bileşenleri birbirine bağlar. Bunları, ister uygulama ister başka bir bileşene ait olsun, diğer bileşenlerden işlem isteğinde bulunan mesajlar veren kişiler olarak düşünebilirsiniz.

Niyet, belirli bir bileşeni (açık intent) veya belirli bir bileşen türünü (dolaylı niyet) etkinleştirmek için bir mesaj tanımlayan Intent nesnesiyle oluşturulur.

Etkinlikler ve hizmetlerde amaç, bir şeyi görüntülemek veya göndermek gibi gerçekleştirilecek işlemi tanımlar ve başlatılmakta olan bileşenin bilmesi gerekebilecek diğer şeylerin yanı sıra üzerinde işlem yapılacak verilerin URI'sini de belirtebilir.

Örneğin bir intent, bir resmi gösterme veya bir web sayfasını açma için bir etkinlik isteğini iletebilir. Bazı durumlarda, bir sonuç almak için etkinlik başlatabilirsiniz. Bu durumda etkinlik, sonucu bir Intent ile de döndürür. Kullanıcının özel bir kişi seçip size geri getirmesi için de niyet gönderebilirsiniz. Dönüş amacı, seçilen kişiye işaret eden bir URI içerir.

Yayın alıcıları için amaç, yayın duyurusunu tanımlar. Örneğin, cihazın pil seviyesinin düşük olduğunu belirten bir yayında, yalnızca pil seviyesinin düşük olduğunu belirten bilinen bir işlem dizesi bulunur.

Etkinlikler, hizmetler ve yayın alıcılarının aksine, içerik sağlayıcılar ContentResolver isteğiyle hedeflendiğinde etkinleştirilir. İçerik çözümleyici, içerik sağlayıcıyla yapılan tüm doğrudan işlemleri işler ve sağlayıcıyla işlem yapan bileşen, ContentResolver nesnesindeki yöntemleri çağırır. Bu, içerik sağlayıcı ile bilgi isteyen bileşen arasında güvenlik nedeniyle bir soyutlama katmanı bırakır.

Her bileşen türünü etkinleştirmek için ayrı yöntemler vardır:

  • startActivity() öğesine Intent göndererek bir etkinlik başlatabilir veya ona yapılacak yeni bir şey verebilir ya da etkinliğin bir sonuç döndürmesini istiyorsanız startActivityForResult() işlemini yapabilirsiniz.
  • Android 5.0 (API düzeyi 21) ve sonraki sürümlerde işlemleri planlamak için JobScheduler sınıfını kullanabilirsiniz. Önceki Android sürümleri için startService() öğesine Intent göndererek bir hizmeti başlatabilir veya devam eden bir hizmete yeni talimatlar verebilirsiniz. bindService() adresine Intent ileterek hizmeti bağlayabilirsiniz.
  • sendBroadcast() veya sendOrderedBroadcast() gibi yöntemlere Intent ileterek bir yayın başlatabilirsiniz.
  • ContentResolver üzerinde query() çağrısı yaparak içerik sağlayıcıya sorgu gönderebilirsiniz.

Niyetleri kullanma hakkında daha fazla bilgi için Amaçlar ve Amaç Filtreleri belgesine bakın. Aşağıdaki dokümanlarda belirli bileşenleri etkinleştirme hakkında daha fazla bilgi verilmektedir: Etkinliklere giriş, Hizmetlere genel bakış, BroadcastReceiver ve İçerik sağlayıcılar.

Manifest dosyası

Android sisteminin bir uygulama bileşenini başlatabilmesi için önce uygulamanın manifest dosyasını (AndroidManifest.xml) okuyarak sistemin bu bileşenin var olduğunu bilmesi gerekir. Uygulamanız, tüm bileşenlerini uygulama proje dizininin kök dizininde bulunan bu dosyada beyan ediyor.

Manifest, uygulamanın bileşenlerini tanımlamanın yanı sıra aşağıdakiler gibi birkaç şey yapar:

  • Uygulamanın gerektirdiği tüm kullanıcı izinlerini (ör. kullanıcının kişilerine okuma erişimi veya internet erişimi) tanımlar.
  • Uygulamanın kullandığı API'lere bağlı olarak uygulamanın gerektirdiği minimum API düzeyini tanımlar.
  • Uygulama tarafından kullanılan ya da ihtiyaç duyulan donanım ve yazılım özelliklerini (ör. kamera, Bluetooth hizmetleri veya çoklu dokunmatik ekran) tanımlar.
  • Uygulamanın bağlanması gereken API kitaplıklarını (Android çerçeve API'leri hariç) ( Google Haritalar kitaplığı gibi) tanımlar.

Bileşenleri bildirme

Manifest'in birincil görevi, sistemi uygulamanın bileşenleri hakkında bilgilendirmektir. Örneğin, bir manifest dosyası bir etkinliği aşağıdaki gibi tanımlayabilir:

<?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> öğesinde android:icon özelliği, uygulamayı tanımlayan bir simgenin kaynaklarını işaret eder.

<activity> öğesinde, android:name özelliği Activity alt sınıfının tam sınıf adını belirtir. android:label özelliği ise etkinlik için kullanıcı tarafından görülebilen etiket olarak kullanılacak bir dize belirtir.

Aşağıdaki öğeleri kullanarak tüm uygulama bileşenlerini beyan etmeniz gerekir:

Kaynağınıza eklediğiniz ancak manifest dosyasında beyan etmediğiniz etkinlikler, hizmetler ve içerik sağlayıcılar sistem tarafından görülemez ve bu nedenle hiçbir zaman yayınlanamaz. Ancak yayın alıcıları manifest dosyasında tanımlanabilir veya kodda BroadcastReceiver nesne olarak dinamik bir şekilde oluşturulabilir ve registerReceiver() çağrısıyla sisteme kaydedilebilir.

Uygulamanız için manifest dosyasını yapılandırma hakkında daha fazla bilgi edinmek isterseniz Uygulama manifesti genel bakışı bölümüne bakın.

Bileşen özelliklerini bildirin

Bileşenleri etkinleştirme bölümünde açıklandığı gibi, etkinlikleri, hizmetleri ve yayın alıcılarını başlatmak için Intent kullanabilirsiniz. Bunu, amaçtaki bileşen sınıfı adını kullanıp hedef bileşeni açıkça adlandırarak yaparsınız. Ayrıca, gerçekleştirilecek işlemin türünü ve isteğe bağlı olarak işlemi gerçekleştirmek istediğiniz verileri açıklayan dolaylı intent'i de kullanabilirsiniz. Dolaylı intent, sistemin cihazda işlemi gerçekleştirebilecek ve başlatabilecek bir bileşen bulmasını sağlar. Amaçta açıklanan işlemi gerçekleştirebilecek birden fazla bileşen varsa kullanıcı hangisinin kullanılacağını seçer.

Dikkat: Service başlatmak için niyet kullanıyorsanız uygunsuz bir niyet kullanarak uygulamanızın güvenli olduğundan emin olun. Bir hizmeti başlatmak için dolaylı niyet kullanmak güvenlik açısından tehlike arz eder çünkü hangi hizmetin amaca yanıt verdiğinden emin olamazsınız ve kullanıcı hangi hizmetin başladığını göremez. Android 5.0 (API düzeyi 21) sürümünden itibaren, dolaylı bir niyetle bindService() yöntemini çağırırsanız sistem bir istisna atar. Hizmetleriniz için intent filtreleri bildirmeyin.

Sistem, alınan niyeti cihazdaki diğer uygulamaların manifest dosyasında sağlanan amaç filtreleriyle karşılaştırarak bir amaca yanıt verebilecek bileşenleri tanımlar.

Uygulamanızın manifest dosyasında bir etkinlik tanımlarken, isteğe bağlı olarak diğer uygulamaların amaçlarına yanıt verebilmesi için etkinliğin özelliklerini tanımlayan amaç filtreleri ekleyebilirsiniz. Bunu, bileşenin bildirim öğesinin alt öğesi olarak bir <intent-filter> öğesi ekleyerek yaparsınız.

Örneğin, yeni e-posta oluşturma etkinliği içeren bir e-posta uygulaması derlerseniz aşağıdaki örnekte gösterildiği gibi, yeni bir e-posta göndermek için "gönder" amaçlarına yanıt verecek bir intent filtresi beyan edebilirsiniz:

<manifest ... >
    ...
    <application ... >
        <activity android:name="com.example.project.ComposeEmailActivity">
            <intent-filter>
                <action android:name="android.intent.action.SEND" />
                <data android:type="*/*" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </activity>
    </application>
</manifest>

Başka bir uygulama ACTION_SEND işlemiyle bir amaç oluşturup startActivity() işlevine iletirse sistem etkinliğinizi başlatabilir. Böylece kullanıcı bir e-posta taslağı gönderebilir ve gönderebilir.

Niyet filtreleri oluşturma hakkında daha fazla bilgi için Amaçlar ve Amaç Filtreleri belgesine bakın.

Uygulama gereksinimlerini beyan etme

Android destekli çeşitli cihazlar vardır ve hepsi aynı özellikleri ve yetenekleri sunmaz. Uygulamanızın ihtiyaç duyduğu özellikleri sunmayan cihazlara yüklenmesini önlemek için manifest dosyanızda cihaz ve yazılım gereksinimlerini beyan ederek uygulamanızın desteklediği cihaz türleri için açıkça bir profil tanımlamanız önemlidir.

Bu beyanların çoğu yalnızca bilgilendirme amaçlıdır. Sistem bu bilgileri okumaz ancak Google Play gibi harici hizmetler, cihazlarında uygulama arayan kullanıcılara filtreleme sağlamak için bunları okur.

Örneğin, uygulamanızın bir kamera gerektirdiğini ve Android 8.0 (API düzeyi 26) ile sunulan API'leri kullandığını varsayalım. Bu şartları beyan etmeniz gerekir. minSdkVersion ve targetSdkVersion değerleri, uygulama modülünüzün build.gradle dosyasında ayarlanır:

android {
  ...
  defaultConfig {
    ...
    minSdkVersion 26
    targetSdkVersion 29
  }
}

Not: Derleme işlemi sırasında minSdkVersion ve targetSdkVersion değerlerini doğrudan manifest dosyasında ayarlamayın. Aksi takdirde, Gradle bunların üzerine yazılmaz. Daha fazla bilgi için API düzeyi gereksinimlerini belirtme bölümüne bakın.

Kamera özelliğini uygulamanızın manifest dosyasında beyan edersiniz:

<manifest ... >
    <uses-feature android:name="android.hardware.camera.any"
                  android:required="true" />
    ...
</manifest>

Bu örneklerde gösterilen beyanlar dikkate alındığında, kamerası olmayan veya Android 8.0'dan eski bir Android sürümüne sahip cihazlarda uygulamanızı Google Play'den yükleyemezsiniz. Ancak, uygulamanızın kamerayı kullandığını ancak kameraya gerektirmediğini de belirtebilirsiniz. Bunun için required özelliğini false olarak ayarlar, çalışma zamanında cihazda kamera olup olmadığını kontrol eder ve gerektiğinde kamera özelliklerini devre dışı bırakırsınız.

Uygulamanızın farklı cihazlarla uyumluluğunu nasıl yönetebileceğiniz hakkında daha fazla bilgiyi Cihaz uyumluluğuna genel bakış bölümünde bulabilirsiniz.

Uygulama kaynakları

Android uygulamaları sadece bir koddan oluşur. Bunun için resimler, ses dosyaları ve uygulamanın görsel sunumuyla ilgili her şey gibi kaynak koddan ayrı kaynaklar gerekir. Örneğin, XML dosyalarıyla animasyonlar, menüler, stiller, renkler ve etkinlik kullanıcı arayüzlerinin düzenini tanımlayabilirsiniz.

Uygulama kaynaklarını kullanmak, kodu değiştirmeden uygulamanızın çeşitli özelliklerini güncellemeyi kolaylaştırır. Alternatif kaynak grupları sağlayarak uygulamanızı farklı diller ve ekran boyutları gibi çeşitli cihaz yapılandırmaları için optimize edebilirsiniz.

SDK derleme araçları, Android projenize eklediğiniz her kaynak için benzersiz bir tam sayı kimliği tanımlar. Bu kimliği, uygulama kodunuzdaki veya XML'de tanımlanan diğer kaynaklardan alınan kaynağa referans vermek için kullanabilirsiniz. Örneğin, uygulamanız logo.png adlı bir resim dosyası içeriyorsa (res/drawable/ dizinine kaydedilir) SDK araçları, R.drawable.logo adlı bir kaynak kimliği oluşturur. Bu kimlik, resme referans vermek ve kullanıcı arayüzünüze eklemek için kullanabileceğiniz, uygulamaya özel bir tam sayıyla eşlenir.

Kaynak kodunuzdan ayrı olarak kaynak sağlamanın en önemli yanlarından biri, farklı cihaz yapılandırmaları için alternatif kaynaklar sunabilme olanağıdır.

Örneğin, XML'de kullanıcı arayüzü dizeleri tanımlayarak bu dizeleri diğer dillere çevirebilir ve ayrı dosyalara kaydedebilirsiniz. Ardından Android, kaynak dizininin adına eklediğiniz bir dil niteleyicisine (ör. Fransızca dize değerleri için res/values-fr/) ve kullanıcının dil ayarına göre kullanıcı arayüzünüze uygun dil dizelerini uygular.

Android, alternatif kaynaklarınız için birçok niteleyiciyi destekler. Niteleyici, bu kaynakların kullanıldığı cihaz yapılandırmasını tanımlamak amacıyla kaynak dizinlerinizin adına eklediğiniz kısa bir dizedir.

Örneğin, cihazın ekran yönüne ve boyutuna bağlı olarak etkinlikleriniz için farklı düzenler oluşturabilirsiniz. Cihaz ekranı dikey (yüksek) yönde olduğunda, düğmelerin dikey olarak düzenlendiği bir düzen isteyebilirsiniz, ancak ekran yatay (geniş) yönde olduğunda düğmelerin yatay olarak hizalanmasını isteyebilirsiniz. Düzeni yöne bağlı olarak değiştirmek için iki düzen tanımlayabilir ve her bir düzenin dizin adına uygun niteleyiciyi uygulayabilirsiniz. Ardından, sistem geçerli cihaz yönüne göre uygun düzeni otomatik olarak uygular.

Uygulamanıza ekleyebileceğiniz farklı kaynak türleri ve farklı cihaz yapılandırmaları için alternatif kaynakların nasıl oluşturulacağı hakkında daha fazla bilgi edinmek için Uygulama kaynaklarına genel bakış bölümünü okuyun. En iyi uygulamalar ve sağlam, üretim kalitesinde uygulamalar tasarlama hakkında daha fazla bilgi edinmek için Uygulama mimarisi rehberine bakın.

Ek kaynaklar

Videolar ve kod eğiticileri kullanarak Android geliştirmeyi öğrenmek için Kotlin ile Android Uygulamaları Geliştirme Udacity kursuna bakın.

Şununla ilgili okumaya devam edin:

Niyetler ve Amaç Filtreleri
Etkinlikler ve hizmetler gibi uygulama bileşenlerini etkinleştirmek için Intent API'lerini nasıl kullanacağınızı ve uygulama bileşenlerinizi başka uygulamalar tarafından kullanılabilir hale nasıl getireceğinizi öğrenin.
Etkinliklere giriş
Uygulamanızda kullanıcı arayüzüyle ayrı bir ekran sağlayan Activity sınıfının örneğini nasıl oluşturacağınızı öğrenin.
Uygulama kaynaklarına genel bakış
Uygulama kaynaklarını uygulama kodundan ayırmak için Android uygulamalarının nasıl yapılandırıldığını ve belirli cihaz yapılandırmaları için nasıl alternatif kaynaklar sağlayabileceğinizi öğrenin.

Diğer önemli bilgiler:

Cihaz uyumluluğuna genel bakış
Android'in farklı cihaz türlerinde nasıl çalıştığını ve uygulamanızı her cihaz için nasıl optimize edebileceğinizi veya uygulamanızın kullanılabilirliğini farklı cihazlarla nasıl kısıtlayabileceğinizi öğrenin.
Android'de izinler
Android'in, uygulamanızın bu API'leri kullanabilmesi için kullanıcıdan izin almasını gerektiren bir izin sistemiyle belirli API'lere uygulama erişimini nasıl kısıtladığını öğrenin.