Cihazlar arası aktarımı etkinleştirme ve özelleştirme

Continue On, özelliği desteklediğinizi belirtmeniz ve aktarılan gerekli verileri sağlamanız için yeni yöntemler ve sınıflar sunar. Bu sayede, kullanıcı deneyimini alıcı cihazda düzgün bir şekilde devam ettirebilirsiniz.

Desteği etkinleştir

"Devam et" desteği (varsayılan olarak kapalıdır) her etkinlik için ayrı ayrı uygulanmalıdır. Özelliği etkinleştirmek için setHandoffEnabled yöntemini çağırarak mevcut etkinliğin aktarıma hazır olduğunu belirtin. setHandoffEnabled(true, null) çağrıldıktan sonra, etkinlik için herhangi bir noktada aktarım gerçekleşebilir. Bu nedenle, yalnızca etkinlik aktarılmaya hazır olduğunda çağrılmalıdır.

Etkinliğin isHandoffEnabled ile Devam Et özelliğini etkinleştirip etkinleştirmediğini kontrol edebilirsiniz. Bir etkinlikte aktarım etkinleştirilmişse varsayılan davranış uygulanmadığından boş olmayan bir HandoffActivityData döndürmesi için onHandoffActivityDataRequested de uygulanmalıdır.

class MyHandoffActivity : Activity() {

    ...

  override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    // Do stuff
    ...
    // Enable handoff
    setHandoffEnabled(true, null)
  }

  // Override and implement onHandoffActivityDataRequested
  override fun onHandoffActivityDataRequested(handoffRequestInfo: HandoffActivityDataRequestInfo) : HandoffActivityData {
    // Create and return handoff data
  }
}

HandoffActivityData nesnesini, ilgili ekstralar ve yedek URI ile yapılandırarak Devam Et özelliğine, alıcı cihaza aktarımın nasıl yapılacağını bildirirsiniz.

Sistemin bu verilere ihtiyaç duyduğu iki durum vardır:

  • Etkinlik arka plana geçiyor ve ilgili verilerin kaydedilmesi gerekiyor.
  • Etkinlik ön plandadır ve aktarma isteğinde bulunulmuştur. Devir isteğinin durumunu kontrol edebilirsiniz.

Durumu kontrol et

HandoffActivityDataRequestInfo sınıfı, bir etkinliği devretmeye yönelik mevcut istek hakkında bilgi sağlar. İsteğin şu anda etkin olup olmadığını belirlemek için isActiveRequest yöntemini kullanın. Yöntem,

  • true ise mevcut etkinlik ön plandadır ve kullanıcı başka bir cihazda devam etmeyi istemiştir. Ancak
  • false: Etkinlik durdurulmuştur ve arka plandadır ancak kullanıcı gelecekte aktarım isteğinde bulunabilir.

Gönderen cihazda, kullanıcıya aktarımın gerçekleştiğini veya devam ettiğini belirtmek için kullanıcı arayüzü göstermek istiyorsanız etkin bir istek için isActiveRequest değerini kontrol edebilirsiniz. Ancak bu kodu onHandoffActivityDataRequested kapsamında eşzamanlı olarak yürütmeyin. Bunun yerine, devir işlemini engellememek veya geciktirmemek için eşzamansız olarak çalıştırılacak kodları sıraya alın.

// Override and implement onHandoffActivityDataRequested
override fun onHandoffActivityDataRequested(handoffRequestInfo: HandoffActivityDataRequestInfo) : HandoffActivityData {

  // Check whether the handoff request is active
  if (handoffRequestInfo.isActiveRequest()) {
    // Asynchronously show UI to let users know a handoff is in progress
  }

  // Create and return handoff data
}

Aktarım verileri oluşturma

Devam Et özelliğiyle aktarım sırasında tüm alakalı ve gerekli verilerin iletildiğinden emin olmak için verileri HandoffActivityData nesnesine eklemeniz gerekir.

HandoffActivityData sınıfı, bir etkinlikle ilişkili aktarım verilerini temsil eder. HandoffActivityData, Devam Et özelliğine, etkinliğin alıcı cihazda nasıl işleneceğini ve yeniden oluşturulacağını bildirir. Aktarım verileri şunları içerir:

  • Bileşen adı (gerekli): Kullanıcının yolculuğuna devam etmek için alıcı cihazda başlatılacak ilgili etkinliğin ComponentName. Çoğu durumda ve tam etkinlik kopyalama için bu, HandoffActivityData öğesini oluşturan aynı etkinliğin bileşen adı olur.
  • Ekstralar (isteğe bağlı): Etkinliğin başlangıcına Intent dahil edilecek ekstraları belirtebilirsiniz. Bu, bileşene ek bilgi sağlamak için kullanılabilecek bir PersistableBundle öğesidir. Ekstralar 50 KB'tan küçük olmalıdır.

