کاربران اغلب کارها را در تلفن Android خود شروع میکنند—مثل مرور سند، دستهبندی پیامها، یا مرور مجموعهای از موارد—و سپس میخواهند به Googlebook با نمایشگر بزرگتر، صفحهکلید فیزیکی، و فضای کاری چند پنجرهای بروند.
ویژگی ادامه دادن در در Android 17 (میانای برنامه کاربردی سطح ۳۷) و بالاتر به نوار وظیفه Googlebook امکان میدهد نماد برنامهای (که پیشنهاد نامیده میشود) را برای فعالیتی که کاربر در تلفن نزدیکش اجرا میکند نمایش دهد. کاربران با یک کلیک میتوانند فعالیتشان را در Googlebook ادامه دهند.
پیادهسازی انتقال بین دستگاهی به برنامه شما امکان میدهد زمینه فعالیت را منتقل کند تا کاربر گردش کار خود را در همان جایی که در تلفنش متوقف کرده بود، چه در برنامه Android تطبیقی شما و چه در مرورگر رایانه، ازسر بگیرد.
انتخاب جریان واگذاری
قبلاز فعال کردن انتقال بیندستگاهی، تصمیم بگیرید هر فعالیت در برنامه تلفن شما وقتی کاربر پیشنهاد «ادامه در» را در Googlebook انتخاب میکند چگونه باز شود:
| جریان انتقال | هدفگیری در Googlebook | بهترین برای | میانای برنامهسازی کاربردی کلید |
|---|---|---|---|
| انتقال از برنامه به برنامه | برنامه بومی Android درحال اجرا در پنجره رایانه | برنامههای بهینهسازیشده برای صفحهنمایشهای بزرگ و پنجرهبندی رایانه در Google Play | HandoffActivityData.Builder |
| انتقال از برنامه به برنامه با بازگشت به وب | برنامه بومی Android درصورت نصب؛ درغیراینصورت، نشانی وب در مرورگر پیشفرض رایانه | برنامههای بهینهشده برای تجربه پنجره رایانه بومی که درصورت نصب نبودن برنامه در Googlebook به مرورگر قابلاعتمادی نیاز دارند | setFallbackUri |
| واگذاری مستقیم به وب | نشانی وب در مرورگر رایانه پیشفرض (یا اگر برای پیوندهای برنامه Android پیکربندی شده باشد، توسط برنامه بومی رهگیری میشود) | گردشهای کاری که در آنها برنامه وب شما تجربه اصلی رایانه است | HandoffActivityData.createWebHandoff |
فعال کردن واگذاری برای فعالیت
«ادامه در» بهطور پیشفرض غیرفعال است و برای هر فعالیت پیکربندی میشود. این مراحل را در هر فعالیت ارسال در تلفن دنبال کنید:
- پساز بار شدن فعالیت، با
setHandoffEnabledتماس بگیرید وtrueرا ارسال کنید وضعیت موردنیاز برای واگذاری. پساز فعال شدن، سیستم میتواند دادههای انتقال را درحالیکه فعالیت در پیشزمینه است یا به پسزمینه منتقل میشود درخواست کند. - برای برگرداندن شیء غیرتهی،
onHandoffActivityDataRequestedرا ملغی کنیدHandoffActivityData. هرزمان بخواهید میتوانیدisHandoffEnabledرا پویش کنید تا بررسی کنید آیا واگذاری برای فعالیت فعال است یا نه.
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"
}
}
وضعیت فعالیت بسته برای واگذاری
سیستم در دو سناریو با onHandoffActivityDataRequested تماس میگیرد:
- انتقال پیشزمینه: فعالیت در پیشزمینه تلفن است و کاربر انتقال را از نوار وظیفه Googlebook آغاز میکند.
- ضبط وضعیت پسزمینه: فعالیت در تلفن به پسزمینه منتقل میشود و سیستم محموله واگذاری آن را ذخیره میکند تا درصورتیکه کاربر بعداً پیشنهاد را در Googlebook انتخاب کند، از آن استفاده کند.
بررسی کنید آیا درخواست واگذاری فعال است یا نه
بااستفاده از isActiveRequest، HandoffActivityDataRequestInfo را بازرسی کنید تا
بین واگذاری آغازشده توسط کاربر فعال و ذخیره پسزمینهای تمایز قائل شوید:
- اگر
isActiveRequestمقدارtrueرا برگرداند، کاربر فعالانه درخواست کرده است که فعالیت در دستگاه دیگری ادامه یابد درحالیکه فعالیت نمایان است. - اگر
isActiveRequestمقدارfalseرا برگرداند، سیستم وضعیت را با توقف فعالیت ذخیره میکند.
اگر نشانگر دیداری در تلفن نمایش میدهید که تأیید میکند تکلیف به Googlebook منتقل میشود، بهروزرسانی واسط کاربر را بهصورت ناهمزمان زمانبندی کنید تا onHandoffActivityDataRequested بدون تأخیر برگردد.
اضافههای حالت و وبگردی جایگزین را پیوست کنید
بار HandoffActivityData حاوی اطلاعات زیر است:
- عنصر هدف (برای واگذاری برنامه به برنامه الزامی است):
this.getComponentName()(ComponentNameفعالیت) یاComponentName(this, TargetActivity::class.java)صریح بهHandoffActivityData.Builderرا ارسال کنید تا مشخص شود کدام فعالیت در Googlebook راهاندازی میشود. - موارد اضافی (اختیاری):
PersistableBundleرا بهsetExtras()حاوی شناسهها و مختصات رابط کاربری (برای مثال، شناسههای سند باز، کلیدهای برگه فعال، یا موقعیتهای پیمایش) ارسال کنید. حجم دستهبندی باید کمتر از ۵۰ کیلوبایت باشد. - شناسه منبع یکنواخت برگشتی (اختیاری): وب
Uriرا بهsetFallbackUriمنتقل کنید تا اگر برنامه Android شما نصب نشده باشد، Googlebook بتواند تکلیف را در مرورگر پیشفرض باز کند.
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"
}
}
پیکربندی انتقال مستقیم به وب
اگر تجربه اصلی رایانه شما در Googlebook برنامه وب است،
HandoffActivityParams را با setAllowHandoffWithoutPackageInstalled(true) به
setHandoffEnabled منتقل کنید، و بهجای استفاده از HandoffActivityData.Builder،
HandoffActivityData.createWebHandoff را فراخوانی کنید:
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
وقتی کاربر پیشنهاد «ادامه دادن در» را در نوار وظیفه Googlebook انتخاب میکند، سیستم ComponentName هدف را در پنجره رایانه راهاندازی میکند و PersistableBundle موارد اضافی را به راهاندازی Intent پیوست میکند.
در Googlebook، انتقال ورودی را با درنظر گرفتن پردازش پنجرهای رایانه و چیدمانهای چندپانلی مدیریت کنید:
- استخراج موارد اضافی واگذاری: در هر دو روش
onCreateوonNewIntentفعالیت دریافتکننده، موارد اضافی را ازIntentورودی بازیابی کنید. مدیریتonNewIntentتضمین میکند که اگر فعالیت شما از حالت راهاندازیsingleTopاستفاده کند یا به پنجره رایانه موجودی هدایت شود، پنجره به مورد واگذارشده بهروزرسانی میشود. - تطبیق وضعیت با چیدمانهای چند پانلی: وضعیتی که نمای جزئیات تمامصفحه را در تلفن اشغال میکرد اغلب به یک مورد انتخابشده در چیدمان فهرست-جزئیات یا پانل پشتیبان در Googlebook نگاشت میشود. هم انتخاب فهرست اصلی و هم قاب جزئیات را تکمیل کنید تا پنجره رایانه زمینهای کامل داشته باشد.
- حفظ وضعیت بازیابیشده در تغییر اندازه پنجره: وضعیت واگذارشده را در
ViewModel(SavedStateHandle) یاrememberSaveableدر Jetpack Compose ذخیره کنید تا تغییر اندازه پنجره با فرم آزاد در Googlebook باعث بازنشانی جلسه بازیابیشده نشود.
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"
}
}
آزمایش انتقال بین تلفن و Googlebook
برای درستیسنجی کردن پیادهسازی سرتاسری:
- آماده کردن هر دو دستگاه
- در تلفن Android (با Android 17 یا بالاتر) و Googlebook (یا دستگاه آزمایشی در حالت پنجرهبندی رایانه) به سیستم «حساب Google» یکسانی وارد شوید.
- بلوتوث را روشن کنید و هر دو دستگاه را به یک شبکه Wi-Fi متصل کنید.
- در هر دو دستگاه، تنظیمات > دستگاههای متصل > اولویتهای اتصال > خدمات بیندستگاهی > ادامه فعالیت را باز کنید، پیاموارههای راهاندازی را دنبال کنید، و تکالیف را فعال کنید. برای پیشنیازهای کامل محیط، به راهاندازی و آزمایش مراجعه کنید.
- نصب برنامه
- برای انتقال از برنامه به برنامه، ساختار خود را هم در تلفن و هم در Googlebook نصب کنید.
- برای وب جانشین یا انتقال مستقیم به وب، ساختار خود را در تلفن نصب کنید و برنامه را در Googlebook نصب نکنید تا بتوانید تأیید کنید که مرورگر نشانی وب موردانتظار را باز میکند.
- راهاندازی واگذاری
- در تلفن، برنامه را باز کنید و به فعالیتی که امکان واگذاری را فراهم میکند بروید (برای واگذاری برنامه به برنامه،
setHandoffEnabled(true, null)تماس بگیرید، یا هنگام آزمایش با برنامه،HandoffActivityParamsرا باsetAllowHandoffWithoutPackageInstalled(true)ارسال کنید (برنامه در Googlebook نصب نشده باشد)). - در Googlebook، سمت چپ نوار وظیفه را برای نماد برنامه با نشان «ادامه در» بررسی کنید و آن را انتخاب کنید.
- در تلفن، برنامه را باز کنید و به فعالیتی که امکان واگذاری را فراهم میکند بروید (برای واگذاری برنامه به برنامه،
- درستیسنجی کردن بازیابی رایانه
- تأیید کنید که برنامه شما در پنجره رایانه (یا برگه مرورگر) در همان مورد و موقعیت پیمایش تلفن باز میشود.
- اندازه پنجره برنامه را در Googlebook تغییر دهید و تأیید کنید که محتوای بازیابیشده و انتخاب در انتقال بین کلاسهای اندازه پنجره حفظ میشود.
منابع بیشتر
- ساختن برنامههای تطبیقی برای Googlebook
- درباره ویژگی «ادامه دادن در»
- فعال و سفارشیسازی کردن واگذاری بیندستگاهی
- ذخیره وضعیتهای میانای کاربر