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 bir Android uygulamasının içeriğini içerir ve 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 (çalışma zamanında gerekli olmayan bazı ek meta veriler dahil) içerir. AAB bir yayınlama biçimidir ve Android cihazlara yüklenemez. APK oluşturmayı ve sonraki bir aşamaya imzalamayı 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.
  • Sistem, varsayılan olarak her uygulamaya benzersiz bir Linux kullanıcı kimliği atar. Bu kullanıcı kimliği yalnızca sistem tarafından kullanılan ve uygulama tarafından tanınmaz. Sistem, bir uygulamadaki tüm dosyalara ilişkin izinleri, yalnızca uygulamaya atanan kullanıcı kimliği tarafından erişilebilecek şekilde ayarlar.
  • Her işlemin kendi sanal makinesi (VM) olduğundan, uygulamanın kodu diğer uygulamalardan ayrı olarak çalışır.
  • Varsayılan olarak her uygulama kendi Linux işleminde çalışır. Android sistemi, uygulamanın herhangi bir bileşeninin 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. Diğer bir deyişle her uygulama, varsayılan olarak yalnızca kendi işini yapmak için gereken bileşenlere erişebilir ve başka hiçbir bileşene erişemez. Bu durum, uygulamanın izin verilmeyen sistem parçalarına erişemediği çok güvenli bir ortam oluşturur.

Bununla birlikte, 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 ve bu durumda birbirlerinin dosyalarına erişebilirler. Aynı kullanıcı kimliğine sahip uygulamalar, sistem kaynaklarını korumak için aynı Linux işleminde çalışacak ve aynı sanal makineyi paylaşacak şekilde de ayarlanabilir. Ayrıca uygulamalar aynı sertifikayla imzalanmalıdır.
  • 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 konusuna göz atın.

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ünce optimize etmesine olanak tanıyan kaynaklardır.

Uygulama bileşenleri

Uygulama bileşenleri bir Android uygulamasının temel yapı taşlarıdır. Her bileşen, sistemin veya kullanıcının uygulamanıza girebileceği bir giriş noktasıdır. Bazı bileşenler diğer bileşenlere 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 farklı bir amaca hizmet eder ve bir bileşenin nasıl oluşturulup yok edildiğini tanımlayan ayrı bir yaşam döngüsüne sahiptir. 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. Bir kullanıcı arayüzüne sahip tek bir ekranı temsil eder. Örneğin, bir e-posta uygulamasında yeni e-posta 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 e-posta uygulamasındaki yeni e-posta oluşturma etkinliğini başlatabilir.

Etkinlikler, 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 şu anda önem verdiği konuların (ekrandakiler) takibini yapma.
  • Daha önce kullanılan işlemlerden hangilerinin kullanıcının geri dönebileceği durdurulmuş etkinlikleri içerdiğini bilmek ve kullanılabilir olmalarını sağlamak için bu işlemlere daha yüksek öncelik vermek.
  • Kullanıcının önceki durumu geri kazanarak etkinliklere geri dönebilmesi için uygulamanın işlenmesine yardımcı olur.
  • Uygulamaların birbirleri arasındaki kullanıcı akışlarını uygulaması ve sistemin bu akışları koordine etmesi için bir yol sağlar. Bunun birincil örneği paylaşmadı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, bir uygulamanın her türlü nedenle arka planda çalışmaya devam etmesini sağlamak için kullanılan genel amaçlı bir giriş noktasıdır. Uzun süren işlemleri gerçekleştirmek veya uzak işlemlerde çalışmak için arka planda çalışan bir bileşendir. Hizmet, kullanıcı arayüzü sağlamaz.

Örneğin, bir hizmet, kullanıcı farklı bir uygulamadayken 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 hizmeti çalıştırmasına veya bağlanmasına izin verebilir.

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