HandoffActivityData nesneleri oluşturmak için HandoffActivityData.Builder oluşturucu sınıfını kullanın. Devir işlemini alması gereken etkinliğin ComponentName değerini (ör. mevcut Activity için this.getComponentName veya açık bir ComponentName(this, TargetActivity::class.java)) ileterek yeni bir oluşturucu oluşturun. Ardından, isteğe bağlı olarak ekstraları belirtmek için setExtras yöntemini kullanın. Son olarak, HandoffActivityData nesnesini oluşturmak için build yöntemini çağırın.

// Override and implement onHandoffActivityDataRequested
override fun onHandoffActivityDataRequested(handoffRequestInfo: HandoffActivityDataRequestInfo) : HandoffActivityData {

  // Check whether the handoff request is active
  if (handoffRequestInfo.isActiveRequest()) {
    // Asynchronously show UI to let users know a handoff is in progress
  }

  val extras: PersistableBundle = PersistableBundle()
  // Put relevant and necessary values into extras (e.g. scroll position)
  extras.putString("data_id", getDataId())
  extras.putInt("scroll_position", getScrollPosition())

  // Create and return handoff data
  return HandoffActivityData.Builder(getComponentName()) // Designate handoff to the same activity
    .setExtras(extras)
    .build()
}

Web yedek seçeneğini ayarlama

Belirtilen etkinliğin alıcı cihazda başlatılamaması durumunda, kullanıcının varsayılan tarayıcısında cihazda açılan bir yedek URL'yi isteğe bağlı olarak ayarlamak için setFallbackUri öğesini de kullanabilirsiniz.

Uygulamanızın yüklü olmadığı alıcı cihazlarda "Devam et" önerisinin görünmesine izin vermek için setHandoffEnabled yöntemini çağırırken setAllowHandoffWithoutPackageInstalled değeri true olarak ayarlanmış bir HandoffActivityParams örneği iletin:

setHandoffEnabled(
  true,
  HandoffActivityParams.Builder()
    .setAllowHandoffWithoutPackageInstalled(true)
    .build()
)

Ardından, yedek URL'yi HandoffActivityData öğenize ekleyin:

val fallbackWebLink: Uri = Uri.parse("https://myapp.com/fallback?query=" + paramVal)

val handoffData: HandoffActivityData = HandoffActivityData.Builder(getComponentName())
  .setExtras(extras)
  .setFallbackUri(fallbackWebLink)
  .build()

Doğrudan web'e uygulama

Alternatif olarak, doğrudan web'e aktarma işlemini uygulamak için HandoffActivityParams değerini setAllowHandoffWithoutPackageInstalled(true) ile setHandoffEnabled yöntemine iletin ve HandoffActivityData değerini oluşturmak için HandoffActivityData.createWebHandoff yöntemini kullanın:

val webHandoffLink: Uri = Uri.parse("https://myapp.com/handoff?query=" + paramVal)

val handoffData: HandoffActivityData = HandoffActivityData.createWebHandoff(webHandoffLink)

Devretme amacını alma ve işleme

Alıcı cihazda uygulamanız, aktarımı işlemeli ve kullanıcının gönderen cihazdaki deneyimini yeniden oluşturmalıdır. Özellikle, onHandoffActivityDataRequested tarafından döndürülen HandoffActivityData içinde belirttiğiniz etkinlikte intent'i işlemeniz ve etkinliği uygun şekilde yeniden oluşturma hakkında bilgi içeren ekstraları almanız gerekir.

Aynı etkinliğe geçişi belirtiyorsanız verilerin alınabilmesi ve kullanıcı için uygun şekilde önceden doldurulabilmesi amacıyla etkinliğin onCreate yönteminde intent'i alabilirsiniz.

class MyHandoffActivity : Activity() {

    ...

  override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    // Do stuff
    ...

    // Get the launch intent and retrieve extras
    val intent: Intent = getIntent()
    if (intent != null && intent.hasExtra("data_id")) {
      val dataID: String = intent.getStringExtra("data_id")
      // Retrieve the data that corresponds to the data ID
      ...
      // Populate activity UI with relevant data
      ...

      if (intent.hasExtra("scroll_position")) {
        val scrollPosition: Int = intent.getIntExtra("scroll_position", 0)
        // Move the page to the scroll position
        ...
      }
    }
  }
}