ব্যবহারকারীরা প্রায়শই তাদের অ্যান্ড্রয়েড ফোনে বিভিন্ন কাজ শুরু করেন—যেমন কোনো ডকুমেন্ট পর্যালোচনা করা, মেসেজগুলো বাছাই করা, বা বিভিন্ন আইটেম ব্রাউজ করা—এবং তারপর এর বড় ডিসপ্লে, ফিজিক্যাল কীবোর্ড ও মাল্টি-উইন্ডো ওয়ার্কস্পেস সহ একটি গুগলবুকে যেতে চান।
অ্যান্ড্রয়েড ১৭ (এপিআই লেভেল ৩৭) এবং এর পরবর্তী সংস্করণগুলিতে থাকা ‘ কন্টিনিউ অন’ ফিচারটি ব্যবহারকারীর কাছাকাছি থাকা ফোনে চলমান কার্যকলাপের জন্য গুগলবুকের টাস্কবারে একটি অ্যাপ আইকন (যাকে সাজেশন বলা হয়) প্রদর্শন করে। ব্যবহারকারীরা একটি মাত্র ক্লিকে তাদের গুগলবুকে সেই কার্যকলাপ চালিয়ে যেতে পারেন।
ক্রস-ডিভাইস হ্যান্ডঅফ বাস্তবায়ন আপনার অ্যাপকে অ্যাক্টিভিটি কনটেক্সট স্থানান্তর করতে দেয়, ফলে ব্যবহারকারী আপনার অ্যাডাপ্টিভ অ্যান্ড্রয়েড অ্যাপে বা ডেস্কটপ ব্রাউজারে, তার ফোনে ঠিক যেখান থেকে কাজ ছেড়েছিলেন, সেখান থেকেই তা পুনরায় শুরু করতে পারেন।
একটি হস্তান্তর প্রবাহ বেছে নিন
ক্রস-ডিভাইস হ্যান্ডঅফ চালু করার আগে, সিদ্ধান্ত নিন যে গুগলবুকে কোনো ব্যবহারকারী 'Continue On' সাজেশনটি নির্বাচন করলে আপনার ফোন অ্যাপের প্রতিটি অ্যাক্টিভিটি কীভাবে খুলবে:
| হস্তান্তর প্রবাহ | গুগলবুকে টার্গেট করুন | সেরা | মূল এপিআই |
|---|---|---|---|
| অ্যাপ থেকে অ্যাপে হস্তান্তর | ডেস্কটপ উইন্ডোতে চলমান নেটিভ অ্যান্ড্রয়েড অ্যাপ | গুগল প্লে-তে বড় স্ক্রিন এবং ডেস্কটপ উইন্ডোইং-এর জন্য অপ্টিমাইজ করা অ্যাপস | HandoffActivityData.Builder |
| ওয়েব ফলব্যাক সহ অ্যাপ থেকে অ্যাপে হস্তান্তর | ইনস্টল করা থাকলে নেটিভ অ্যান্ড্রয়েড অ্যাপ; অন্যথায়, ডিফল্ট ডেস্কটপ ব্রাউজারের একটি ইউআরএল। | যেসব অ্যাপ নেটিভ ডেস্কটপ উইন্ডো অভিজ্ঞতার জন্য অপ্টিমাইজ করা হয়েছে, কিন্তু গুগলবুকে অ্যাপটি ইনস্টল করা না থাকলে একটি নির্ভরযোগ্য ব্রাউজার ফলব্যাকের প্রয়োজন হয়। | setFallbackUri |
| সরাসরি ওয়েবে হস্তান্তর | ডিফল্ট ডেস্কটপ ব্রাউজারের URL (অথবা অ্যান্ড্রয়েড অ্যাপ লিঙ্কের জন্য কনফিগার করা থাকলে নেটিভ অ্যাপ দ্বারা গৃহীত) | এমন কর্মপ্রবাহ যেখানে আপনার ওয়েব অ্যাপ্লিকেশনটিই প্রধান ডেস্কটপ অভিজ্ঞতা। | HandoffActivityData.createWebHandoff |
একটি অ্যাক্টিভিটির জন্য হ্যান্ডঅফ সক্ষম করুন
'Continue On' ডিফল্টরূপে নিষ্ক্রিয় থাকে এবং প্রতিটি কার্যকলাপের জন্য এটি কনফিগার করা হয়। ফোনে প্রতিটি পাঠানোর কার্যকলাপে এই ধাপগুলো অনুসরণ করুন:
- অ্যাক্টিভিটিটি হ্যান্ডঅফের জন্য প্রয়োজনীয় স্টেট লোড করে নিলে,
setHandoffEnabledকল করুন এবংtrueপাস করুন। একবার এনাবল করা হলে, অ্যাক্টিভিটিটি ফোরগ্রাউন্ডে থাকা অবস্থায় বা ব্যাকগ্রাউন্ডে যাওয়ার সময়ও সিস্টেম হ্যান্ডঅফ ডেটার জন্য অনুরোধ করতে পারে। - একটি নন-নাল
HandoffActivityDataঅবজেক্ট রিটার্ন করার জন্যonHandoffActivityDataRequestedওভাররাইড করুন। অ্যাক্টিভিটিটির জন্য হ্যান্ডঅফ সক্রিয় আছে কিনা তা পরীক্ষা করতে আপনি যেকোনো সময়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 কল করে:
- ফোরগ্রাউন্ড হ্যান্ডঅফ: অ্যাক্টিভিটিটি ফোনে ফোরগ্রাউন্ডে রয়েছে এবং ব্যবহারকারী গুগলবুক টাস্কবার থেকে একটি হ্যান্ডঅফ শুরু করেন।
- ব্যাকগ্রাউন্ড স্টেট ক্যাপচার: অ্যাক্টিভিটিটি ফোনের ব্যাকগ্রাউন্ডে চলে যায় এবং সিস্টেম এর হ্যান্ডঅফ পেলোড ক্যাশ করে রাখে, যদি ব্যবহারকারী পরবর্তীতে গুগলবুকে সাজেশনটি নির্বাচন করেন।
হ্যান্ডঅফ অনুরোধটি সক্রিয় আছে কিনা তা পরীক্ষা করুন।
একটি সক্রিয় ব্যবহারকারী-প্রবর্তিত হ্যান্ডঅফ এবং একটি ব্যাকগ্রাউন্ড সেভের মধ্যে পার্থক্য করতে isActiveRequest ব্যবহার করে HandoffActivityDataRequestInfo পরীক্ষা করুন:
- যদি
isActiveRequesttrueরিটার্ন করে, তার মানে হলো অ্যাক্টিভিটিটি দৃশ্যমান থাকা অবস্থায় ব্যবহারকারী অন্য কোনো ডিভাইসে কাজ চালিয়ে যাওয়ার জন্য সক্রিয়ভাবে অনুরোধ করেছেন। - যদি
isActiveRequestfalseরিটার্ন করে, তাহলে অ্যাক্টিভিটিটি বন্ধ হয়ে যাওয়ার সময় সিস্টেম স্টেট ক্যাশ করে রাখে।
কাজটি গুগলবুকে স্থানান্তরিত হচ্ছে তা নিশ্চিত করতে যদি আপনি ফোনে একটি ভিজ্যুয়াল ইন্ডিকেটর প্রদর্শন করেন, তাহলে UI আপডেটটি অ্যাসিঙ্ক্রোনাসভাবে শিডিউল করুন, যাতে onHandoffActivityDataRequested কোনো বিলম্ব ছাড়াই রিটার্ন করে।
স্টেট এক্সট্রা এবং একটি ওয়েব ফলব্যাক সংযুক্ত করুন
একটি HandoffActivityData পেলোডে নিম্নলিখিত তথ্য থাকে:
- টার্গেট কম্পোনেন্ট (অ্যাপ-টু-অ্যাপ হ্যান্ডঅফের জন্য আবশ্যক): Googlebook-এ কোন অ্যাক্টিভিটি চালু হবে তা নির্ধারণ করতে
HandoffActivityData.Builderএthis.getComponentName()(অ্যাক্টিভিটিরComponentName) অথবা একটি সুস্পষ্টComponentName(this, TargetActivity::class.java)পাস করুন। - অতিরিক্ত (ঐচ্ছিক):
setExtras()ফাংশনে একটিPersistableBundleপাস করুন, যাতে আইডেন্টিফায়ার এবং UI স্থানাঙ্ক (যেমন, খোলা ডকুমেন্টের আইডি, সক্রিয় ট্যাব কী, বা স্ক্রল পজিশন) থাকবে। বান্ডেলটির সাইজ অবশ্যই ৫০ KB-এর কম হতে হবে। - ফলব্যাক ইউআরআই (ঐচ্ছিক):
setFallbackUriতে একটি ওয়েবUriদিন, যাতে আপনার অ্যান্ড্রয়েড অ্যাপ ইনস্টল করা না থাকলে 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-এর প্রধান ডেস্কটপ অভিজ্ঞতা যদি একটি ওয়েব অ্যাপ্লিকেশন হয়, তাহলে setHandoffEnabled এ setAllowHandoffWithoutPackageInstalled(true) সহ HandoffActivityParams পাস করুন, এবং 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)
}
}
গুগলবুকে অবস্থা গ্রহণ ও পুনরুদ্ধার করুন
যখন ব্যবহারকারী গুগলবুক টাস্কবারে থাকা 'Continue On' সাজেশনটি নির্বাচন করেন, তখন সিস্টেম একটি ডেস্কটপ উইন্ডোতে নির্দিষ্ট ComponentName চালু করে এবং লঞ্চ Intent সাথে PersistableBundle এক্সট্রাগুলো সংযুক্ত করে।
গুগলবুকে, ডেস্কটপ উইন্ডোইং এবং মাল্টি-পেন লেআউট মাথায় রেখে ইনকামিং হ্যান্ডঅফ পরিচালনা করুন:
- হ্যান্ডঅফ এক্সট্রাগুলো এক্সট্র্যাক্ট করুন: গ্রহণকারী অ্যাক্টিভিটির
onCreateএবংonNewIntentউভয় মেথডেই, আগতIntentথেকে এক্সট্রাগুলো সংগ্রহ করুন।onNewIntentহ্যান্ডেল করা নিশ্চিত করে যে, যদি আপনার অ্যাক্টিভিটিsingleTopলঞ্চ মোড ব্যবহার করে অথবা কোনো বিদ্যমান ডেস্কটপ উইন্ডোতে রাউট করে, তাহলে উইন্ডোটি হ্যান্ড-অফ করা আইটেমটিতে আপডেট হবে। - মাল্টি-পেন লেআউটের সাথে স্টেটকে মানিয়ে নিন: ফোনে যে স্টেটটি একটি ফুল-স্ক্রিন ডিটেইল ভিউতে থাকতো, সেটি প্রায়শই গুগলবুকের লিস্ট-ডিটেইল বা সাপোর্টিং-পেন লেআউটের ভেতরের একটি নির্বাচিত আইটেমের সাথে ম্যাপ হয়ে যায়। প্রাইমারি লিস্ট সিলেকশন এবং ডিটেইল পেন উভয়কেই ডেটা দিয়ে পূর্ণ করুন, যাতে ডেস্কটপ উইন্ডোটির কাছে সম্পূর্ণ কনটেক্সট থাকে।
- উইন্ডোর আকার পরিবর্তনের পরেও পুনরুদ্ধার করা অবস্থা বজায় রাখুন: হস্তান্তরিত অবস্থাটি একটি
ViewModelএ (SavedStateHandle) সংরক্ষণ করুন অথবা Jetpack Compose-এrememberSaveableকরুন, যাতে 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"
}
}
ফোন এবং গুগলবুকের মধ্যে হ্যান্ডঅফ পরীক্ষা করুন
আপনার বাস্তবায়ন শুরু থেকে শেষ পর্যন্ত যাচাই করতে:
- উভয় ডিভাইস প্রস্তুত করুন
- আপনার অ্যান্ড্রয়েড ফোন (অ্যান্ড্রয়েড ১৭ বা তার উচ্চতর সংস্করণ) এবং গুগলবুক (অথবা ডেস্কটপ উইন্ডোইং মোডে চালিত কোনো পরীক্ষামূলক ডিভাইস) উভয়টিতেই একই গুগল অ্যাকাউন্টে সাইন ইন করুন।
- ব্লুটুথ চালু করুন এবং উভয় ডিভাইসকে একই ওয়াই-ফাই নেটওয়ার্কে সংযুক্ত করুন।
- উভয় ডিভাইসে, সেটিংস > সংযুক্ত ডিভাইস > সংযোগের পছন্দসমূহ > ক্রস-ডিভাইস পরিষেবা > কার্যকলাপ চালিয়ে যান খুলুন, সেটআপের নির্দেশাবলী অনুসরণ করুন এবং টাস্ক সক্রিয় করুন। সম্পূর্ণ পরিবেশগত পূর্বশর্তের জন্য, সেটআপ এবং পরীক্ষা দেখুন।
- আপনার অ্যাপ ইনস্টল করুন
- অ্যাপ থেকে অ্যাপে হস্তান্তরের জন্য, আপনার বিল্ডটি ফোন এবং গুগলবুক উভয় ডিভাইসেই ইনস্টল করুন।
- ওয়েব ফলব্যাক বা সরাসরি ওয়েবে স্থানান্তরের জন্য, ফোনে আপনার বিল্ডটি ইনস্টল করুন এবং গুগলবুকে অ্যাপটি আনইনস্টল করে রাখুন, যাতে আপনি যাচাই করতে পারেন যে ব্রাউজারটি প্রত্যাশিত ইউআরএলটি খুলছে।
- হস্তান্তর শুরু করুন
- ফোনে, আপনার অ্যাপটি খুলুন এবং সেই অ্যাক্টিভিটিতে যান যা হ্যান্ডঅফ সক্ষম করে (অ্যাপ-টু-অ্যাপ হ্যান্ডঅফের জন্য
setHandoffEnabled(true, null)কল করে, অথবা গুগলবুকে অ্যাপটি আনইনস্টল করা অবস্থায় পরীক্ষা করার সময়setAllowHandoffWithoutPackageInstalled(true)এর সাথেHandoffActivityParamsপাস করে)। - গুগলবুকে, টাস্কবারের ডানদিকে 'Continue On' ব্যাজসহ আপনার অ্যাপ আইকনটি খুঁজুন এবং সেটি নির্বাচন করুন।
- ফোনে, আপনার অ্যাপটি খুলুন এবং সেই অ্যাক্টিভিটিতে যান যা হ্যান্ডঅফ সক্ষম করে (অ্যাপ-টু-অ্যাপ হ্যান্ডঅফের জন্য
- ডেস্কটপ পুনরুদ্ধার যাচাই করুন
- নিশ্চিত করুন যে আপনার অ্যাপটি ফোনের আইটেম ও স্ক্রল পজিশন অনুযায়ী হুবহু ডেস্কটপ উইন্ডোতে (বা ব্রাউজার ট্যাবে) খোলে।
- গুগলবুকে অ্যাপ উইন্ডোটির আকার পরিবর্তন করুন এবং যাচাই করুন যে উইন্ডোর আকার পরিবর্তনের পরেও পুনরুদ্ধার করা বিষয়বস্তু এবং নির্বাচিত অংশ অপরিবর্তিত থাকে।
অতিরিক্ত সম্পদ
- গুগলবুকের জন্য অভিযোজিত অ্যাপ তৈরি করুন
- কন্টিনিউ অন ফিচার সম্পর্কে
- ক্রস-ডিভাইস হ্যান্ডঅফ সক্ষম এবং কাস্টমাইজ করুন
- UI অবস্থা সংরক্ষণ করুন
ব্যবহারকারীরা প্রায়শই তাদের অ্যান্ড্রয়েড ফোনে বিভিন্ন কাজ শুরু করেন—যেমন কোনো ডকুমেন্ট পর্যালোচনা করা, মেসেজগুলো বাছাই করা, বা বিভিন্ন আইটেম ব্রাউজ করা—এবং তারপর এর বড় ডিসপ্লে, ফিজিক্যাল কীবোর্ড ও মাল্টি-উইন্ডো ওয়ার্কস্পেস সহ একটি গুগলবুকে যেতে চান।
অ্যান্ড্রয়েড ১৭ (এপিআই লেভেল ৩৭) এবং এর পরবর্তী সংস্করণগুলিতে থাকা ‘ কন্টিনিউ অন’ ফিচারটি ব্যবহারকারীর কাছাকাছি থাকা ফোনে চলমান কার্যকলাপের জন্য গুগলবুকের টাস্কবারে একটি অ্যাপ আইকন (যাকে সাজেশন বলা হয়) প্রদর্শন করে। ব্যবহারকারীরা একটি মাত্র ক্লিকে তাদের গুগলবুকে সেই কার্যকলাপ চালিয়ে যেতে পারেন।
ক্রস-ডিভাইস হ্যান্ডঅফ বাস্তবায়ন আপনার অ্যাপকে অ্যাক্টিভিটি কনটেক্সট স্থানান্তর করতে দেয়, ফলে ব্যবহারকারী আপনার অ্যাডাপ্টিভ অ্যান্ড্রয়েড অ্যাপে বা ডেস্কটপ ব্রাউজারে, তার ফোনে ঠিক যেখান থেকে কাজ ছেড়েছিলেন, সেখান থেকেই তা পুনরায় শুরু করতে পারেন।
একটি হস্তান্তর প্রবাহ বেছে নিন
ক্রস-ডিভাইস হ্যান্ডঅফ চালু করার আগে, সিদ্ধান্ত নিন যে গুগলবুকে কোনো ব্যবহারকারী 'Continue On' সাজেশনটি নির্বাচন করলে আপনার ফোন অ্যাপের প্রতিটি অ্যাক্টিভিটি কীভাবে খুলবে:
| হস্তান্তর প্রবাহ | গুগলবুকে টার্গেট করুন | সেরা | মূল এপিআই |
|---|---|---|---|
| অ্যাপ থেকে অ্যাপে হস্তান্তর | ডেস্কটপ উইন্ডোতে চলমান নেটিভ অ্যান্ড্রয়েড অ্যাপ | গুগল প্লে-তে বড় স্ক্রিন এবং ডেস্কটপ উইন্ডোইং-এর জন্য অপ্টিমাইজ করা অ্যাপস | HandoffActivityData.Builder |
| ওয়েব ফলব্যাক সহ অ্যাপ থেকে অ্যাপে হস্তান্তর | ইনস্টল করা থাকলে নেটিভ অ্যান্ড্রয়েড অ্যাপ; অন্যথায়, ডিফল্ট ডেস্কটপ ব্রাউজারের একটি ইউআরএল। | যেসব অ্যাপ নেটিভ ডেস্কটপ উইন্ডো অভিজ্ঞতার জন্য অপ্টিমাইজ করা হয়েছে, কিন্তু গুগলবুকে অ্যাপটি ইনস্টল করা না থাকলে একটি নির্ভরযোগ্য ব্রাউজার ফলব্যাকের প্রয়োজন হয়। | setFallbackUri |
| সরাসরি ওয়েবে হস্তান্তর | ডিফল্ট ডেস্কটপ ব্রাউজারের URL (অথবা অ্যান্ড্রয়েড অ্যাপ লিঙ্কের জন্য কনফিগার করা থাকলে নেটিভ অ্যাপ দ্বারা গৃহীত) | এমন কর্মপ্রবাহ যেখানে আপনার ওয়েব অ্যাপ্লিকেশনটিই প্রধান ডেস্কটপ অভিজ্ঞতা। | HandoffActivityData.createWebHandoff |
একটি অ্যাক্টিভিটির জন্য হ্যান্ডঅফ সক্ষম করুন
'Continue On' ডিফল্টরূপে নিষ্ক্রিয় থাকে এবং প্রতিটি কার্যকলাপের জন্য এটি কনফিগার করা হয়। ফোনে প্রতিটি পাঠানোর কার্যকলাপে এই ধাপগুলো অনুসরণ করুন:
- অ্যাক্টিভিটিটি হ্যান্ডঅফের জন্য প্রয়োজনীয় স্টেট লোড করে নিলে,
setHandoffEnabledকল করুন এবংtrueপাস করুন। একবার এনাবল করা হলে, অ্যাক্টিভিটিটি ফোরগ্রাউন্ডে থাকা অবস্থায় বা ব্যাকগ্রাউন্ডে যাওয়ার সময়ও সিস্টেম হ্যান্ডঅফ ডেটার জন্য অনুরোধ করতে পারে। - একটি নন-নাল
HandoffActivityDataঅবজেক্ট রিটার্ন করার জন্যonHandoffActivityDataRequestedওভাররাইড করুন। অ্যাক্টিভিটিটির জন্য হ্যান্ডঅফ সক্রিয় আছে কিনা তা পরীক্ষা করতে আপনি যেকোনো সময়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 কল করে:
- ফোরগ্রাউন্ড হ্যান্ডঅফ: অ্যাক্টিভিটিটি ফোনে ফোরগ্রাউন্ডে রয়েছে এবং ব্যবহারকারী গুগলবুক টাস্কবার থেকে একটি হ্যান্ডঅফ শুরু করেন।
- ব্যাকগ্রাউন্ড স্টেট ক্যাপচার: অ্যাক্টিভিটিটি ফোনের ব্যাকগ্রাউন্ডে চলে যায় এবং সিস্টেম এর হ্যান্ডঅফ পেলোড ক্যাশ করে রাখে, যদি ব্যবহারকারী পরবর্তীতে গুগলবুকে সাজেশনটি নির্বাচন করেন।
হ্যান্ডঅফ অনুরোধটি সক্রিয় আছে কিনা তা পরীক্ষা করুন।
একটি সক্রিয় ব্যবহারকারী-প্রবর্তিত হ্যান্ডঅফ এবং একটি ব্যাকগ্রাউন্ড সেভের মধ্যে পার্থক্য করতে isActiveRequest ব্যবহার করে HandoffActivityDataRequestInfo পরীক্ষা করুন:
- যদি
isActiveRequesttrueরিটার্ন করে, তার মানে হলো অ্যাক্টিভিটিটি দৃশ্যমান থাকা অবস্থায় ব্যবহারকারী অন্য কোনো ডিভাইসে কাজ চালিয়ে যাওয়ার জন্য সক্রিয়ভাবে অনুরোধ করেছেন। - যদি
isActiveRequestfalseরিটার্ন করে, তাহলে অ্যাক্টিভিটিটি বন্ধ হয়ে যাওয়ার সময় সিস্টেম স্টেট ক্যাশ করে রাখে।
কাজটি গুগলবুকে স্থানান্তরিত হচ্ছে তা নিশ্চিত করতে যদি আপনি ফোনে একটি ভিজ্যুয়াল ইন্ডিকেটর প্রদর্শন করেন, তাহলে UI আপডেটটি অ্যাসিঙ্ক্রোনাসভাবে শিডিউল করুন, যাতে onHandoffActivityDataRequested কোনো বিলম্ব ছাড়াই রিটার্ন করে।
স্টেট এক্সট্রা এবং একটি ওয়েব ফলব্যাক সংযুক্ত করুন
একটি HandoffActivityData পেলোডে নিম্নলিখিত তথ্য থাকে:
- টার্গেট কম্পোনেন্ট (অ্যাপ-টু-অ্যাপ হ্যান্ডঅফের জন্য আবশ্যক): Googlebook-এ কোন অ্যাক্টিভিটি চালু হবে তা নির্ধারণ করতে
HandoffActivityData.Builderএthis.getComponentName()(অ্যাক্টিভিটিরComponentName) অথবা একটি সুস্পষ্টComponentName(this, TargetActivity::class.java)পাস করুন। - অতিরিক্ত (ঐচ্ছিক):
setExtras()ফাংশনে একটিPersistableBundleপাস করুন, যাতে আইডেন্টিফায়ার এবং UI স্থানাঙ্ক (যেমন, খোলা ডকুমেন্টের আইডি, সক্রিয় ট্যাব কী, বা স্ক্রল পজিশন) থাকবে। বান্ডেলটির সাইজ অবশ্যই ৫০ KB-এর কম হতে হবে। - ফলব্যাক ইউআরআই (ঐচ্ছিক):
setFallbackUriতে একটি ওয়েবUriদিন, যাতে আপনার অ্যান্ড্রয়েড অ্যাপ ইনস্টল করা না থাকলে 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-এর প্রধান ডেস্কটপ অভিজ্ঞতা যদি একটি ওয়েব অ্যাপ্লিকেশন হয়, তাহলে setHandoffEnabled এ setAllowHandoffWithoutPackageInstalled(true) সহ HandoffActivityParams পাস করুন, এবং 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)
}
}
গুগলবুকে অবস্থা গ্রহণ ও পুনরুদ্ধার করুন
যখন ব্যবহারকারী গুগলবুক টাস্কবারে থাকা 'Continue On' সাজেশনটি নির্বাচন করেন, তখন সিস্টেম একটি ডেস্কটপ উইন্ডোতে নির্দিষ্ট ComponentName চালু করে এবং লঞ্চ Intent সাথে PersistableBundle এক্সট্রাগুলো সংযুক্ত করে।
গুগলবুকে, ডেস্কটপ উইন্ডোইং এবং মাল্টি-পেন লেআউট মাথায় রেখে ইনকামিং হ্যান্ডঅফ পরিচালনা করুন:
- হ্যান্ডঅফ এক্সট্রাগুলো এক্সট্র্যাক্ট করুন: গ্রহণকারী অ্যাক্টিভিটির
onCreateএবংonNewIntentউভয় মেথডেই, আগতIntentথেকে এক্সট্রাগুলো সংগ্রহ করুন।onNewIntentহ্যান্ডেল করা নিশ্চিত করে যে, যদি আপনার অ্যাক্টিভিটিsingleTopলঞ্চ মোড ব্যবহার করে অথবা কোনো বিদ্যমান ডেস্কটপ উইন্ডোতে রাউট করে, তাহলে উইন্ডোটি হ্যান্ড-অফ করা আইটেমটিতে আপডেট হবে। - মাল্টি-পেন লেআউটের সাথে স্টেটকে মানিয়ে নিন: ফোনে যে স্টেটটি একটি ফুল-স্ক্রিন ডিটেইল ভিউতে থাকতো, সেটি প্রায়শই গুগলবুকের লিস্ট-ডিটেইল বা সাপোর্টিং-পেন লেআউটের ভেতরের একটি নির্বাচিত আইটেমের সাথে ম্যাপ হয়ে যায়। প্রাইমারি লিস্ট সিলেকশন এবং ডিটেইল পেন উভয়কেই ডেটা দিয়ে পূর্ণ করুন, যাতে ডেস্কটপ উইন্ডোটির কাছে সম্পূর্ণ কনটেক্সট থাকে।
- উইন্ডোর আকার পরিবর্তনের পরেও পুনরুদ্ধার করা অবস্থা বজায় রাখুন: হস্তান্তরিত অবস্থাটি একটি
ViewModelএ (SavedStateHandle) সংরক্ষণ করুন অথবা Jetpack Compose-এrememberSaveableকরুন, যাতে 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"
}
}
ফোন এবং গুগলবুকের মধ্যে হ্যান্ডঅফ পরীক্ষা করুন
আপনার বাস্তবায়ন শুরু থেকে শেষ পর্যন্ত যাচাই করতে:
- উভয় ডিভাইস প্রস্তুত করুন
- আপনার অ্যান্ড্রয়েড ফোন (অ্যান্ড্রয়েড ১৭ বা তার উচ্চতর সংস্করণ) এবং গুগলবুক (অথবা ডেস্কটপ উইন্ডোইং মোডে চালিত কোনো পরীক্ষামূলক ডিভাইস) উভয়টিতেই একই গুগল অ্যাকাউন্টে সাইন ইন করুন।
- ব্লুটুথ চালু করুন এবং উভয় ডিভাইসকে একই ওয়াই-ফাই নেটওয়ার্কে সংযুক্ত করুন।
- উভয় ডিভাইসে, সেটিংস > সংযুক্ত ডিভাইস > সংযোগের পছন্দসমূহ > ক্রস-ডিভাইস পরিষেবা > কার্যকলাপ চালিয়ে যান খুলুন, সেটআপের নির্দেশাবলী অনুসরণ করুন এবং টাস্ক সক্রিয় করুন। সম্পূর্ণ পরিবেশগত পূর্বশর্তের জন্য, সেটআপ এবং পরীক্ষা দেখুন।
- আপনার অ্যাপ ইনস্টল করুন
- অ্যাপ থেকে অ্যাপে হস্তান্তরের জন্য, আপনার বিল্ডটি ফোন এবং গুগলবুক উভয় ডিভাইসেই ইনস্টল করুন।
- ওয়েব ফলব্যাক বা সরাসরি ওয়েবে স্থানান্তরের জন্য, ফোনে আপনার বিল্ডটি ইনস্টল করুন এবং গুগলবুকে অ্যাপটি আনইনস্টল করে রাখুন, যাতে আপনি যাচাই করতে পারেন যে ব্রাউজারটি প্রত্যাশিত ইউআরএলটি খুলছে।
- হস্তান্তর শুরু করুন
- ফোনে, আপনার অ্যাপটি খুলুন এবং সেই অ্যাক্টিভিটিতে যান যা হ্যান্ডঅফ সক্ষম করে (অ্যাপ-টু-অ্যাপ হ্যান্ডঅফের জন্য
setHandoffEnabled(true, null)কল করে, অথবা গুগলবুকে অ্যাপটি আনইনস্টল করা অবস্থায় পরীক্ষা করার সময়setAllowHandoffWithoutPackageInstalled(true)এর সাথেHandoffActivityParamsপাস করে)। - গুগলবুকে, টাস্কবারের ডানদিকে 'Continue On' ব্যাজসহ আপনার অ্যাপ আইকনটি খুঁজুন এবং সেটি নির্বাচন করুন।
- ফোনে, আপনার অ্যাপটি খুলুন এবং সেই অ্যাক্টিভিটিতে যান যা হ্যান্ডঅফ সক্ষম করে (অ্যাপ-টু-অ্যাপ হ্যান্ডঅফের জন্য
- ডেস্কটপ পুনরুদ্ধার যাচাই করুন
- নিশ্চিত করুন যে আপনার অ্যাপটি ফোনের আইটেম ও স্ক্রল পজিশন অনুযায়ী হুবহু ডেস্কটপ উইন্ডোতে (বা ব্রাউজার ট্যাবে) খোলে।
- গুগলবুকে অ্যাপ উইন্ডোটির আকার পরিবর্তন করুন এবং যাচাই করুন যে উইন্ডোর আকার পরিবর্তনের পরেও পুনরুদ্ধার করা বিষয়বস্তু এবং নির্বাচিত অংশ অপরিবর্তিত থাকে।
অতিরিক্ত সম্পদ
- গুগলবুকের জন্য অভিযোজিত অ্যাপ তৈরি করুন
- কন্টিনিউ অন ফিচার সম্পর্কে
- ক্রস-ডিভাইস হ্যান্ডঅফ সক্ষম এবং কাস্টমাইজ করুন
- UI অবস্থা সংরক্ষণ করুন
ব্যবহারকারীরা প্রায়শই তাদের অ্যান্ড্রয়েড ফোনে বিভিন্ন কাজ শুরু করেন—যেমন কোনো ডকুমেন্ট পর্যালোচনা করা, মেসেজগুলো বাছাই করা, বা বিভিন্ন আইটেম ব্রাউজ করা—এবং তারপর এর বড় ডিসপ্লে, ফিজিক্যাল কীবোর্ড ও মাল্টি-উইন্ডো ওয়ার্কস্পেস সহ একটি গুগলবুকে যেতে চান।
অ্যান্ড্রয়েড ১৭ (এপিআই লেভেল ৩৭) এবং এর পরবর্তী সংস্করণগুলিতে থাকা ‘ কন্টিনিউ অন’ ফিচারটি ব্যবহারকারীর কাছাকাছি থাকা ফোনে চলমান কার্যকলাপের জন্য গুগলবুকের টাস্কবারে একটি অ্যাপ আইকন (যাকে সাজেশন বলা হয়) প্রদর্শন করে। ব্যবহারকারীরা একটি মাত্র ক্লিকে তাদের গুগলবুকে সেই কার্যকলাপ চালিয়ে যেতে পারেন।
ক্রস-ডিভাইস হ্যান্ডঅফ বাস্তবায়ন আপনার অ্যাপকে অ্যাক্টিভিটি কনটেক্সট স্থানান্তর করতে দেয়, ফলে ব্যবহারকারী আপনার অ্যাডাপ্টিভ অ্যান্ড্রয়েড অ্যাপে বা ডেস্কটপ ব্রাউজারে, তার ফোনে ঠিক যেখান থেকে কাজ ছেড়েছিলেন, সেখান থেকেই তা পুনরায় শুরু করতে পারেন।
একটি হস্তান্তর প্রবাহ বেছে নিন
ক্রস-ডিভাইস হ্যান্ডঅফ চালু করার আগে, সিদ্ধান্ত নিন যে গুগলবুকে কোনো ব্যবহারকারী 'Continue On' সাজেশনটি নির্বাচন করলে আপনার ফোন অ্যাপের প্রতিটি অ্যাক্টিভিটি কীভাবে খুলবে:
| হস্তান্তর প্রবাহ | গুগলবুকে টার্গেট করুন | সেরা | মূল এপিআই |
|---|---|---|---|
| অ্যাপ থেকে অ্যাপে হস্তান্তর | ডেস্কটপ উইন্ডোতে চলমান নেটিভ অ্যান্ড্রয়েড অ্যাপ | গুগল প্লে-তে বড় স্ক্রিন এবং ডেস্কটপ উইন্ডোইং-এর জন্য অপ্টিমাইজ করা অ্যাপস | HandoffActivityData.Builder |
| ওয়েব ফলব্যাক সহ অ্যাপ থেকে অ্যাপে হস্তান্তর | ইনস্টল করা থাকলে নেটিভ অ্যান্ড্রয়েড অ্যাপ; অন্যথায়, ডিফল্ট ডেস্কটপ ব্রাউজারের একটি ইউআরএল। | যেসব অ্যাপ নেটিভ ডেস্কটপ উইন্ডো অভিজ্ঞতার জন্য অপ্টিমাইজ করা হয়েছে, কিন্তু গুগলবুকে অ্যাপটি ইনস্টল করা না থাকলে একটি নির্ভরযোগ্য ব্রাউজার ফলব্যাকের প্রয়োজন হয়। | setFallbackUri |
| সরাসরি ওয়েবে হস্তান্তর | ডিফল্ট ডেস্কটপ ব্রাউজারের URL (অথবা অ্যান্ড্রয়েড অ্যাপ লিঙ্কের জন্য কনফিগার করা থাকলে নেটিভ অ্যাপ দ্বারা গৃহীত) | এমন কর্মপ্রবাহ যেখানে আপনার ওয়েব অ্যাপ্লিকেশনটিই প্রধান ডেস্কটপ অভিজ্ঞতা। | HandoffActivityData.createWebHandoff |
একটি অ্যাক্টিভিটির জন্য হ্যান্ডঅফ সক্ষম করুন
'Continue On' ডিফল্টরূপে নিষ্ক্রিয় থাকে এবং প্রতিটি কার্যকলাপের জন্য এটি কনফিগার করা হয়। ফোনে প্রতিটি পাঠানোর কার্যকলাপে এই ধাপগুলো অনুসরণ করুন:
- অ্যাক্টিভিটিটি হ্যান্ডঅফের জন্য প্রয়োজনীয় স্টেট লোড করে নিলে,
setHandoffEnabledকল করুন এবংtrueপাস করুন। একবার এনাবল করা হলে, অ্যাক্টিভিটিটি ফোরগ্রাউন্ডে থাকা অবস্থায় বা ব্যাকগ্রাউন্ডে যাওয়ার সময়ও সিস্টেম হ্যান্ডঅফ ডেটার জন্য অনুরোধ করতে পারে। - একটি নন-নাল
HandoffActivityDataঅবজেক্ট রিটার্ন করার জন্যonHandoffActivityDataRequestedওভাররাইড করুন। অ্যাক্টিভিটিটির জন্য হ্যান্ডঅফ সক্রিয় আছে কিনা তা পরীক্ষা করতে আপনি যেকোনো সময়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 কল করে:
- ফোরগ্রাউন্ড হ্যান্ডঅফ: অ্যাক্টিভিটিটি ফোনে ফোরগ্রাউন্ডে রয়েছে এবং ব্যবহারকারী গুগলবুক টাস্কবার থেকে একটি হ্যান্ডঅফ শুরু করেন।
- ব্যাকগ্রাউন্ড স্টেট ক্যাপচার: অ্যাক্টিভিটিটি ফোনের ব্যাকগ্রাউন্ডে চলে যায় এবং সিস্টেম এর হ্যান্ডঅফ পেলোড ক্যাশ করে রাখে, যদি ব্যবহারকারী পরবর্তীতে গুগলবুকে সাজেশনটি নির্বাচন করেন।
হ্যান্ডঅফ অনুরোধটি সক্রিয় আছে কিনা তা পরীক্ষা করুন।
একটি সক্রিয় ব্যবহারকারী-প্রবর্তিত হ্যান্ডঅফ এবং একটি ব্যাকগ্রাউন্ড সেভের মধ্যে পার্থক্য করতে isActiveRequest ব্যবহার করে HandoffActivityDataRequestInfo পরীক্ষা করুন:
- যদি
isActiveRequesttrueরিটার্ন করে, তার মানে হলো অ্যাক্টিভিটিটি দৃশ্যমান থাকা অবস্থায় ব্যবহারকারী অন্য কোনো ডিভাইসে কাজ চালিয়ে যাওয়ার জন্য সক্রিয়ভাবে অনুরোধ করেছেন। - যদি
isActiveRequestfalseরিটার্ন করে, তাহলে অ্যাক্টিভিটিটি বন্ধ হয়ে যাওয়ার সময় সিস্টেম স্টেট ক্যাশ করে রাখে।
কাজটি গুগলবুকে স্থানান্তরিত হচ্ছে তা নিশ্চিত করতে যদি আপনি ফোনে একটি ভিজ্যুয়াল ইন্ডিকেটর প্রদর্শন করেন, তাহলে UI আপডেটটি অ্যাসিঙ্ক্রোনাসভাবে শিডিউল করুন, যাতে onHandoffActivityDataRequested কোনো বিলম্ব ছাড়াই রিটার্ন করে।
স্টেট এক্সট্রা এবং একটি ওয়েব ফলব্যাক সংযুক্ত করুন
একটি HandoffActivityData পেলোডে নিম্নলিখিত তথ্য থাকে:
- টার্গেট কম্পোনেন্ট (অ্যাপ-টু-অ্যাপ হ্যান্ডঅফের জন্য আবশ্যক): Googlebook-এ কোন অ্যাক্টিভিটি চালু হবে তা নির্ধারণ করতে
HandoffActivityData.Builderএthis.getComponentName()(অ্যাক্টিভিটিরComponentName) অথবা একটি সুস্পষ্টComponentName(this, TargetActivity::class.java)পাস করুন। - অতিরিক্ত (ঐচ্ছিক):
setExtras()ফাংশনে একটিPersistableBundleপাস করুন, যাতে আইডেন্টিফায়ার এবং UI স্থানাঙ্ক (যেমন, খোলা ডকুমেন্টের আইডি, সক্রিয় ট্যাব কী, বা স্ক্রল পজিশন) থাকবে। বান্ডেলটির সাইজ অবশ্যই ৫০ KB-এর কম হতে হবে। - ফলব্যাক ইউআরআই (ঐচ্ছিক):
setFallbackUriতে একটি ওয়েবUriদিন, যাতে আপনার অ্যান্ড্রয়েড অ্যাপ ইনস্টল করা না থাকলে 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-এর প্রধান ডেস্কটপ অভিজ্ঞতা যদি একটি ওয়েব অ্যাপ্লিকেশন হয়, তাহলে setHandoffEnabled এ setAllowHandoffWithoutPackageInstalled(true) সহ HandoffActivityParams পাস করুন, এবং 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)
}
}
গুগলবুকে অবস্থা গ্রহণ ও পুনরুদ্ধার করুন
যখন ব্যবহারকারী গুগলবুক টাস্কবারে থাকা 'Continue On' সাজেশনটি নির্বাচন করেন, তখন সিস্টেম একটি ডেস্কটপ উইন্ডোতে নির্দিষ্ট ComponentName চালু করে এবং লঞ্চ Intent সাথে PersistableBundle এক্সট্রাগুলো সংযুক্ত করে।
গুগলবুকে, ডেস্কটপ উইন্ডোইং এবং মাল্টি-পেন লেআউট মাথায় রেখে ইনকামিং হ্যান্ডঅফ পরিচালনা করুন:
- হ্যান্ডঅফ এক্সট্রাগুলো এক্সট্র্যাক্ট করুন: গ্রহণকারী অ্যাক্টিভিটির
onCreateএবংonNewIntentউভয় মেথডেই, আগতIntentথেকে এক্সট্রাগুলো সংগ্রহ করুন।onNewIntentহ্যান্ডেল করা নিশ্চিত করে যে, যদি আপনার অ্যাক্টিভিটিsingleTopলঞ্চ মোড ব্যবহার করে অথবা কোনো বিদ্যমান ডেস্কটপ উইন্ডোতে রাউট করে, তাহলে উইন্ডোটি হ্যান্ড-অফ করা আইটেমটিতে আপডেট হবে। - মাল্টি-পেন লেআউটের সাথে স্টেটকে মানিয়ে নিন: ফোনে যে স্টেটটি একটি ফুল-স্ক্রিন ডিটেইল ভিউতে থাকতো, সেটি প্রায়শই গুগলবুকের লিস্ট-ডিটেইল বা সাপোর্টিং-পেন লেআউটের ভেতরের একটি নির্বাচিত আইটেমের সাথে ম্যাপ হয়ে যায়। প্রাইমারি লিস্ট সিলেকশন এবং ডিটেইল পেন উভয়কেই ডেটা দিয়ে পূর্ণ করুন, যাতে ডেস্কটপ উইন্ডোটির কাছে সম্পূর্ণ কনটেক্সট থাকে।
- উইন্ডোর আকার পরিবর্তনের পরেও পুনরুদ্ধার করা অবস্থা বজায় রাখুন: হস্তান্তরিত অবস্থাটি একটি
ViewModelএ (SavedStateHandle) সংরক্ষণ করুন অথবা Jetpack Compose-এrememberSaveableকরুন, যাতে 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"
}
}
ফোন এবং গুগলবুকের মধ্যে হ্যান্ডঅফ পরীক্ষা করুন
আপনার বাস্তবায়ন শুরু থেকে শেষ পর্যন্ত যাচাই করতে:
- উভয় ডিভাইস প্রস্তুত করুন
- আপনার অ্যান্ড্রয়েড ফোন (অ্যান্ড্রয়েড ১৭ বা তার উচ্চতর সংস্করণ) এবং গুগলবুক (অথবা ডেস্কটপ উইন্ডোইং মোডে চালিত কোনো পরীক্ষামূলক ডিভাইস) উভয়টিতেই একই গুগল অ্যাকাউন্টে সাইন ইন করুন।
- ব্লুটুথ চালু করুন এবং উভয় ডিভাইসকে একই ওয়াই-ফাই নেটওয়ার্কে সংযুক্ত করুন।
- উভয় ডিভাইসে, সেটিংস > সংযুক্ত ডিভাইস > সংযোগের পছন্দসমূহ > ক্রস-ডিভাইস পরিষেবা > কার্যকলাপ চালিয়ে যান খুলুন, সেটআপের নির্দেশাবলী অনুসরণ করুন এবং টাস্ক সক্রিয় করুন। সম্পূর্ণ পরিবেশগত পূর্বশর্তের জন্য, সেটআপ এবং পরীক্ষা দেখুন।
- আপনার অ্যাপ ইনস্টল করুন
- অ্যাপ থেকে অ্যাপে হস্তান্তরের জন্য, আপনার বিল্ডটি ফোন এবং গুগলবুক উভয় ডিভাইসেই ইনস্টল করুন।
- ওয়েব ফলব্যাক বা সরাসরি ওয়েবে স্থানান্তরের জন্য, ফোনে আপনার বিল্ডটি ইনস্টল করুন এবং গুগলবুকে অ্যাপটি আনইনস্টল করে রাখুন, যাতে আপনি যাচাই করতে পারেন যে ব্রাউজারটি প্রত্যাশিত ইউআরএলটি খুলছে।
- হস্তান্তর শুরু করুন
- ফোনে, আপনার অ্যাপটি খুলুন এবং সেই অ্যাক্টিভিটিতে যান যা হ্যান্ডঅফ সক্ষম করে (অ্যাপ-টু-অ্যাপ হ্যান্ডঅফের জন্য
setHandoffEnabled(true, null)কল করে, অথবা গুগলবুকে অ্যাপটি আনইনস্টল করা অবস্থায় পরীক্ষা করার সময়setAllowHandoffWithoutPackageInstalled(true)এর সাথেHandoffActivityParamsপাস করে)। - গুগলবুকে, টাস্কবারের ডানদিকে 'Continue On' ব্যাজসহ আপনার অ্যাপ আইকনটি খুঁজুন এবং সেটি নির্বাচন করুন।
- ফোনে, আপনার অ্যাপটি খুলুন এবং সেই অ্যাক্টিভিটিতে যান যা হ্যান্ডঅফ সক্ষম করে (অ্যাপ-টু-অ্যাপ হ্যান্ডঅফের জন্য
- ডেস্কটপ পুনরুদ্ধার যাচাই করুন
- নিশ্চিত করুন যে আপনার অ্যাপটি ফোনের আইটেম ও স্ক্রল পজিশন অনুযায়ী হুবহু ডেস্কটপ উইন্ডোতে (বা ব্রাউজার ট্যাবে) খোলে।
- গুগলবুকে অ্যাপ উইন্ডোটির আকার পরিবর্তন করুন এবং যাচাই করুন যে উইন্ডোর আকার পরিবর্তনের পরেও পুনরুদ্ধার করা বিষয়বস্তু এবং নির্বাচিত অংশ অপরিবর্তিত থাকে।
অতিরিক্ত সম্পদ
- গুগলবুকের জন্য অভিযোজিত অ্যাপ তৈরি করুন
- কন্টিনিউ অন ফিচার সম্পর্কে
- ক্রস-ডিভাইস হ্যান্ডঅফ সক্ষম এবং কাস্টমাইজ করুন
- UI অবস্থা সংরক্ষণ করুন
ব্যবহারকারীরা প্রায়শই তাদের অ্যান্ড্রয়েড ফোনে বিভিন্ন কাজ শুরু করেন—যেমন কোনো ডকুমেন্ট পর্যালোচনা করা, মেসেজগুলো বাছাই করা, বা বিভিন্ন আইটেম ব্রাউজ করা—এবং তারপর এর বড় ডিসপ্লে, ফিজিক্যাল কীবোর্ড ও মাল্টি-উইন্ডো ওয়ার্কস্পেস সহ একটি গুগলবুকে যেতে চান।
অ্যান্ড্রয়েড ১৭ (এপিআই লেভেল ৩৭) এবং এর পরবর্তী সংস্করণগুলিতে থাকা ‘ কন্টিনিউ অন’ ফিচারটি ব্যবহারকারীর কাছাকাছি থাকা ফোনে চলমান কার্যকলাপের জন্য গুগলবুকের টাস্কবারে একটি অ্যাপ আইকন (যাকে সাজেশন বলা হয়) প্রদর্শন করে। ব্যবহারকারীরা একটি মাত্র ক্লিকে তাদের গুগলবুকে সেই কার্যকলাপ চালিয়ে যেতে পারেন।
ক্রস-ডিভাইস হ্যান্ডঅফ বাস্তবায়ন আপনার অ্যাপকে অ্যাক্টিভিটি কনটেক্সট স্থানান্তর করতে দেয়, ফলে ব্যবহারকারী আপনার অ্যাডাপ্টিভ অ্যান্ড্রয়েড অ্যাপে বা ডেস্কটপ ব্রাউজারে, তার ফোনে ঠিক যেখান থেকে কাজ ছেড়েছিলেন, সেখান থেকেই তা পুনরায় শুরু করতে পারেন।
একটি হস্তান্তর প্রবাহ বেছে নিন
ক্রস-ডিভাইস হ্যান্ডঅফ চালু করার আগে, সিদ্ধান্ত নিন যে গুগলবুকে কোনো ব্যবহারকারী 'Continue On' সাজেশনটি নির্বাচন করলে আপনার ফোন অ্যাপের প্রতিটি অ্যাক্টিভিটি কীভাবে খুলবে:
| হস্তান্তর প্রবাহ | গুগলবুকে টার্গেট করুন | সেরা | মূল এপিআই |
|---|---|---|---|
| অ্যাপ থেকে অ্যাপে হস্তান্তর | ডেস্কটপ উইন্ডোতে চলমান নেটিভ অ্যান্ড্রয়েড অ্যাপ | গুগল প্লে-তে বড় স্ক্রিন এবং ডেস্কটপ উইন্ডোইং-এর জন্য অপ্টিমাইজ করা অ্যাপস | HandoffActivityData.Builder |
| ওয়েব ফলব্যাক সহ অ্যাপ থেকে অ্যাপে হস্তান্তর | ইনস্টল করা থাকলে নেটিভ অ্যান্ড্রয়েড অ্যাপ; অন্যথায়, ডিফল্ট ডেস্কটপ ব্রাউজারের একটি ইউআরএল। | যেসব অ্যাপ নেটিভ ডেস্কটপ উইন্ডো অভিজ্ঞতার জন্য অপ্টিমাইজ করা হয়েছে, কিন্তু গুগলবুকে অ্যাপটি ইনস্টল করা না থাকলে একটি নির্ভরযোগ্য ব্রাউজার ফলব্যাকের প্রয়োজন হয়। | setFallbackUri |
| সরাসরি ওয়েবে হস্তান্তর | ডিফল্ট ডেস্কটপ ব্রাউজারের URL (অথবা অ্যান্ড্রয়েড অ্যাপ লিঙ্কের জন্য কনফিগার করা থাকলে নেটিভ অ্যাপ দ্বারা গৃহীত) | এমন কর্মপ্রবাহ যেখানে আপনার ওয়েব অ্যাপ্লিকেশনটিই প্রধান ডেস্কটপ অভিজ্ঞতা। | HandoffActivityData.createWebHandoff |
একটি অ্যাক্টিভিটির জন্য হ্যান্ডঅফ সক্ষম করুন
'Continue On' ডিফল্টরূপে নিষ্ক্রিয় থাকে এবং প্রতিটি কার্যকলাপের জন্য এটি কনফিগার করা হয়। ফোনে প্রতিটি পাঠানোর কার্যকলাপে এই ধাপগুলো অনুসরণ করুন:
- অ্যাক্টিভিটিটি হ্যান্ডঅফের জন্য প্রয়োজনীয় স্টেট লোড করে নিলে,
setHandoffEnabledকল করুন এবংtrueপাস করুন। একবার এনাবল করা হলে, অ্যাক্টিভিটিটি ফোরগ্রাউন্ডে থাকা অবস্থায় বা ব্যাকগ্রাউন্ডে যাওয়ার সময়ও সিস্টেম হ্যান্ডঅফ ডেটার জন্য অনুরোধ করতে পারে। - একটি নন-নাল
HandoffActivityDataঅবজেক্ট রিটার্ন করার জন্যonHandoffActivityDataRequestedওভাররাইড করুন। অ্যাক্টিভিটিটির জন্য হ্যান্ডঅফ সক্রিয় আছে কিনা তা পরীক্ষা করতে আপনি যেকোনো সময়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 কল করে:
- ফোরগ্রাউন্ড হ্যান্ডঅফ: অ্যাক্টিভিটিটি ফোনে ফোরগ্রাউন্ডে রয়েছে এবং ব্যবহারকারী গুগলবুক টাস্কবার থেকে একটি হ্যান্ডঅফ শুরু করেন।
- ব্যাকগ্রাউন্ড স্টেট ক্যাপচার: অ্যাক্টিভিটিটি ফোনের ব্যাকগ্রাউন্ডে চলে যায় এবং সিস্টেম এর হ্যান্ডঅফ পেলোড ক্যাশ করে রাখে, যদি ব্যবহারকারী পরবর্তীতে গুগলবুকে সাজেশনটি নির্বাচন করেন।
হ্যান্ডঅফ অনুরোধটি সক্রিয় আছে কিনা তা পরীক্ষা করুন।
একটি সক্রিয় ব্যবহারকারী-প্রবর্তিত হ্যান্ডঅফ এবং একটি ব্যাকগ্রাউন্ড সেভের মধ্যে পার্থক্য করতে isActiveRequest ব্যবহার করে HandoffActivityDataRequestInfo পরীক্ষা করুন:
- যদি
isActiveRequesttrueরিটার্ন করে, তার মানে হলো অ্যাক্টিভিটিটি দৃশ্যমান থাকা অবস্থায় ব্যবহারকারী অন্য কোনো ডিভাইসে কাজ চালিয়ে যাওয়ার জন্য সক্রিয়ভাবে অনুরোধ করেছেন। - যদি
isActiveRequestfalseরিটার্ন করে, তাহলে অ্যাক্টিভিটিটি বন্ধ হয়ে যাওয়ার সময় সিস্টেম স্টেট ক্যাশ করে রাখে।
কাজটি গুগলবুকে স্থানান্তরিত হচ্ছে তা নিশ্চিত করতে যদি আপনি ফোনে একটি ভিজ্যুয়াল ইন্ডিকেটর প্রদর্শন করেন, তাহলে UI আপডেটটি অ্যাসিঙ্ক্রোনাসভাবে শিডিউল করুন, যাতে onHandoffActivityDataRequested কোনো বিলম্ব ছাড়াই রিটার্ন করে।
স্টেট এক্সট্রা এবং একটি ওয়েব ফলব্যাক সংযুক্ত করুন
একটি HandoffActivityData পেলোডে নিম্নলিখিত তথ্য থাকে:
- টার্গেট কম্পোনেন্ট (অ্যাপ-টু-অ্যাপ হ্যান্ডঅফের জন্য আবশ্যক): Googlebook-এ কোন অ্যাক্টিভিটি চালু হবে তা নির্ধারণ করতে
HandoffActivityData.Builderএthis.getComponentName()(অ্যাক্টিভিটিরComponentName) অথবা একটি সুস্পষ্টComponentName(this, TargetActivity::class.java)পাস করুন। - অতিরিক্ত (ঐচ্ছিক):
setExtras()ফাংশনে একটিPersistableBundleপাস করুন, যাতে আইডেন্টিফায়ার এবং UI স্থানাঙ্ক (যেমন, খোলা ডকুমেন্টের আইডি, সক্রিয় ট্যাব কী, বা স্ক্রল পজিশন) থাকবে। বান্ডেলটির সাইজ অবশ্যই ৫০ KB-এর কম হতে হবে। - ফলব্যাক ইউআরআই (ঐচ্ছিক):
setFallbackUriতে একটি ওয়েবUriদিন, যাতে আপনার অ্যান্ড্রয়েড অ্যাপ ইনস্টল করা না থাকলে 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-এর প্রধান ডেস্কটপ অভিজ্ঞতা যদি একটি ওয়েব অ্যাপ্লিকেশন হয়, তাহলে setHandoffEnabled এ setAllowHandoffWithoutPackageInstalled(true) সহ HandoffActivityParams পাস করুন, এবং 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)
}
}
গুগলবুকে অবস্থা গ্রহণ ও পুনরুদ্ধার করুন
যখন ব্যবহারকারী গুগলবুক টাস্কবারে থাকা 'Continue On' সাজেশনটি নির্বাচন করেন, তখন সিস্টেম একটি ডেস্কটপ উইন্ডোতে নির্দিষ্ট ComponentName চালু করে এবং লঞ্চ Intent সাথে PersistableBundle এক্সট্রাগুলো সংযুক্ত করে।
গুগলবুকে, ডেস্কটপ উইন্ডোইং এবং মাল্টি-পেন লেআউট মাথায় রেখে ইনকামিং হ্যান্ডঅফ পরিচালনা করুন:
- হ্যান্ডঅফ এক্সট্রাগুলো এক্সট্র্যাক্ট করুন: গ্রহণকারী অ্যাক্টিভিটির
onCreateএবংonNewIntentউভয় মেথডেই, আগতIntentথেকে এক্সট্রাগুলো সংগ্রহ করুন।onNewIntentহ্যান্ডেল করা নিশ্চিত করে যে, যদি আপনার অ্যাক্টিভিটিsingleTopলঞ্চ মোড ব্যবহার করে অথবা কোনো বিদ্যমান ডেস্কটপ উইন্ডোতে রাউট করে, তাহলে উইন্ডোটি হ্যান্ড-অফ করা আইটেমটিতে আপডেট হবে। - মাল্টি-পেন লেআউটের সাথে স্টেটকে মানিয়ে নিন: ফোনে যে স্টেটটি একটি ফুল-স্ক্রিন ডিটেইল ভিউতে থাকতো, সেটি প্রায়শই গুগলবুকের লিস্ট-ডিটেইল বা সাপোর্টিং-পেন লেআউটের ভেতরের একটি নির্বাচিত আইটেমের সাথে ম্যাপ হয়ে যায়। প্রাইমারি লিস্ট সিলেকশন এবং ডিটেইল পেন উভয়কেই ডেটা দিয়ে পূর্ণ করুন, যাতে ডেস্কটপ উইন্ডোটির কাছে সম্পূর্ণ কনটেক্সট থাকে।
- উইন্ডোর আকার পরিবর্তনের পরেও পুনরুদ্ধার করা অবস্থা বজায় রাখুন: হস্তান্তরিত অবস্থাটি একটি
ViewModelএ (SavedStateHandle) সংরক্ষণ করুন অথবা Jetpack Compose-এrememberSaveableকরুন, যাতে 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"
}
}
ফোন এবং গুগলবুকের মধ্যে হ্যান্ডঅফ পরীক্ষা করুন
আপনার বাস্তবায়ন শুরু থেকে শেষ পর্যন্ত যাচাই করতে:
- উভয় ডিভাইস প্রস্তুত করুন
- আপনার অ্যান্ড্রয়েড ফোন (অ্যান্ড্রয়েড ১৭ বা তার উচ্চতর সংস্করণ) এবং গুগলবুক (অথবা ডেস্কটপ উইন্ডোইং মোডে চালিত কোনো পরীক্ষামূলক ডিভাইস) উভয়টিতেই একই গুগল অ্যাকাউন্টে সাইন ইন করুন।
- ব্লুটুথ চালু করুন এবং উভয় ডিভাইসকে একই ওয়াই-ফাই নেটওয়ার্কে সংযুক্ত করুন।
- উভয় ডিভাইসে, সেটিংস > সংযুক্ত ডিভাইস > সংযোগের পছন্দসমূহ > ক্রস-ডিভাইস পরিষেবা > কার্যকলাপ চালিয়ে যান খুলুন, সেটআপের নির্দেশাবলী অনুসরণ করুন এবং টাস্ক সক্রিয় করুন। সম্পূর্ণ পরিবেশগত পূর্বশর্তের জন্য, সেটআপ এবং পরীক্ষা দেখুন।
- আপনার অ্যাপ ইনস্টল করুন
- অ্যাপ থেকে অ্যাপে হস্তান্তরের জন্য, আপনার বিল্ডটি ফোন এবং গুগলবুক উভয় ডিভাইসেই ইনস্টল করুন।
- ওয়েব ফলব্যাক বা সরাসরি ওয়েবে স্থানান্তরের জন্য, ফোনে আপনার বিল্ডটি ইনস্টল করুন এবং গুগলবুকে অ্যাপটি আনইনস্টল করে রাখুন, যাতে আপনি যাচাই করতে পারেন যে ব্রাউজারটি প্রত্যাশিত ইউআরএলটি খুলছে।
- হস্তান্তর শুরু করুন
- ফোনে, আপনার অ্যাপটি খুলুন এবং সেই অ্যাক্টিভিটিতে যান যা হ্যান্ডঅফ সক্ষম করে (অ্যাপ-টু-অ্যাপ হ্যান্ডঅফের জন্য
setHandoffEnabled(true, null)কল করে, অথবা গুগলবুকে অ্যাপটি আনইনস্টল করা অবস্থায় পরীক্ষা করার সময়setAllowHandoffWithoutPackageInstalled(true)এর সাথেHandoffActivityParamsপাস করে)। - গুগলবুকে, টাস্কবারের ডানদিকে 'Continue On' ব্যাজসহ আপনার অ্যাপ আইকনটি খুঁজুন এবং সেটি নির্বাচন করুন।
- ফোনে, আপনার অ্যাপটি খুলুন এবং সেই অ্যাক্টিভিটিতে যান যা হ্যান্ডঅফ সক্ষম করে (অ্যাপ-টু-অ্যাপ হ্যান্ডঅফের জন্য
- ডেস্কটপ পুনরুদ্ধার যাচাই করুন
- নিশ্চিত করুন যে আপনার অ্যাপটি ফোনের আইটেম ও স্ক্রল পজিশন অনুযায়ী হুবহু ডেস্কটপ উইন্ডোতে (বা ব্রাউজার ট্যাবে) খোলে।
- গুগলবুকে অ্যাপ উইন্ডোটির আকার পরিবর্তন করুন এবং যাচাই করুন যে উইন্ডোর আকার পরিবর্তনের পরেও পুনরুদ্ধার করা বিষয়বস্তু এবং নির্বাচিত অংশ অপরিবর্তিত থাকে।
অতিরিক্ত সম্পদ
- গুগলবুকের জন্য অভিযোজিত অ্যাপ তৈরি করুন
- কন্টিনিউ অন ফিচার সম্পর্কে
- ক্রস-ডিভাইস হ্যান্ডঅফ সক্ষম এবং কাস্টমাইজ করুন
- UI অবস্থা সংরক্ষণ করুন