Başlatılan hizmetler, sisteme söz konusu çalışmaların tamamlanmasına kadar bu hizmetlerin çalışmaya devam etmesini bildirir. Bunun için, arka planda bazı verilerin senkronize edilmesi veya kullanıcı uygulamadan ayrıldıktan sonra bile müzik çalınması gerekebilir. Verileri arka planda senkronize etmek veya müzik çalmak, sistemin farklı şekilde işlediği farklı başlatılmış hizmet türlerini temsil eder:

  • Müzik çalma, kullanıcının doğrudan farkında olduğu bir şeydir ve uygulama, ön planda olmak istediğini söyleyerek bunu sisteme iletir. Bir bildirimle kullanıcıya müzik çalmakta olduğunu belirtir. Bu durumda sistem, hizmetin kesintiye uğraması durumunda kullanıcının kötü bir deneyim yaşaması nedeniyle işlemin devam etmesini sağlamaya öncelik verir.
  • Normal bir arka plan hizmeti kullanıcının doğrudan farkında olmadığı bir şey olduğundan sistem, sürecini yönetme konusunda daha özgür olur. Kullanıcıyı daha acil ilgilendiren şeyler için RAM'e ihtiyaç duyuyorsa hizmetin sonlandırılmasına ve daha sonra hizmetin yeniden başlatılmasına izin verebilir.

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 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. Dahası, A süreci kullanıcı için önemliyse 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 konsepti için faydalı yapı taşlarıdır. Animasyonlu duvar kağıtları, bildirim dinleyiciler, ekran koruyucular, giriş yöntemleri, erişilebilirlik hizmetleri ve diğer birçok temel sistem özelliği, uygulamaların uyguladığı ve çalışırken sistemin bağlandığı hizmetler olarak oluşturulur.

Bir hizmet, Service alt sınıfı olarak uygulanır. Service sınıfı hakkında daha fazla bilgi için Hizmetlere genel bakış sayfasını inceleyin.

Not: Uygulamanız Android 5.0 (API düzeyi 21) veya sonraki bir sürümü hedefliyorsa işlemleri planlamak için JobScheduler sınıfını kullanın. JobScheduler, güç tüketimini azaltacak şekilde işleri 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 ilişkin başka bir iyi tanımlanmış giriş olduğundan, 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 numarasına verildiğinden alarm çalana kadar uygulamanın çalışmaya devam etmesine gerek yoktur.

Ekranın kapatıldığını, pilin azaldığını veya bir görüntü çekildiğini bildiren bir yayın gibi birçok yayın sistemden yapılır. Uygulamalar ayrıca yayın başlatabilir. Örneğin, diğer uygulamalara bazı verilerin cihaza indirildiğini ve bu verilerin kullanılabilir olduğunu bildirmek için kullanabilirsiniz.

Yayın alıcıları, 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 kullanılan bir yayın alıcısı, diğer bileşenlere giden bir ağ geçididir ve asgari miktarda iş yapmak üzere tasarlanmıştır.

Örneğin, bir yayın alıcısı bir etkinliğe dayalı bazı işleri gerçekleştirmek için JobScheduler kullanarak JobService planlayabilir. Yayın alıcıları genellikle birbirleriyle etkileşimde bulunan uygulamalar içerir. Bu nedenle, cihazları ayarlarken güvenlik açısından olası etkilerinin farkında olmak önemlidir.

Yayın alıcısı, BroadcastReceiver alt sınıfı olarak uygulanır ve her yayın bir Intent nesnesi olarak gönderilir. 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 herhangi bir kalıcı depolama konumunda depolayabileceğiniz paylaşılan bir uygulama veri kümesini yönetir. İçerik sağlayıcının izin vermesi hâlinde diğer uygulamalar, içerik sağlayıcı üzerinden 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 içerik sağlayıcıya sorgu gönderebilir (ör. ContactsContract.Data kullanmak).

İçerik sağlayıcıyı, veritabanı üzerindeki bir soyutlama olarak düşünmek cazip gelebilir, çünkü bu yaygın durum için çok fazla 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 URI şemasıyla tanımlanan adlandırılmış veri öğelerini yayınlamak için bir uygulamaya giriş noktasıdır. Bu şekilde, 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 olduğu uygulamalardan çıktıktan sonra devam edebilir. Sistemin tek yapması gereken, sahip uygulamanın verilerini karşılık gelen URI'den alırken uygulamanın hâlâ çalıştığından emin olmasıdır.
  • Bu URI'ler ayrıca önemli ve ayrıntılı bir güvenlik modeli sunar. Örneğin, bir uygulama panoda bulunan bir resmin URI'sini yerleştirebilir, ancak diğer uygulamaların bu resme kolayca 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, geçici bir URI 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 faydalıdır.

