Uygulama İçeriğine Derin Bağlantılar Oluşturma

Tıklanan bir bağlantı veya programatik istek bir web URI intent'i çağırdığında Android sistemi, istek başarılı olana kadar aşağıdaki işlemlerin her birini sırayla dener:

  1. Kullanıcının tercih ettiği ve URI'yi işleyebilecek uygulamayı (belirlenmişse) açın.
  2. URI'yi işleyebilecek tek uygulamayı açın.
  3. Kullanıcının bir iletişim kutusundan uygulama seçmesine izin verin.

İçeriğinizin bağlantılarını oluşturmak ve test etmek için aşağıdaki adımları uygulayın. Android uygulama bağlantıları eklemek için Android Studio'daki Uygulama Bağlantıları Asistanı'nı da kullanabilirsiniz.

Not: Android 12'den (API düzeyi 31) itibaren, genel bir web intent'i yalnızca uygulamanız söz konusu web intent'inde yer alan belirli bir alan için onaylanmışsa uygulamanızdaki bir etkinliğe çözümlenir. Uygulamanız alan için onaylanmamışsa web intent'i kullanıcının varsayılan tarayıcı uygulamasına yönlendirilir.

Gelen bağlantılar için intent filtreleri ekleme

Uygulama içeriğinizin bağlantısını oluşturmak için manifest dosyanıza aşağıdaki öğeleri ve özellik değerlerini içeren bir intent filtresi ekleyin:

<action>
Amaç filtresine Google Arama'dan ulaşılabilmesi için ACTION_VIEW intent işlemini belirtin.
<data>
Her biri etkinliğe yönlendiren bir URI biçimini temsil eden bir veya daha fazla <data> etiketi ekleyin. <data> etiketi en azından android:scheme özelliğini içermelidir.

Etkinliğin kabul ettiği URI türünü daha da hassaslaştırmak için daha fazla özellik ekleyebilirsiniz. Örneğin, benzer URI'leri kabul eden ancak yalnızca yol adına göre farklı olan birden fazla etkinliğiniz olabilir. Bu durumda, sistemin farklı URI yolları için hangi etkinliği açması gerektiğini belirlemek üzere android:path özelliğini veya pathPattern ya da pathPrefix varyantlarını kullanın.

<category>
BROWSABLE kategorisini ekleyin. Intent filtresine web tarayıcısından erişilebilmesi için gereklidir. Bu olmadan, tarayıcıda bir bağlantı tıklandığında uygulamanız çözümlenemez.

DEFAULT kategorisini de ekleyin. Bu sayede uygulamanız, örtülü intent'lere yanıt verebilir. Bu olmadan etkinlik yalnızca intent'te uygulama bileşeninizin adı belirtilirse başlatılabilir.

Aşağıdaki XML snippet'inde, derin bağlantı için manifest'inizde nasıl intent filtresi belirtebileceğiniz gösterilmektedir. Hem “example://gizmos” hem de “http://www.example.com/gizmos” URI'leri bu etkinliğe yönlendirir.

<activity
    android:name="com.example.android.GizmosActivity"
    android:label="@string/title_gizmos" >
    <intent-filter android:label="@string/filter_view_http_gizmos">
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />
        <!-- Accepts URIs that begin with "http://www.example.com/gizmos” -->
        <data android:scheme="http"
              android:host="www.example.com"
              android:pathPrefix="/gizmos" />
        <!-- note that the leading "/" is required for pathPrefix-->
    </intent-filter>
    <intent-filter android:label="@string/filter_view_example_gizmos">
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />
        <!-- Accepts URIs that begin with "example://gizmos” -->
        <data android:scheme="example"
              android:host="gizmos" />
    </intent-filter>
</activity>

İki intent filtresinin yalnızca <data> öğesinde farklılık gösterdiğini unutmayın. Aynı filtreye birden fazla <data> öğesi dahil etmek mümkün olsa da, benzersiz URL'ler (ör. scheme ve host'nin belirli bir kombinasyonu) belirtmek istiyorsanız ayrı filtreler oluşturmanız önemlidir. Bunun nedeni, aynı intent filtresindeki birden fazla <data> öğesinin, birleştirilmiş özelliklerinin tüm varyasyonlarını hesaba katmak için birlikte birleştirilmesidir. Örneğin, aşağıdakileri göz önünde bulundurabilirsiniz:

