Kullanıcılar genellikle Android telefonlarında bir belgeyi inceleme, mesajları önceliklendirme veya çeşitli öğelere göz atma gibi görevlere başlar ve ardından daha büyük ekranı, fiziksel klavyesi ve çok pencereli çalışma alanıyla Googlebook'a geçmek ister.
Android 17 (API düzeyi 37) ve sonraki sürümlerdeki Devam Et özelliği, Googlebook görev çubuğunun kullanıcının yakındaki telefonda çalıştırdığı etkinliğe ait bir uygulama simgesi (öneri olarak adlandırılır) göstermesini sağlar. Kullanıcılar tek bir tıklamayla Googlebook'larında etkinliklerine devam edebilir.
Cihazlar arası aktarımın uygulanması, uygulamanızın etkinlik bağlamını aktarmasına olanak tanır. Böylece kullanıcı, iş akışına uyarlanabilir Android uygulamanızda veya masaüstü tarayıcıda, telefonunda kaldığı yerden devam edebilir.
Bir devretme akışı seçin
Cihazlar arası aktarımı etkinleştirmeden önce, Googlebook'ta "Devam et" önerisini seçen kullanıcılar için telefon uygulamanızdaki her etkinliğin nasıl açılacağına karar verin:
| Aktarım akışı | Googlebook'ta hedefleme | En uygun cihazlar: | Key API |
|---|---|---|---|
| Uygulamadan uygulamaya aktarım | Masaüstü penceresinde çalışan yerel Android uygulaması | Google Play'de büyük ekranlar ve pencereli görüntüleme için optimize edilmiş uygulamalar | HandoffActivityData.Builder |
| Web'e geri dönüşle uygulamadan uygulamaya teslim | Yüklüyse yerel Android uygulaması, aksi takdirde varsayılan masaüstü tarayıcısındaki bir URL | Yerel masaüstü penceresi deneyimi için optimize edilmiş ancak Googlebook'a yüklenmediğinde güvenilir bir tarayıcı alternatifi gerektiren uygulamalar | setFallbackUri |
| Doğrudan web'e aktarma | Varsayılan masaüstü tarayıcısındaki URL (veya Android Uygulama Bağlantıları için yapılandırılmışsa yerel uygulama tarafından yakalanan URL) | Web uygulamanızın birincil masaüstü deneyimi olduğu iş akışları | HandoffActivityData.createWebHandoff |
Bir etkinlik için devretmeyi etkinleştirme
Devam Et özelliği varsayılan olarak devre dışıdır ve etkinlik bazında yapılandırılır. Telefonda her gönderme işleminde aşağıdaki adımları uygulayın:
- Etkinlik, devretme için gereken durumu yükledikten sonra
setHandoffEnabledişlevini çağırın vetruedeğerini iletin. Etkinleştirildikten sonra sistem, etkinlik ön plandayken veya arka plana taşınırken devretme verileri isteyebilir. - Boş olmayan bir
onHandoffActivityDataRequestednesnesi döndürmek içinHandoffActivityDatadeğerini geçersiz kılın. Etkinlik için devretme özelliğinin etkin olup olmadığını kontrol etmek üzereisHandoffEnabledsorgusunu istediğiniz zaman gönderebilirsiniz.
import android.app.Activity
import android.app.HandoffActivityData
import android.app.HandoffActivityDataRequestInfo
import android.os.Bundle
import android.os.PersistableBundle
class DocumentEditorActivity : Activity() {
private var documentId: String = "doc_42"
private var scrollOffsetPx: Int = 0
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// Enable handoff once the activity is ready to transfer state.
setHandoffEnabled(true, null)
}
override fun onHandoffActivityDataRequested(
handoffRequestInfo: HandoffActivityDataRequestInfo
): HandoffActivityData {
val extras = PersistableBundle().apply {
putString(EXTRA_DOCUMENT_ID, documentId)
putInt(EXTRA_SCROLL_OFFSET, scrollOffsetPx)
}
return HandoffActivityData.Builder(getComponentName())
.setExtras(extras)
.build()
}
companion object {
const val EXTRA_DOCUMENT_ID = "extra_document_id"
const val EXTRA_SCROLL_OFFSET = "extra_scroll_offset"
}
}
Devretme için paket etkinliği durumu
Sistem, onHandoffActivityDataRequested işlevini iki senaryoda çağırır:
- Ön planda aktarım: Etkinlik telefonda ön plandadır ve kullanıcı, Googlebook görev çubuğundan aktarım başlatır.
- Arka plan durumunu yakalama: Etkinlik telefonda arka plana taşınır ve kullanıcı daha sonra Googlebook'taki öneriyi seçerse sistem, teslim yükünü önbelleğe alır.
Devretme isteğinin etkin olup olmadığını kontrol etme
Etkin bir kullanıcı tarafından başlatılan aktarım ile arka planda kaydetme arasındaki farkı anlamak için isActiveRequest kullanarak HandoffActivityDataRequestInfo öğesini inceleyin:
isActiveRequesttruedeğerini döndürürse kullanıcı, etkinlik görünürken başka bir cihazda devam etmeyi etkin bir şekilde istemiştir.isActiveRequest,falsedeğerini döndürürse sistem, etkinlik durduğunda durumu önbelleğe alıyor demektir.
Telefonda görevin Googlebook'a taşındığını onaylayan görsel bir gösterge görüntülüyorsanız kullanıcı arayüzü güncellemesini eşzamansız olarak planlayın. Böylece onHandoffActivityDataRequested gecikmeden döndürülür.
Durum ekstraları ve web yedekleri ekleme
Bir HandoffActivityData yükü aşağıdaki bilgileri içerir:
- Hedef bileşen (uygulamadan uygulamaya aktarım için gereklidir): Googlebook'ta hangi etkinliğin başlatılacağını belirtmek için geçiş
this.getComponentName()(etkinliğinComponentName) veyaComponentName(this, TargetActivity::class.java)ileHandoffActivityData.Builder. - Ekstralar (isteğe bağlı): Tanımlayıcılar ve kullanıcı arayüzü koordinatları (ör. açık doküman kimlikleri, etkin sekme anahtarları veya kaydırma konumları) içeren bir
PersistableBundleöğesinisetExtras()'a iletin. Paket 50 KB'tan küçük olmalıdır. - Yedek URI (isteğe bağlı): Googlebook'un, Android uygulamanız yüklü değilse görevi varsayılan tarayıcıda açabilmesi için
Uriweb'inisetFallbackUri'ye iletin.
import android.app.Activity
import android.app.HandoffActivityData
import android.app.HandoffActivityDataRequestInfo
import android.app.HandoffActivityParams
import android.net.Uri
import android.os.Bundle
import android.os.PersistableBundle
class ArticleReaderActivity : Activity() {
private var articleId: String = "android-desktop-windowing"
private var readingProgressPercent: Int = 45
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setHandoffEnabled(
true,
HandoffActivityParams.Builder()
.setAllowHandoffWithoutPackageInstalled(true)
.build()
)
}
override fun onHandoffActivityDataRequested(
handoffRequestInfo: HandoffActivityDataRequestInfo
): HandoffActivityData {
if (handoffRequestInfo.isActiveRequest()) {
window.decorView.post {
onHandoffStartedToSecondaryDevice()
}
}
val extras = PersistableBundle().apply {
putString(EXTRA_ARTICLE_ID, articleId)
putInt(EXTRA_READING_PROGRESS, readingProgressPercent)
}
val fallbackWebUri = Uri.Builder()
.scheme("https")
.authority("example.com")
.appendPath("articles")
.appendPath(articleId)
.appendQueryParameter("progress", readingProgressPercent.toString())
.build()
return HandoffActivityData.Builder(getComponentName())
.setExtras(extras)
.setFallbackUri(fallbackWebUri)
.build()
}
private fun onHandoffStartedToSecondaryDevice() {
// Save local drafts and update phone UI without blocking handoff.
}
companion object {
const val EXTRA_ARTICLE_ID = "extra_article_id"
const val EXTRA_READING_PROGRESS = "extra_reading_progress"
}
}
Doğrudan web'e aktarmayı yapılandırma
Googlebook'taki birincil masaüstü deneyiminiz bir web uygulamasıysa HandoffActivityParams ile setAllowHandoffWithoutPackageInstalled(true) yerine setHandoffEnabled ile geçirin ve HandoffActivityData.Builder yerine HandoffActivityData.createWebHandoff işlevini çağırın:
import android.app.Activity
import android.app.HandoffActivityData
import android.app.HandoffActivityDataRequestInfo
import android.app.HandoffActivityParams
import android.net.Uri
import android.os.Bundle
class WebDashboardActivity : Activity() {
private var projectId: String = "proj_901"
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setHandoffEnabled(
true,
HandoffActivityParams.Builder()
.setAllowHandoffWithoutPackageInstalled(true)
.build()
)
}
override fun onHandoffActivityDataRequested(
handoffRequestInfo: HandoffActivityDataRequestInfo
): HandoffActivityData {
val webUri = Uri.Builder()
.scheme("https")
.authority("app.example.com")
.appendPath("projects")
.appendPath(projectId)
.build()
return HandoffActivityData.createWebHandoff(webUri)
}
}
Googlebook'ta durumu alma ve geri yükleme
Kullanıcı, Google Kitaplar görev çubuğunda Devam Et önerisini seçtiğinde sistem, hedef ComponentName uygulamasını masaüstü penceresinde başlatır ve başlatma işlemine PersistableBundle ekstralarını ekler Intent.
Googlebook'ta, gelen devri masaüstü pencereli görüntüleme ve çok panelli düzenleri kullanarak yönetin:
- Devretme ekstralarını çıkarma: Alma etkinliğinin hem
onCreatehem deonNewIntentyöntemlerinde, gelenIntentöğesinden ekstraları alın.onNewIntent, etkinliğinizsingleTopbaşlatma modunu kullanıyorsa veya mevcut bir masaüstü penceresine yönlendiriyorsa pencerenin devredilen öğeye güncellenmesini sağlar. - Durumu çok panelli düzenlere uyarlama: Telefonda tam ekran ayrıntı görünümünü kaplayan bir durum, genellikle Googlebook'taki bir liste-ayrıntı düzeninde veya destekleyici bölme düzeninde seçili bir öğeyle eşlenir. Masaüstü penceresinin tam bağlama sahip olması için hem birincil liste seçimini hem de ayrıntılar bölmesini doldurun.
- Pencere yeniden boyutlandırıldığında geri yüklenen durumu koruma: Googlebook'ta serbest biçimli pencere yeniden boyutlandırma işlemi, geri yüklenen oturumu sıfırlamayacak şekilde, aktarılan durumu Jetpack Compose'da
ViewModel(SavedStateHandle) veyarememberSaveableiçinde saklayın.
import android.app.Activity
import android.content.Intent
import android.os.Bundle
class DocumentEditorReceiverActivity : Activity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// Restore from the handoff intent only on initial launch so subsequent
// desktop window configuration changes use saved instance state.
if (savedInstanceState == null) {
handleHandoffIntent(intent)
}
}
override fun onNewIntent(intent: Intent) {
super.onNewIntent(intent)
setIntent(intent)
handleHandoffIntent(intent)
}
private fun handleHandoffIntent(incomingIntent: Intent?) {
val documentId = incomingIntent?.getStringExtra(EXTRA_DOCUMENT_ID)
?: return
val scrollOffsetPx = incomingIntent.getIntExtra(EXTRA_SCROLL_OFFSET, 0)
openDocumentInDesktopWorkspace(
documentId = documentId,
initialScrollOffsetPx = scrollOffsetPx
)
}
private fun openDocumentInDesktopWorkspace(
documentId: String,
initialScrollOffsetPx: Int
) {
// Load the document into the list-detail layout and restore scroll position.
}
companion object {
const val EXTRA_DOCUMENT_ID = "extra_document_id"
const val EXTRA_SCROLL_OFFSET = "extra_scroll_offset"
}
}
Telefon ve Googlebook arasında Handoff'u test etme
Uygulamanızı uçtan uca doğrulamak için:
- Her iki cihazı da hazırlayın
- Hem Android telefonunuzda (Android 17 veya sonraki sürümler) hem de Googlebook'unuzda (ya da pencereli görüntüleme moduyla çalışan bir test cihazında) aynı Google Hesabı'nda oturum açın.
- Bluetooth'u açın ve her iki cihazı da aynı kablosuz ağa bağlayın.
- Her iki cihazda da Ayarlar > Bağlı cihazlar > Bağlantı tercihleri > Cihazlar arası servisler > Etkinliğe devam et'i açın, kurulum istemlerini uygulayın ve Görevler'i etkinleştirin. Ortamla ilgili tüm ön koşullar için Kurulum ve test başlıklı makaleyi inceleyin.
- Uygulamanızı yükleme
- Uygulamadan uygulamaya aktarım için derlemenizi hem telefona hem de Googlebook'a yükleyin.
- Web'e geri dönüş veya doğrudan web'e aktarma için derlemenizi telefona yükleyin ve Googlebook'ta uygulamayı kaldırmadan bırakın. Böylece tarayıcının beklenen URL'yi açtığını doğrulayabilirsiniz.
- Teslimi tetikleme
- Telefonda uygulamanızı açın ve devretme işlemini etkinleştiren etkinliğe gidin (uygulamadan uygulamaya devretme için
setHandoffEnabled(true, null)çağrısı yapın veya Googlebook'ta uygulama kaldırılmışken test yaparkensetAllowHandoffWithoutPackageInstalled(true)ileHandoffActivityParamsiletin). - Googlebook'ta görev çubuğunun sağ tarafında "Devam Et" rozetli uygulama simgenizi bulun ve seçin.
- Telefonda uygulamanızı açın ve devretme işlemini etkinleştiren etkinliğe gidin (uygulamadan uygulamaya devretme için
- Masaüstü geri yükleme işlemini doğrulama
- Uygulamanızın, telefondaki öğe ve kaydırma konumuyla aynı şekilde masaüstü penceresinde (veya tarayıcı sekmesinde) açıldığını onaylayın.
- Googlebook'ta uygulama penceresini yeniden boyutlandırın ve geri yüklenen içerik ile seçimin, pencere boyutu sınıfı geçişlerinde kalıcı olduğunu doğrulayın.
Ek kaynaklar
- Googlebook için uyarlanabilir uygulamalar geliştirme
- Devam Etme özelliği hakkında
- Cihazlar arası teslimi etkinleştirme ve özelleştirme
- Kullanıcı arayüzü durumlarını kaydetme