İçerik sağlayıcı, ContentProvider 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 özelliği, herhangi bir uygulamanın başka bir uygulamanın bileşenini başlatabilmesidir. Örneğin, kullanıcının cihaz kamerasıyla bir 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 fotoğrafı kullanabilir. Kodu eklemeniz, hatta kamera uygulamasından eklemeniz bile gerekmez. Bunun yerine, fotoğraf çeken kamera uygulamasında etkinliği başlatabilirsiniz. Tamamlandığında fotoğraf, kullanabilmeniz için uygulamanıza bile iade edilir. Kullanıcıya, kamera aslında uygulamanızın bir parçası gibi görünür.

Sistem bir bileşeni başlattığında, halihazırda çalışmıyorsa bu 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 bir etkinlik 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 uygulamalardan farklı olarak 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 uygulamadaki bileşenleri 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, dört bileşen türünden üçünü etkinleştirir: etkinlikler, hizmetler ve yayın alıcıları. Amaçlar çalışma zamanında bağımsız bileşenleri birbirine bağlar. Bunları, bileşenin uygulamanıza veya başka bir öğeye ait olmasına bakılmaksızın, diğer bileşenlerden bir işlem isteğinde bulunan mesajlar olarak düşünebilirsiniz.

Niyet, belirli bir bileşeni (açık niyet) veya belirli bir bileşen türünü (dolaylı niyet) etkinleştirmek için bir mesaj tanımlayan bir 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 belirtebilir.

Örneğin bir intent, bir resmi gösterme veya bir web sayfasını açma konusunda bir etkinlik isteği iletebilir. Bazı durumlarda, sonuç almak için bir etkinlik başlatabilirsiniz. Bu durumda etkinlik, sonucu bir Intent ile de döndürür. Ayrıca, kullanıcının özel bir kişi seçip e-postasının size geri verilmesini sağlamak için de bir intent gönderebilirsiniz. Dönüş amacı, seçilen kişiyi işaret eden bir URI içerir.

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

Etkinlik, hizmet 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şlemler gerçekleştiren bileşen, ContentResolver nesnesinde yöntemleri çağırır. Bu işlem, 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 etkinliği başlatabilir veya yeni bir şey kazandırabilirsiniz. Etkinliğin bir sonuç döndürmesini istediğinizde startActivityForResult().
  • Android 5.0 (API düzeyi 21) ve sonraki sürümlerde işlem 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 yayın başlatabilirsiniz.
  • ContentResolver üzerinden query() çağırarak içerik sağlayıcıya sorgu gönderebilirsiniz.

