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

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

  1. URI'yı işleyebilecek, kullanıcının tercih ettiği uygulamayı (tanımlanmışsa) açın.
  2. URI'yı işleyebilen kullanılabilir tek uygulamayı açın.
  3. Kullanıcının iletişim kutusundan uygulama seçmesine izin ver.

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

Not: Android 12'den (API düzeyi 31) itibaren, genel bir web amacı, yalnızca uygulamanız ilgili web amacında yer alan belirli alan için onaylanmışsa uygulamanızdaki bir etkinliğe çözümlenir. Uygulamanız alan için onaylanmazsa, web amacı bunun yerine kullanıcının varsayılan tarayıcı uygulamasına çözümlenir.

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

Uygulama içeriğinize bağlantı oluşturmak için manifest dosyanıza şu öğeleri ve özellik değerlerini içeren bir intent filtresi ekleyin:

<action>
Niyet filtresine Google Arama'dan erişilebilmesi için ACTION_VIEW amaç işlemini belirtin.
<data>
Her biri, etkinliğe çözümlenen 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 yol adına göre farklılık gösteren birden fazla etkinliğiniz olabilir. Bu durumda, sistemin farklı URI yolları için hangi etkinliği açması gerektiğini ayırt etmek amacıyla android:path özelliğini ya da pathPattern veya pathPrefix varyantlarını kullanın.

<category>
BROWSABLE kategorisini dahil edin. Amaç filtresine bir web tarayıcısından erişilebilmesi için bu gereklidir. Bu olmadan, tarayıcıda bir bağlantının tıklanması uygulamanız için çözümlenemez.

DEFAULT kategorisini de ekleyin. Bu sayede uygulamanız dolaylı amaçlara yanıt verebilir. Bu olmadan, etkinlik yalnızca amaç uygulama bileşeninizin adını belirtirse başlatılabilir.

Aşağıdaki XML snippet'i, derin bağlantılar için manifest'inizde bir intent filtresini nasıl belirtebileceğinizi göstermektedir. URI'ların her ikisi de “example://gizmos” ve “http://www.example.com/gizmos” bu etkinliğe çözümlenir.

<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> öğesine göre farklı olduğuna dikkat edin. Aynı filtreye birden fazla <data> öğesi eklemek mümkün olsa da, benzersiz URL'ler bildirmek istediğinizde ayrı filtreler oluşturmanız önemlidir (örneğin, belirli bir scheme ve host kombinasyonu). Çünkü aynı niyet filtresindeki birden çok <data> öğesi, birleşik özelliklerinin tüm varyasyonlarını hesaba katacak şekilde birleştirilir. Örneğin, aşağıdakileri göz önünde bulundurun:

<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 öğelerini destekliyor gibi görünebilir. Ancak, gerçekte bu ikisini ve ayrıca şu ikisini de destekler: app://www.example.com ve https://open.my.app.

Dikkat: Birden fazla etkinlik, doğrulanmış aynı Android Uygulama Bağlantısı'na çözümlenen amaç filtreleri içeriyorsa bağlantıyı hangi etkinliğin işleyeceğine dair bir garanti yoktur.

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

Amaç filtreleri tanımlama hakkında daha fazla bilgi edinmek için Diğer Uygulamaların Etkinliğinizi Başlatmasına İzin Verme bölümüne bakın.

Gelen amaçlardan gelen verileri okuma

Sistem bir intent filtresiyle etkinliğinizi başlattıktan sonra, oluşturmanız gerekenleri 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ü boyunca istediğiniz zaman çağırabilirsiniz ancak genellikle onCreate() veya onStart() gibi erken geri çağırmalar sırasında bunu yapmanız gerekir.

Intent öğesinden verilerin nasıl alınacağını gösteren bir snippet'i burada bulabilirsiniz:

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 uygulamalardan yararlanın:

  • Derin bağlantı; kullanıcıları herhangi bir istem, ara sayfa veya giriş bilgisi olmadan doğrudan içeriğe yönlendirmelidir. Kullanıcıların uygulamayı daha önce hiç açmamış olsalar bile uygulama içeriğini görebildiğinden emin olun. Sonraki etkileşimlerde veya uygulamayı Başlatıcı'dan açtıklarında kullanıcılara istem gönderebilirsiniz.
  • Uygulamanızın, kullanıcılar bir derin bağlantı üzerinden uygulamanıza girdikten sonra geriye doğru gezinme beklentilerini karşılaması için Geri ve Yukarı Yönlü Gezinme bölümünde açıklanan tasarım yönergelerini uygulayın.

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

Derin bağlantılar için belirttiğiniz amaç filtresi URI'larının doğru uygulama etkinliğine çözümlenip çözümlenmediğini test etmek için etkinlik yöneticisi (am) aracıyla Android Hata Ayıklama Köprüsü'nü kullanabilirsiniz. Adb komutunu bir cihaza veya emülatöre karşı çalıştırabilirsiniz.

Niyet filtresi URI'sını adb ile test etmek için kullanılan genel söz dizimi şöyledir:

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

Örneğin aşağıdaki komut, belirtilen URI ile ilişkilendirilmiş 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 ilgili olarak ne yapılacağını tanımlar. Ancak sistemin, uygulamanızı bir dizi URI'nın varsayılan işleyicisi olarak değerlendirmesi için sistemin bu bağlantıyı doğrulamasını da istemeniz gerekir. Sonraki derste, bu doğrulamanın nasıl uygulanacağı açıklanmaktadır.

Niyetler ve uygulama bağlantıları hakkında daha fazla bilgi edinmek için aşağıdaki kaynaklara bakın: