Bir hedef için derin bağlantı oluşturma

Android'de derin bağlantı, sizi doğrudan belirli bir web sitesine bir hedeftir.

Gezinme bileşeni, iki farklı tür derin bağlantı oluşturmanıza olanak tanır: açık ve dolaylı.

Açık bir derin bağlantı oluşturma

Açık derin bağlantı, tek bir örnektir PendingIntent kullanan bir derin bağlantının kullanıcıları uygulamanızda belirli bir konuma götürmek için kullanılır. Bir kullanıcının dikkatini dağıtan bir bildirimin veya uygulama widget'ının parçası olarak açık derin bağlantı, örneğine bakalım.

Bir kullanıcı uygulamanızı açık bir derin bağlantı üzerinden açtığında görev geri yığını temizlendi ve derin bağlantı hedefiyle değiştirildi. Zaman iç içe yerleştirme, her iç içe yerleştirme seviyesinden başlangıç hedefi (yani başlangıç hedefi) her <navigation> öğesinden gelen dize de yığına eklenir. Bu durum, kullanıcı derin bir bağlantıdan Geri düğmesine bastığında üzerinde yoğunlaştıktan sonra, gezinme yığınına uygulamanıza giriş noktasından girdi.

Şunu kullanabilirsiniz: NavDeepLinkBuilder PendingIntent oluşturmak için aşağıdaki örnekte gösterildiği gibidir. Sağlanan bağlam Activity ise oluşturucu, PackageManager.getLaunchIntentForPackage() varsayılan etkinlik olarak belirleyin.

Kotlin

val pendingIntent = NavDeepLinkBuilder(context)
    .setGraph(R.navigation.nav_graph)
    .setDestination(R.id.android)
    .setArguments(args)
    .createPendingIntent()

Java

PendingIntent pendingIntent = new NavDeepLinkBuilder(context)
    .setGraph(R.navigation.nav_graph)
    .setDestination(R.id.android)
    .setArguments(args)
    .createPendingIntent();

Varsayılan olarak, NavDeepLinkBuilder açık derin bağlantınızı şurada başlatır: uygulamanızın manifest dosyasında belirtilen varsayılan lansman Activity. Eğer NavHost başka bir etkinlikte bulunuyor, bileşenini belirtmeniz gerekiyor derin bağlantı oluşturucuyu oluştururken verilen ad:

Kotlin

val pendingIntent = NavDeepLinkBuilder(context)
    .setGraph(R.navigation.nav_graph)
    .setDestination(R.id.android)
    .setArguments(args)
    .setComponentName(DestinationActivity::class.java)
    .createPendingIntent()

Java

PendingIntent pendingIntent = new NavDeepLinkBuilder(context)
        .setGraph(R.navigation.nav_graph)
        .setDestination(R.id.android)
        .setArguments(args)
        .setComponentName(DestinationActivity.class)
        .createPendingIntent();

ComponentName kullanıyorsanız: doğrudan oluşturucuya iletebilirsiniz:

Kotlin

val componentName = ...

val pendingIntent = NavDeepLinkBuilder(context)
    .setGraph(R.navigation.nav_graph)
    .setDestination(R.id.android)
    .setArguments(args)
    .setComponentName(componentName)
    .createPendingIntent()

Java

ComponentName componentName = ...;

PendingIntent pendingIntent = new NavDeepLinkBuilder(context)
        .setGraph(R.navigation.nav_graph)
        .setDestination(R.id.android)
        .setArguments(args)
        .setComponentName(componentName)
        .createPendingIntent();

Mevcut bir NavController hesabınız varsa: Ayrıca, yeni bir bağlantı oluşturmak için NavController.createDeepLink().

Örtülü derin bağlantı oluşturma

Dolaylı derin bağlantı, uygulamada belirli bir hedef. Derin bağlantı çağrıldığında (ör. Kullanıcı bir bağlantıyı tıkladığında: Android, uygulamanızı ilgili seçeceğiz.

Derin bağlantılar URI, intent işlemleri ve MIME türleriyle eşleştirilebilir. Şunları yapabilirsiniz: tek bir derin bağlantı için birden fazla eşleme türü belirtebilir, ancak URI'nın bağımsız değişken eşleştirmesine öncelik verilir, ardından işlem ve ardından MIME kullanılır. türü.

URI, işlem ve MIME türü içeren örnek bir derin bağlantıyı burada bulabilirsiniz:

<fragment android:id="@+id/a"
          android:name="com.example.myapplication.FragmentA"
          tools:layout="@layout/a">
        <deepLink app:uri="www.example.com"
                app:action="android.intent.action.MY_ACTION"
                app:mimeType="type/subtype"/>
</fragment>

Ayrıca bir veya daha fazla web sitesine gizli bir derin bağlantı oluşturmak için aşağıdaki gibidir:

  1. Gezinme Düzenleyici'nin Tasarım sekmesinde, derin bağlantı.
  2. Özellikler panelinin Derin Bağlantılar bölümünde + simgesini tıklayın.
  3. Açılan Derin Bağlantı Ekle iletişim kutusunda derin bağlantı.

    Aşağıdakileri göz önünde bulundurun:

    • Şeması olmayan URI'ların http veya https olduğu varsayılır. Örneğin, www.google.com, http://www.google.com ve https://www.google.com.
    • {placeholder_name} biçimindeki yol parametresi yer tutucuları bir veya daha fazlasıyla eşleşiyor karakteri ekleyin. Örneğin, http://www.example.com/users/{id} şunlarla eşleşir: http://www.example.com/users/4. Gezinme bileşeni, yer tutucuyu eşleştirerek yer tutucu değerlerini uygun türlere ayrıştır tanımlanan bağımsız değişkenlerin adlarını derin bağlantı hedefi için tanımlanmıştır. Aynı ad tanımlandığında, bağımsız değişken için varsayılan bir String türü kullanılır değer. 0 veya daha fazla karakteri eşleştirmek için .* joker karakterini kullanabilirsiniz.
    • Sorgu parametresi yer tutucuları, bunların yerine veya onlarla birlikte kullanılabilir yol parametrelerinden farklıdır. Örneğin, http://www.example.com/users/{id}?myarg={myarg} eşleşme http://www.example.com/users/4?myarg=28.
    • Varsayılan veya Boş değer atanabilir değerlerin eşleşmesi gerekmez. Örneğin, http://www.example.com/users/{id}?arg1={arg1}&arg2={arg2} eşleşme http://www.example.com/users/4?arg2=28 veya http://www.example.com/users/4?arg1=7. Path'de durum farklı parametreleridir. Örneğin, http://www.example.com/users?arg1=7&arg2=28 yukarıdaki kalıpla eşleşmiyor, çünkü gerekli yol parametresi sağlanmadı.
    • Fazladan sorgu parametreleri, derin bağlantı URI'si eşleşmesini etkilemez. Örneğin, örnek, http://www.example.com/users/{id} şunlarla eşleşir: http://www.example.com/users/4?extraneousParam=7 olsa da extraneousParam, URI kalıbında tanımlanmadı.
  4. (isteğe bağlı) Google'ın, hesabın sahibi olduğunuzu doğrulamasını sağlamak için Otomatik Doğrulama'yı işaretleyin. URI'nın sahibi. Daha fazla bilgi için bkz. Android App Links'i doğrulayın.

  5. Ekle'yi tıklayın. Bağlantı simgesi . görünene kadar, seçilen hedefin üzerinde derin bağlantı.

  6. XML görünümüne geçmek için Kod sekmesini tıklayın. İç içe yerleştirilmiş bir <deepLink> öğesi hedefe eklendi:

    <deepLink app:uri="https://www.google.com" />
    

Örtülü derin bağlantıyı etkinleştirmek için uygulamanızın manifest.xml dosyası yükleyin. Aşağıdaki özelliklere sahip bir etkinliğe tek bir <nav-graph> öğesi ekleyin: aşağıdaki örnekte gösterildiği gibi, mevcut bir gezinme grafiğine işaret eder:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.myapplication">

    <application ... >

        <activity name=".MainActivity" ...>
            ...

            <nav-graph android:value="@navigation/nav_graph" />

            ...

        </activity>
    </application>
</manifest>

Projenizi oluştururken Gezinme bileşeni, <nav-graph> öğesinin yerini alır tüm derin bağlantıları eşleştirmek için oluşturulmuş <intent-filter> öğeleri içeren öğe gezinme grafiğinde görebilirsiniz.

Örtülü bir derin bağlantı tetiklendiğinde, arka yığının durumu dolaylı Intent öğesinin Intent.FLAG_ACTIVITY_NEW_TASK işaretle:

  • Bayrak ayarlanırsa görev arka yığını temizlenir ve derin bağlantı hedefi. Açık derin bağlantıda olduğu gibi, iç içe yerleştirme grafikleri, her iç içe yerleştirme seviyesinden başlangıç hedefi (yani başlangıç noktası) hiyerarşideki her <navigation> öğesinden gelen hedef; yardımcı olur. Bu, kullanıcı geri düğmesine az sayıda bağlantı hedefine ulaşırsa, sanki gibi gezinme yığınına giriş noktasından uygulamanıza girdiler.
  • Bayrak ayarlanmazsa önceki uygulamanın görev yığınında kalırsınız burada örtülü derin bağlantının tetiklendiği yer alır. Bu durumda, Geri düğmesi Yukarı düğmesi, uygulamanızın görevini başlatırken sizi önceki uygulamaya geri götürür .

Derin bağlantıları yönetme

Her zaman varsayılan değeri kullanmanız önerilir launchMode/standard lütfen unutmayın. standard başlatma modu kullanılırken Navigasyon, çağırarak derin bağlantıları otomatik olarak işler. handleDeepLink() Intent içindeki açık veya üstü kapalı derin bağlantıları işlemek. Ancak, Activity cihazı kullanılırken tekrar kullanılırsa bu işlem otomatik olarak gerçekleşmez singleTop gibi alternatif bir launchMode. Bu durumda, aşağıdaki gösterildiği gibi onNewIntent() içinde handleDeepLink() adlı kişiyi manuel olarak çağırmak için şu örneği inceleyin:

Kotlin

override fun onNewIntent(intent: Intent?) {
    super.onNewIntent(intent)
    navController.handleDeepLink(intent)
}

Java

@Override
protected void onNewIntent(Intent intent) {
    super.onNewIntent(intent);
    navController.handleDeepLink(intent);
}

Ek kaynaklar

Gezinme hakkında daha fazla bilgi edinmek için aşağıdaki kaynaklara bakın.

Örnekler

Codelab'ler

Videolar