Googlebook-এ ক্রস-ডিভাইস কন্টিনিউটি কাজ করে

ব্যবহারকারীরা প্রায়শই তাদের Android ফোনে টাস্ক শুরু করেন—যেমন, কোনও ডকুমেন্ট পর্যালোচনা করা, মেসেজ বাছাই করা বা বিভিন্ন আইটেম ব্রাউজ করা—এবং তারপরে আরও বড় ডিসপ্লে, ফিজিক্যাল কীবোর্ড এবং মাল্টি-উইন্ডো ওয়ার্কস্পেস সহ Googlebook-এ যেতে চান।

Android 17 (API লেভেল 37) ও তার পরবর্তী যেকোনও ভার্সনে চালিয়ে যান ফিচার Googlebook টাস্কবারকে কোনও অ্যাপ আইকন (সাজেশন বলা হয়) দেখাতে দেয়। এটি ব্যবহারকারী তার কাছাকাছি থাকা ফোনে যে অ্যাক্টিভিটি চালাচ্ছেন তার জন্য দেখানো হয়। একটি ক্লিকেই, ব্যবহারকারীরা তাদের Googlebook-এ অ্যাক্টিভিটি চালিয়ে যেতে পারবেন।

ক্রস-ডিভাইস হ্যান্ডঅফ প্রয়োগ করলে, আপনার অ্যাপ অ্যাক্টিভিটি কনটেক্সট ট্রান্সফার করতে পারে যাতে ব্যবহারকারী তার ওয়ার্কফ্লো আবার শুরু করতে পারেন। এটি আপনার অ্যাডাপ্টিভ Android অ্যাপ বা ডেস্কটপ ব্রাউজারে ঠিক সেই জায়গা থেকে শুরু করতে পারেন যেখানে তিনি ফোনে কাজ বন্ধ করেছিলেন।

হ্যান্ড-অফ ফ্লো বেছে নিন

ক্রস-ডিভাইস হ্যান্ডঅফ চালু করার আগে, Googlebook-এ কোনও ব্যবহারকারী 'চালিয়ে যান' সাজেশন বেছে নিলে, আপনার ফোন অ্যাপের প্রতিটি অ্যাক্টিভিটি কীভাবে খুলবে তা ঠিক করুন:

হ্যান্ডঅফ ফ্লো Googlebook-এ টার্গেট করা এর জন্য সর্বোত্তম Key API
অ্যাপ-টু-অ্যাপ হ্যান্ড-অফ ডেস্কটপ উইন্ডোতে চলছে এমন নেটিভ Android অ্যাপ Google Play-তে বড় স্ক্রিন ও ডেস্কটপ উইন্ডোয়িংয়ের জন্য অপ্টিমাইজ করা অ্যাপ HandoffActivityData.Builder
ওয়েব ফলব্যাক সহ অ্যাপ-টু-অ্যাপ হ্যান্ডঅফ ইনস্টল করা থাকলে নেটিভ Android অ্যাপ; অন্যথায়, ডিফল্ট ডেস্কটপ ব্রাউজারে URL নেটিভ ডেস্কটপ উইন্ডো অভিজ্ঞতার জন্য অপ্টিমাইজ করা অ্যাপ, কিন্তু Googlebook-এ অ্যাপ ইনস্টল করা না থাকলে নির্ভরযোগ্য ব্রাউজার ফলব্যাক প্রয়োজন setFallbackUri
ওয়েবে সরাসরি হ্যান্ড-অফ ডিফল্ট ডেস্কটপ ব্রাউজারে URL (অথবা Android অ্যাপ লিঙ্ক-এর জন্য কনফিগার করা থাকলে নেটিভ অ্যাপের মাধ্যমে ইন্টারসেপ্ট করা হয়) এমন ওয়ার্কফ্লো যেখানে আপনার ওয়েব অ্যাপ্লিকেশন হল প্রাথমিক ডেস্কটপ অভিজ্ঞতা HandoffActivityData.createWebHandoff

অ্যাক্টিভিটির জন্য হ্যান্ড-অফ চালু করা