<intent-filter>
  ...
  <data android:scheme="https" android:host="www.example.com" />
  <data android:scheme="app" android:host="open.my.app" />
</intent-filter>

Bu, yalnızca https://www.example.com ve app://open.my.app'ü destekler gibi görünebilir. Ancak aslında bu ikisinin yanı sıra app://www.example.com ve https://open.my.app'i de destekler.

Dikkat: Birden fazla etkinlik, aynı doğrulanmış Android uygulama bağlantısına yönlendiren intent filtreleri içeriyorsa bağlantıyı hangi etkinliğin işleyeceği konusunda garanti verilmez.

Uygulama manifest dosyanıza etkinlik içeriği URI'leri içeren intent filtreleri ekledikten sonra Android, URI'leri eşleşen tüm Intent'leri çalışma zamanında uygulamanıza yönlendirebilir.

Intent filtrelerini tanımlama hakkında daha fazla bilgi edinmek için Diğer Uygulamaların Etkinliğinizi Başlatmasına İzin Verme başlıklı makaleyi inceleyin.

Gelen intent'lerden verileri okuma

Sistem, etkinliğinizi bir intent filtresi aracılığıyla başlattıktan sonra, neyi oluşturmanız gerektiğini belirlemek için Intent tarafından sağlanan verileri kullanabilirsiniz. Gelen Intent ile ilişkili verileri ve işlemi almak için getData() ve getAction() yöntemlerini çağırın. Bu yöntemleri etkinliğin yaşam döngüsü sırasında dilediğiniz zaman çağırabilirsiniz ancak genellikle onCreate() veya onStart() gibi erken geri çağırma sırasında çağırmanız gerekir.

Aşağıda, bir Intent'ten nasıl veri alınacağını gösteren bir snippet verilmiştir:

Kotlin

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.main)

    val action: String? = intent?.action
    val data: Uri? = intent?.data
}

Java

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    Intent intent = getIntent();
    String action = intent.getAction();
    Uri data = intent.getData();
}

Kullanıcı deneyimini iyileştirmek için aşağıdaki en iyi uygulamaları uygulayın:

  • Derin bağlantılar herhangi bir istem, ara sayfa veya giriş işlemi olmadan kullanıcıları doğrudan içeriğe yönlendirmelidir. Daha önce uygulamayı hiç açmamış olsalar bile kullanıcıların uygulama içeriğini görebildiğinden emin olun. Sonrasında gerçekleştirilecek etkileşimlerde veya uygulamayı Launcher'dan açtıklarında kullanıcılara istem göndermekte bir sakınca yoktur.
  • Kullanıcılar, uygulamanıza derin bağlantı aracılığıyla girdikten sonra uygulamanızın, geriye doğru gezinme açısından kullanıcıların beklentilerini karşıladığından emin olmak için Geri ve Yukarı tuşlarıyla gezinme bölümünde açıklanan tasarım yönergelerini uygulayın.

Derin bağlantılarınızı test etme

Derin bağlantı için belirttiğiniz intent filtresi URI'lerinin doğru uygulama etkinliğine yönlendirip yönlendirmediğini test etmek üzere etkinlik yöneticisi (am) aracıyla birlikte Android Hata Ayıklama Köprüsü'nü kullanabilirsiniz. adb komutunu bir cihazda veya emülatörde çalıştırabilirsiniz.

Bir intent filtresi URI'sini adb ile test etmek için genel söz dizimi şudur:

$ adb shell am start
        -W -a android.intent.action.VIEW
        -d <URI> <PACKAGE>

Örneğin, aşağıdaki komut, belirtilen URI ile ilişkili bir hedef uygulama etkinliğini görüntülemeye çalışır.

$ adb shell am start
        -W -a android.intent.action.VIEW
        -d "example://gizmos" com.example.android

Yukarıda ayarladığınız manifest beyanı ve intent işleyici, uygulamanız ile web sitesi arasındaki bağlantıyı ve gelen bağlantılarla ne yapılacağını tanımlar. Ancak sistemin, uygulamanızı bir URI grubu için varsayılan işleyici olarak ele almasını sağlamak amacıyla sistemin bu bağlantıyı doğrulamasını da istemeniz gerekir. Bu doğrulamanın nasıl uygulanacağı sonraki derste açıklanmıştır.

Intent'ler ve uygulama bağlantıları hakkında daha fazla bilgi edinmek için aşağıdaki kaynaklara göz atın: