Pengguna sering memulai tugas di ponsel Android mereka—seperti meninjau dokumen, mengelola pesan, atau menjelajahi berbagai item—lalu ingin beralih ke Googlebook dengan layar yang lebih besar, keyboard fisik, dan ruang kerja multi-aplikasi.
Fitur Lanjutkan di Android 17 (level API 37) dan yang lebih tinggi memungkinkan panel tugas Googlebook menampilkan ikon aplikasi (yang disebut saran) untuk aktivitas yang dijalankan pengguna di ponsel terdekat. Dengan sekali klik, pengguna dapat melanjutkan aktivitas mereka di Googlebook.
Penerapan peralihan antar-perangkat memungkinkan aplikasi Anda mentransfer konteks aktivitas sehingga pengguna dapat melanjutkan alur kerja mereka, baik di aplikasi Android adaptif Anda maupun di browser desktop, tepat di tempat mereka berhenti di ponsel.
Memilih alur pengalihan
Sebelum mengaktifkan peralihan lintas perangkat, tentukan cara setiap aktivitas di aplikasi ponsel Anda harus dibuka saat pengguna memilih saran Lanjutkan di Googlebook:
| Alur pengalihan | Target di Googlebook | Paling cocok untuk | Key API |
|---|---|---|---|
| Pengalihan dari aplikasi ke aplikasi | Aplikasi Android native yang berjalan di jendela desktop | Aplikasi yang dioptimalkan untuk layar besar dan mode jendela desktop di Google Play | HandoffActivityData.Builder |
| Pengalihan aplikasi ke aplikasi dengan penggantian web | Aplikasi Android native jika diinstal; jika tidak, URL di browser desktop default | Aplikasi yang dioptimalkan untuk pengalaman jendela desktop native, tetapi memerlukan penggantian browser yang andal saat aplikasi tidak diinstal di Chromebook | setFallbackUri |
| Pengalihan langsung ke web | URL di browser desktop default (atau dicegat oleh aplikasi native jika dikonfigurasi untuk Link Aplikasi Android) | Alur kerja saat aplikasi web Anda menjadi pengalaman desktop utama | HandoffActivityData.createWebHandoff |
Mengaktifkan penyerahan untuk aktivitas
Lanjutkan Diaktifkan dinonaktifkan secara default dan dikonfigurasi per aktivitas. Ikuti langkah-langkah berikut di setiap aktivitas pengiriman di ponsel:
- Panggil
setHandoffEnableddan teruskantruesetelah aktivitas memuat status yang diperlukan untuk pengalihan. Setelah diaktifkan, sistem dapat meminta data pengalihan saat aktivitas berada di latar depan atau berpindah ke latar belakang. - Ganti
onHandoffActivityDataRequesteduntuk menampilkan objekHandoffActivityDatanon-null. Anda dapat membuat kueriisHandoffEnabledkapan saja untuk memeriksa apakah penyerahan aktif untuk aktivitas tersebut.
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"
}
}
Status aktivitas paket untuk pengalihan
Sistem memanggil onHandoffActivityDataRequested dalam dua skenario:
- Penyerahan latar depan: Aktivitas berada di latar depan di ponsel, dan pengguna memulai penyerahan dari panel tugas Googlebook.
- Pengambilan status latar belakang: Aktivitas berpindah ke latar belakang di ponsel, dan sistem menyimpan payload penyerahannya dalam cache jika pengguna memilih saran di Googlebook nanti.
Memeriksa apakah permintaan pengalihan aktif
Periksa HandoffActivityDataRequestInfo menggunakan isActiveRequest untuk
membedakan antara penyerahan yang dimulai pengguna aktif dan penyimpanan di latar belakang:
- Jika
isActiveRequestmenampilkantrue, pengguna telah secara aktif meminta untuk melanjutkan di perangkat lain saat aktivitas terlihat. - Jika
isActiveRequestmenampilkanfalse, sistem akan menyimpan status dalam cache saat aktivitas berhenti.
Jika Anda menampilkan indikator visual di ponsel yang mengonfirmasi bahwa tugas
berpindah ke Googlebook, jadwalkan update UI secara asinkron sehingga
onHandoffActivityDataRequested ditampilkan tanpa penundaan.
Melampirkan ekstra status dan penggantian web
Payload HandoffActivityData berisi informasi berikut:
- Komponen target (wajib untuk penyerahan aplikasi ke aplikasi): Teruskan
this.getComponentName()(ComponentNameaktivitas) atauComponentName(this, TargetActivity::class.java)eksplisit keHandoffActivityData.Builderuntuk menentukan aktivitas mana yang diluncurkan di Googlebook. - Ekstra (opsional): Teruskan
PersistableBundlekesetExtras()yang berisi ID dan koordinat UI (misalnya, ID dokumen terbuka, kunci tab aktif, atau posisi scroll). Paket harus berukuran kurang dari 50 KB. - URI penggantian (opsional): Teruskan
Uriweb kesetFallbackUrisehingga Googlebook dapat membuka tugas di browser default jika aplikasi Android Anda tidak diinstal.
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"
}
}
Mengonfigurasi pengalihan langsung ke web
Jika pengalaman desktop utama Anda di Googlebook adalah aplikasi web, teruskan
HandoffActivityParams dengan setAllowHandoffWithoutPackageInstalled(true) ke
setHandoffEnabled, dan panggil HandoffActivityData.createWebHandoff, bukan
menggunakan HandoffActivityData.Builder:
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)
}
}
Menerima dan memulihkan status di Googlebook
Saat pengguna memilih saran Lanjutkan Di di panel tugas Googlebook, sistem akan meluncurkan ComponentName target di jendela desktop dan melampirkan ekstra PersistableBundle ke peluncuran Intent.
Di Googlebook, tangani peralihan masuk dengan mempertimbangkan tata letak multi-panel dan mode jendela desktop:
- Ekstrak tambahan penyerahan: Dalam metode
onCreatedanonNewIntentaktivitas penerima, ambil tambahan dariIntentyang masuk. MenanganionNewIntentmemastikan bahwa jika aktivitas Anda menggunakan mode peluncuransingleTopatau merutekan ke jendela desktop yang ada, jendela akan diperbarui ke item yang diserahkan. - Menyesuaikan status ke tata letak multi-panel: Status yang menempati tampilan detail layar penuh di ponsel sering kali dipetakan ke item yang dipilih dalam tata letak list-detail atau panel pendukung di Googlebook. Isi pilihan daftar utama dan panel detail sehingga jendela desktop memiliki konteks yang lengkap.
- Mempertahankan status yang dipulihkan saat mengubah ukuran jendela: Simpan status yang diserahkan di
ViewModel(SavedStateHandle) ataurememberSaveabledi Jetpack Compose sehingga pengubahan ukuran jendela bentuk bebas di Googlebook tidak mereset sesi yang dipulihkan.
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"
}
}
Menguji peralihan antara ponsel dan Googlebook
Untuk memverifikasi penerapan Anda secara menyeluruh:
- Siapkan kedua perangkat
- Login ke Akun Google yang sama di ponsel Android Anda (yang menjalankan Android 17 atau yang lebih tinggi) dan Googlebook Anda (atau perangkat pengujian yang berjalan dalam mode jendela desktop).
- Aktifkan Bluetooth dan hubungkan kedua perangkat ke jaringan Wi-Fi yang sama.
- Di kedua perangkat, buka Setelan > Perangkat terhubung > Preferensi koneksi > Layanan lintas perangkat > Lanjutkan aktivitas, ikuti petunjuk penyiapan, dan aktifkan Tugas. Untuk prasyarat lingkungan lengkap, lihat Penyiapan dan pengujian.
- Menginstal aplikasi
- Untuk pengalihan aplikasi ke aplikasi, instal build Anda di ponsel dan Googlebook.
- Untuk penggantian web atau pengalihan langsung ke web, instal build Anda di ponsel dan biarkan aplikasi tidak diinstal di Googlebook agar Anda dapat memverifikasi bahwa browser membuka URL yang diharapkan.
- Memicu pengalihan
- Di ponsel, buka aplikasi Anda dan buka aktivitas yang memungkinkan pengalihan (memanggil
setHandoffEnabled(true, null)untuk pengalihan aplikasi ke aplikasi, atau meneruskanHandoffActivityParamsdengansetAllowHandoffWithoutPackageInstalled(true)saat menguji dengan aplikasi yang di-uninstal di Googlebook). - Di Googlebook, periksa sisi kanan taskbar untuk menemukan ikon aplikasi Anda dengan badge Lanjutkan di, lalu pilih ikon tersebut.
- Di ponsel, buka aplikasi Anda dan buka aktivitas yang memungkinkan pengalihan (memanggil
- Memverifikasi pemulihan desktop
- Pastikan aplikasi Anda terbuka di jendela desktop (atau tab browser) pada item dan posisi scroll yang sama persis dari ponsel.
- Ubah ukuran jendela aplikasi di Googlebook dan pastikan konten dan pilihan yang dipulihkan tetap ada di seluruh transisi class ukuran jendela.
Referensi lainnya
- Membangun aplikasi adaptif untuk Googlebook
- Tentang fitur Lanjutkan Di
- Mengaktifkan dan menyesuaikan peralihan lintas perangkat
- Menyimpan status UI