'চালিয়ে যান' ফিচার ডিফল্ট হিসেবে বন্ধ করা থাকে এবং প্রতিটি অ্যাক্টিভিটি অনুযায়ী কনফিগার করা হয়। ফোনে প্রতিটি পাঠানোর অ্যাক্টিভিটিতে এইসব ধাপ অনুসরণ করুন:

  1. অ্যাক্টিভিটি হ্যান্ড-অফের জন্য প্রয়োজনীয় স্টেট লোড করার পরে setHandoffEnabled কল করুন এবং true পাস করুন। চালু করা হলে, অ্যাক্টিভিটি ফোরগ্রাউন্ডে থাকাকালীন বা ব্যাকগ্রাউন্ডে চলে যাওয়ার সময় সিস্টেম হ্যান্ডঅফ ডেটার জন্য অনুরোধ করতে পারে।
  2. নন-নাল 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 কল করে:

  • ফোরগ্রাউন্ড হ্যান্ডঅফ: অ্যাক্টিভিটি ফোনে ফোরগ্রাউন্ডে আছে এবং ব্যবহারকারী Googlebook টাস্কবার থেকে হ্যান্ডঅফ শুরু করেন।
  • ব্যাকগ্রাউন্ড স্টেট ক্যাপচার: অ্যাক্টিভিটি ফোনে ব্যাকগ্রাউন্ডে চলে যায় এবং ব্যবহারকারী পরে Googlebook-এ সাজেশন বেছে নিলে, সিস্টেম হ্যান্ড-অফ পেলোড ক্যাশে করে।

হ্যান্ড-অফ করার অনুরোধ অ্যাক্টিভ আছে কিনা তা চেক করা

isActiveRequest ব্যবহার করে HandoffActivityDataRequestInfo পরীক্ষা করে দেখুন যে অ্যাক্টিভ ব্যবহারকারীর দ্বারা শুরু করা হ্যান্ড-অফ এবং ব্যাকগ্রাউন্ড সেভের মধ্যে পার্থক্য করা যায় কিনা:

  • isActiveRequest true রিটার্ন করলে, অ্যাক্টিভিটি দেখা যাচ্ছে এমন অবস্থায় ব্যবহারকারী অন্য ডিভাইসে চালিয়ে যাওয়ার জন্য সক্রিয়ভাবে অনুরোধ করেছেন।
  • isActiveRequest false রিটার্ন করলে, সিস্টেম স্টেট ক্যাশ করছে কারণ অ্যাক্টিভিটি বন্ধ হয়ে গেছে।

আপনি যদি ফোনে এমন একটি ভিজ্যুয়াল ইন্ডিকেটর দেখান যা নিশ্চিত করে যে টাস্কটি Googlebook-এ সরানো হচ্ছে, তাহলে UI আপডেট অ্যাসিঙ্ক্রোনাসভাবে শিডিউল করুন যাতে onHandoffActivityDataRequested বিলম্ব ছাড়াই ফিরে আসে।

স্টেট এক্সট্রা ও ওয়েব ফলব্যাক অ্যাটাচ করা

HandoffActivityData পেলোডের মধ্যে নিম্নলিখিত তথ্য থাকে:

  • টার্গেট কম্পোনেন্ট (অ্যাপ-টু-অ্যাপ হ্যান্ডঅফের জন্য প্রয়োজন): পাস this.getComponentName() (অ্যাক্টিভিটির ComponentName) অথবা একটি স্পষ্ট ComponentName(this, TargetActivity::class.java) থেকে HandoffActivityData.Builder যা নির্ধারণ করে যে কোন অ্যাক্টিভিটি Googlebook-এ লঞ্চ হবে।
  • অতিরিক্ত (ঐচ্ছিক): শনাক্তকারী ও UI কোঅর্ডিনেট (যেমন, খোলা ডকুমেন্ট আইডি, অ্যাক্টিভ ট্যাব কী বা স্ক্রল পজিশন) সহ PersistableBundle পাস করুন setExtras() । বান্ডেলের সাইজ অবশ্যই ৫০ কেবির কম হতে হবে।
  • ফলব্যাক URI (ঐচ্ছিক): setFallbackUri-এ একটি ওয়েব Uri পাস করুন, যাতে আপনার 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 লঞ্চ করে এবং লঞ্চ Intent-এর সাথে PersistableBundle এক্সট্রা অ্যাটাচ করে।

Googlebook-এ, ডেস্কটপ উইন্ডোইং এবং মাল্টি-প্যানে লেআউট মাথায় রেখে ইনকামিং হ্যান্ড-অফ ম্যানেজ করুন:

  1. হ্যান্ড-অফ এক্সট্রা এক্সট্র্যাক্ট করা: অ্যাক্টিভিটি গ্রহণ করার onCreate ও onNewIntent, দুটি পদ্ধতিতেই ইনকামিং Intent থেকে এক্সট্রা রিট্রিভ করুন। onNewIntent হ্যান্ডেলিং নিশ্চিত করে যে আপনার অ্যাক্টিভিটি singleTop লঞ্চ মোড ব্যবহার করলে বা আগে থেকে থাকা ডেস্কটপ উইন্ডোতে রুট করলে, উইন্ডোটি হ্যান্ড-অফ আইটেমে আপডেট হয়।
  2. মাল্টি-পেন লেআউটের সাথে স্টেট মানিয়ে নেওয়া: ফোনে ফুল-স্ক্রিন ডিটেল ভিউতে থাকা স্টেট প্রায়শই Googlebook-এ তালিকা-বিবরণ বা সহায়ক-পেন লেআউটের মধ্যে বেছে নেওয়া আইটেমের সাথে ম্যাপ করা হয়। ডেস্কটপ উইন্ডোতে যাতে সম্পূর্ণ কনটেক্সট থাকে, সেই জন্য প্রাথমিক তালিকা নির্বাচন ও বিস্তারিত প্যানেল, দু'টিই পূরণ করুন।
  3. উইন্ডো রিসাইজ করার সময় রিস্টোর করা স্টেট বজায় রাখা: Jetpack Compose-এ হ্যান্ড-অফ করা স্টেট ViewModel (SavedStateHandle) বা 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"
    }
}

ফোন ও Googlebook-এর মধ্যে হ্যান্ড-অফ টেস্ট করা

আপনার এন্ড-টু-এন্ড প্রয়োগ যাচাই করতে:

  1. দুটি ডিভাইস প্রস্তুত করুন
    • আপনার Android ফোন (Android 17 বা এর পরের যেকোনও ভার্সন) এবং Googlebook (বা ডেস্কটপ উইন্ডোইং মোডে চলছে এমন কোনও টেস্ট ডিভাইস) দুটিতেই একই Google অ্যাকাউন্টে সাইন-ইন করুন।
    • ব্লুটুথ চালু করুন এবং দুটি ডিভাইস একই ওয়াই-ফাই নেটওয়ার্কে কানেক্ট করুন।
    • দুটি ডিভাইসেই, সেটিংস > কানেক্ট করা ডিভাইস > কানেকশন সংক্রান্ত পছন্দ > ক্রস-ডিভাইস পরিষেবা > অ্যাক্টিভিটি চালিয়ে যান বিকল্প খুলুন, সেট-আপ প্রম্পট অনুসরণ করুন এবং Tasks চালু করুন। সম্পূর্ণ এনভায়রনমেন্টের পূর্বশর্তের জন্য, সেট-আপ ও পরীক্ষা দেখুন।
  2. আপনার অ্যাপ ইনস্টল করুন
    • অ্যাপ-টু-অ্যাপ হ্যান্ডঅফ-এর জন্য, ফোন ও Googlebook, দুটিতেই আপনার বিল্ড ইনস্টল করুন।
    • ওয়েব ফলব্যাক বা ওয়েবে সরাসরি হ্যান্ড-অফ-এর জন্য, ফোনে আপনার বিল্ড ইনস্টল করুন এবং Googlebook-এ অ্যাপটি আনইনস্টল করে রাখুন যাতে আপনি যাচাই করতে পারেন যে ব্রাউজারটি প্রত্যাশিত URL খুলছে কিনা।
  3. হ্যান্ড-অফ ট্রিগার করা
    • ফোনে, আপনার অ্যাপ খুলুন এবং হ্যান্ড-অফ চালু করে এমন অ্যাক্টিভিটিতে নেভিগেট করুন (অ্যাপ-টু-অ্যাপ হ্যান্ড-অফের জন্য setHandoffEnabled(true, null) কল করা, অথবা Googlebook-এ আনইনস্টল করা অ্যাপের সাথে পরীক্ষা করার সময় HandoffActivityParams-এর সাথে setAllowHandoffWithoutPackageInstalled(true) পাস করা)।
    • Googlebook-এ, টাস্কবারের ডানদিকে আপনার অ্যাপ আইকন 'চালিয়ে যান' ব্যাজ সহ চেক করুন এবং এটি বেছে নিন।
  4. ডেস্কটপ রিস্টোর করা হয়েছে কিনা তা যাচাই করুন
    • নিশ্চিত করুন যে আপনার অ্যাপটি ফোন থেকে ঠিক আইটেম এবং স্ক্রল পজিশনে ডেস্কটপ উইন্ডোতে (বা ব্রাউজার ট্যাবে) খুলছে।
    • Googlebook-এ অ্যাপ উইন্ডো রিসাইজ করুন এবং যাচাই করুন যে উইন্ডো সাইজ ক্লাস ট্রানজিশন জুড়ে রিস্টোর করা কন্টেন্ট এবং বেছে নেওয়া আইটেম বজায় থাকে।

অতিরিক্ত রিসোর্স