Niyetleri kullanma hakkında daha fazla bilgi için Niyetler ve Amaç Filtreleri dokümanına bakın. Aşağıdaki dokümanlarda belirli bileşenleri etkinleştirme hakkında daha fazla bilgi sağlanmaktadır: 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 mevcut 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 bildirmenin yanı sıra aşağıdakiler gibi birkaç şey yapar:

  • Uygulamanın gerektirdiği tüm kullanıcı izinlerini (ör. internet erişimi veya kullanıcının kişilerine okuma erişimi) tanımlar.
  • Uygulamanın kullandığı API'lere bağlı olarak uygulamanın ihtiyaç duyduğu minimum API düzeyini belirtir.
  • Kamera, Bluetooth hizmetleri veya çok noktalı ekran gibi uygulamanın kullandığı veya gerektirdiği donanım ve yazılım özelliklerini tanımlar.
  • Uygulamanın bağlanması gereken API kitaplıklarını (Android çerçeve API'leri hariç) belirtir (ör. Google Haritalar kitaplığı).

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 nitelikli sınıf adını, android:label özelliği ise etkinlik için kullanıcı tarafından görülebilen etiket olarak kullanılacak bir dizeyi belirtir.

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

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

Uygulamanızın manifest dosyasını nasıl yapılandıracağınız hakkında daha fazla bilgi için Uygulama manifest dosyasına 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çta 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 implicit intent'i de kullanabilirsiniz. Dolaylı intent, sistemin cihazda işlemi gerçekleştirebilecek ve başlatabilecek bir bileşen bulmasına olanak tanır. Amaç tarafından 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 açık olmayan bir amaç kullanarak uygulamanızın güvenli olduğundan emin olun. Bir hizmeti başlatmak için dolaylı niyet kullanmak güvenlik açısından bir tehlikedir. Çü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 amaçla bindService() yöntemini çağırırsanız sistem bir istisna oluşturur. Hizmetleriniz için intent filtreleri beyan etmeyin.

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

Uygulamanızın manifest dosyasında bir etkinlik bildirdiğinizde, diğer uygulamalardaki amaçlara yanıt verebilmek için etkinliğin özelliklerini tanımlayan amaç filtreleri ekleyebilirsiniz. Bunu, bileşenin bildirim öğesinin alt öğesi olarak bir <intent-filter> öğesi ekleyerek yapabilirsiniz.

Ö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 üzere "gönder" amaçlarına yanıt verecek bir intent filtresi tanımlayabilirsiniz:

<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şturur ve bunu startActivity() işlevine iletirse sistem, kullanıcının e-posta taslağını hazırlayıp gönderebilmesi için etkinliğinizi başlatabilir.

Niyet filtreleri oluşturma hakkında daha fazla bilgi için Niyetler ve Amaç Filtreleri dokümanına bakın.

Uygulama gereksinimlerini beyan etme

Android ile desteklenen çeşitli cihazlar vardır ve bu cihazların hepsi aynı özellikleri ve imkanları sunmaz. Uygulamanızın ihtiyaç duyduğu özelliklere sahip olmayan cihazlara yüklenmesini engellemek için manifest dosyanızda cihaz ve yazılım gereksinimlerini belirterek uygulamanızın desteklediği cihaz türlerine ilişkin bir profili net bir şekilde 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 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: minSdkVersion ve targetSdkVersion değerlerini doğrudan manifest dosyasında ayarlamayın. Aksi takdirde, derleme işlemi sırasında Gradle bunların üzerine yazılır. 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 belirtilen beyanlar sayesinde, kamerası olmayan veya Android 8.0'dan eski bir Android sürümüne sahip cihazlar uygulamanızı Google Play'den yükleyemez. Bununla birlikte, uygulamanızın kamerayı kullandığını ancak kameraya gerektirmediğini de beyan edebilirsiniz. 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 koddan ibaret değildir. 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 kodunuzdan veya XML'de tanımlanan diğer kaynaklardan referans vermek için kullanabilirsiniz. Örneğin, uygulamanız res/drawable/ dizinine kaydedilen logo.png adlı bir resim dosyası içeriyorsa SDK araçları R.drawable.logo adlı bir kaynak kimliği oluşturur. Bu kimlik, uygulamaya özel bir tam sayıyla eşlenir. Bu değeri, resme referans vermek ve resmi kullanıcı arayüzünüze eklemek için kullanabilirsiniz.

Kaynak kodunuzdan ayrı olarak kaynak sağlamanın en önemli yönlerinden biri, farklı cihaz yapılandırmaları için alternatif kaynaklar sağlayabilmenizdir.

Ö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üne 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 düzenin dizin adına uygun niteleyiciyi uygulayabilirsiniz. Ardından, sistem cihazın mevcut 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 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ştirme sürecini öğrenmek için Kotlin ile Android Uygulamaları Geliştirme Udacity kursuna göz atın.

Şu konuları okumaya devam edin:

Niyetler ve Amaç Filtreleri
Intent API'lerini kullanarak etkinlikler ve hizmetler gibi uygulama bileşenlerini nasıl etkinleştireceğinizi ve uygulama bileşenlerinizi başka uygulamalar tarafından kullanılabilir hale nasıl getireceğinizi öğrenin.
Etkinliklere giriş
Kullanıcı arayüzüyle uygulamanızda farklı bir ekran sunan Activity sınıfının bir örneğini nasıl oluşturacağınızı öğrenin.
Uygulama kaynaklarına genel bakış
Android uygulamalarının, uygulama kaynaklarını uygulama kodundan ayıracak şekilde 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 konular:

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ı rızasını gerektiren bir izin sistemiyle belirli API'lere uygulama erişimini nasıl kısıtladığını öğrenin.