'আগের ধাপে ফিরে যাওয়া' সংক্রান্ত পূর্বাভাসের জেসচারের জন্য সহায়তা যোগ করা

ছবি ১. ফোনে আগের ধাপে ফিরে যাওয়া সংক্রান্ত পূর্বাভাসের জেসচারের লুক ও ফিল কেমন হবে তার মকআপ

জেসচার নেভিগেশন ফিচার, আগের ধাপে ফিরে যাওয়া সংক্রান্ত পূর্বাভাস, ব্যবহারকারীদের প্রিভিউ করতে দেয় যে পিছনে সোয়াইপ করলে তারা কোথায় পৌঁছাবেন।

যেমন, ফিরে যাওয়ার জেসচার ব্যবহার করলে, আপনার অ্যাপের পিছনে হোম স্ক্রিনের অ্যানিমেটেড প্রিভিউ দেখা যেতে পারে, যেমনটি চিত্র ১-এর মকআপে দেখানো হয়েছে।

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

আপনি এই ব্যাক-টু-হোম অ্যানিমেশন টেস্ট করতে পারবেন (এই পৃষ্ঠার পরবর্তী বিভাগে যেমন বর্ণনা করা হয়েছে)।

আগের ধাপে ফিরে যাওয়া সংক্রান্ত পূর্বাভাসের জেসচার ব্যবহার করতে হলে, আপনার অ্যাপ আপডেট করতে হবে। এর জন্য AndroidX অ্যাক্টিভিটি 1.6.0 বা তার পরবর্তী API-তে ব্যাকওয়ার্ড কম্প্যাটিবল OnBackPressedCallback অথবা নতুন OnBackInvokedCallback প্ল্যাটফর্ম API ব্যবহার করতে হবে। বেশিরভাগ অ্যাপ ব্যাকওয়ার্ড কম্প্যাটিবল AndroidX API ব্যবহার করে।

এই আপডেট ব্যাক নেভিগেশন সঠিকভাবে ইন্টারসেপ্ট করার জন্য একটি মাইগ্রেশন পাথ প্রদান করে, যার মধ্যে KeyEvent.KEYCODE_BACK থেকে ব্যাক ইন্টারসেপশন এবং onBackPressed পদ্ধতি সহ যেকোনও ক্লাস যেমন Activity এবং Dialog নতুন সিস্টেম ব্যাক API-এর মাধ্যমে পরিবর্তন করা অন্তর্ভুক্ত।

KeyEvent.KEYCODE_BACK

Codelab ও Google I/O ভিডিও

এই পৃষ্ঠায় দেওয়া ডকুমেন্টেশন ব্যবহার করার পাশাপাশি, আমাদের কোডল্যাব ব্যবহার করে দেখুন। এটি AndroidX অ্যাক্টিভিটি API ব্যবহার করে আগের ধাপে ফিরে যাওয়া সংক্রান্ত পূর্বাভাসের জেসচার ম্যানেজ করার জন্য WebView-এর একটি সাধারণ ব্যবহার-কেস ইমপ্লিমেন্টেশন প্রদান করে।

এছাড়াও, আপনি আমাদের Google I/O ভিডিও দেখতে পারেন, যেখানে AndroidX এবং প্ল্যাটফর্ম API প্রয়োগ করার অতিরিক্ত উদাহরণ রয়েছে।

Compose-এ কাস্টম ব্যাক জেসচার ম্যানেজ করা

কাস্টম ব্যাক জেসচার ম্যানেজ করার জন্য Compose PredictiveBackHandler কম্পোজেবল প্রদান করে। এই API আপনাকে ব্যাক জেসচারে প্রতিক্রিয়া জানাতে দেয় এবং BackEventCompat অবজেক্টের মধ্যে Flow প্রদান করে যা আপনি ব্যবহারকারী সোয়াইপ করার সময় কাস্টম অ্যানিমেশন বা ট্রানজিশন প্রয়োগ করতে ব্যবহার করতে পারেন।

PredictiveBackHandler ব্যবহার করতে, আপনার অ্যাপে androidx.activity:activity-compose ডিপেন্ডেন্সি (ভার্সন 1.8.0 বা তার পরবর্তী যেকোনও ভার্সন) অন্তর্ভুক্ত আছে কিনা তা নিশ্চিত করুন:

// In your build.gradle.kts file:
dependencies {
    implementation("androidx.activity:activity-compose:1.8.0")
}

PredictiveBackHandler(enabled = isBackHandlerEnabled) { progress: Flow<BackEventCompat> ->
    try {
        progress.collect { backEvent ->
            // Update your UI or animation based on backEvent.progress.
        }
        // Handle the final back action (e.g., navigate back).
    } catch (e: CancellationException) {
        // Back gesture was cancelled, reset your UI.
    }
}

আপনি যদি প্রগ্রেস ট্র্যাক না করে শুধু ফিরে যাওয়ার জেসচার ইন্টারসেপ্ট করতে চান, তাহলে BackHandler ব্যবহার করুন।

ডিফল্ট ব্যাক নেভিগেশন ব্যবহার করে এমন অ্যাপ আপডেট করা

আগের ধাপে ফিরে যাওয়া সংক্রান্ত পূর্বাভাস ডিফল্ট হিসেবে চালু করা থাকে।

আপনার অ্যাপ ফ্র্যাগমেন্ট বা নেভিগেশন কম্পোনেন্ট ব্যবহার করলে, AndroidX অ্যাক্টিভিটি 1.6.0 বা তার পরবর্তী ভার্সনেও আপগ্রেড করুন।

কাস্টম ব্যাক নেভিগেশন ব্যবহার করে এমন অ্যাপ আপডেট করা

আপনার অ্যাপ যদি কাস্টম ব্যাক বিহেভিয়ার প্রয়োগ করে, তাহলে এটি AndroidX ব্যবহার করে কিনা এবং কীভাবে ব্যাক নেভিগেশন ম্যানেজ করে তার উপর নির্ভর করে বিভিন্ন মাইগ্রেশন পাথ রয়েছে।

আপনার অ্যাপ কীভাবে ব্যাক নেভিগেশন ম্যানেজ করে মাইগ্রেশনের জন্য সাজেস্ট করা পাথ (এই পৃষ্ঠায় লিঙ্ক)
AndroidX API আগে থেকে থাকা AndroidX ব্যাক ইমপ্লিমেন্টেশন মাইগ্রেট করা
কাজ করে না এমন প্ল্যাটফর্ম API কাজ করে না এমন ব্যাক নেভিগেশন API সহ AndroidX অ্যাপকে AndroidX API-তে মাইগ্রেট করা

AndroidX ব্যাক নেভিগেশন ইমপ্লিমেন্টেশন মাইগ্রেট করা

এই ব্যবহারের কেসটি সবচেয়ে সাধারণ (এবং সবচেয়ে বেশি সাজেস্ট করা হয়)। এটি নতুন বা আগে থেকে আছে এমন অ্যাপের ক্ষেত্রে প্রযোজ্য, যেগুলি OnBackPressedDispatcher-এর সাথে কাস্টম জেসচার নেভিগেশন হ্যান্ডলিং প্রয়োগ করে, যেমন কাস্টম ব্যাক নেভিগেশন প্রদান করুন-এ বর্ণনা করা হয়েছে।

আগের ধাপে ফিরে যাওয়া সংক্রান্ত পূর্বাভাসের জেসচারের সাথে যাতে আগে থেকেই OnBackPressedDispatcher (যেমন, ফ্র্যাগমেন্ট ও নেভিগেশন কম্পোনেন্ট) ব্যবহার করছে এমন API নির্বিঘ্নে কাজ করে, তা নিশ্চিত করতে, AndroidX অ্যাক্টিভিটি 1.6.0 বা তার পরবর্তী যেকোনও ভার্সনে আপগ্রেড করুন।

// In your build.gradle file:
dependencies {
    // Add this in addition to your other dependencies
    implementation "androidx.activity:activity:1.6.0"
}

কাজ করছে না এমন ব্যাক নেভিগেশন API সহ AndroidX অ্যাপকে AndroidX API-তে মাইগ্রেট করা

আপনার অ্যাপ AndroidX লাইব্রেরি ব্যবহার করলেও যদি কাজ না করা ব্যাক নেভিগেশন API-এর রেফারেন্স তৈরি করে, তাহলে নতুন আচরণকে সাপোর্ট করার জন্য আপনাকে AndroidX API-তে মাইগ্রেট করতে হবে।

AndroidX API-তে কাজ করে না এমন API মাইগ্রেট করতে:

  1. আপনার সিস্টেমের 'ফিরে যান' হ্যান্ডলিং লজিক AndroidX-এর OnBackPressedDispatcher-এ মাইগ্রেট করুন, যেখানে OnBackPressedCallback-এর প্রয়োগ করা হয়েছে। বিস্তারিত নির্দেশিকার জন্য, কাস্টম ব্যাক নেভিগেশন প্রদান করুন দেখুন।

  2. ব্যাক জেসচার ইন্টারসেপ্ট করা বন্ধ করার জন্য প্রস্তুত হলে OnBackPressedCallback বন্ধ করুন।

  3. OnBackPressed বা KeyEvent.KEYCODE_BACK ব্যবহার করে আগের ইভেন্ট ইন্টারসেপ্ট করা বন্ধ করুন।

  4. AndroidX অ্যাক্টিভিটি 1.6.0 বা তার পরবর্তী যেকোনও ভার্সনে আপগ্রেড করতে ভুলবেন না।

    // In your build.gradle file:
    dependencies {
        // Add this in addition to your other dependencies
        implementation "androidx.activity:activity:1.6.0"
    }
    

আগের ধাপে ফিরে যাওয়া সংক্রান্ত পূর্বাভাস থেকে অপ্ট-আউট করা

অপ্ট-আউট করতে, AndroidManifest.xml-এ, <application> ট্যাগে, android:enableOnBackInvokedCallback ফ্ল্যাগকে false-এ সেট করুন।

<application
    ...
    android:enableOnBackInvokedCallback="false"
    ... >
...
</application>

এটি false-এ সেট করলে নিম্নলিখিত কাজগুলি হয়:

  • আগের ধাপে ফিরে যাওয়া সংক্রান্ত পূর্বাভাসের জেসচার সিস্টেম অ্যানিমেশন বন্ধ করে দেয়।
  • OnBackInvokedCallback উপেক্ষা করে, তবে OnBackPressedCallback কল কাজ করা চালিয়ে যায়।

অ্যাক্টিভিটি লেভেলে অপ্ট-আউট করা

android:enableOnBackInvokedCallback ফ্ল্যাগ আপনাকে অ্যাক্টিভিটি লেভেলে সিস্টেম অ্যানিমেশনের পূর্বাভাস থেকে অপ্ট-আউট করার সুবিধা দেয়। এই আচরণের ফলে, আগের ধাপে ফিরে যাওয়া সংক্রান্ত পূর্বাভাসের জেসচারে বড় মাল্টি-অ্যাক্টিভিটি অ্যাপ মাইগ্রেট করা আরও সহজ হয়।

নিচের কোডটি MainActivity থেকে ব্যাক-টু-হোম সিস্টেম অ্যানিমেশন চালু করার জন্য সেট করা enableOnBackInvokedCallback-এর একটি উদাহরণ দেখায়:

<manifest ...>
    <application . . .

        android:enableOnBackInvokedCallback="false">

        <activity
            android:name=".MainActivity"
            android:enableOnBackInvokedCallback="true"
            ...
        </activity>
        <activity
            android:name=".SecondActivity"
            android:enableOnBackInvokedCallback="false"
            ...
        </activity>
    </application>
</manifest>

android:enableOnBackInvokedCallback ফ্ল্যাগ ব্যবহার করার সময় নিম্নলিখিত বিষয়গুলি মনে রাখবেন:

  • android:enableOnBackInvokedCallback=false সেটিং, আপনি যেখানে ট্যাগ সেট করেছেন তার উপর নির্ভর করে, অ্যাক্টিভিটি লেভেল বা অ্যাপ লেভেলে আগের ধাপে ফিরে যাওয়া সংক্রান্ত পূর্বাভাস অ্যানিমেশন বন্ধ করে দেয় এবং OnBackInvokedCallback প্ল্যাটফর্ম API-তে কল উপেক্ষা করার জন্য সিস্টেমকে নির্দেশ দেয়। তবে, OnBackPressedCallback-এ কল করা চালিয়ে যাওয়া যাবে কারণ OnBackPressedCallback হল ব্যাকওয়ার্ড কম্প্যাটিবল এবং onBackPressed API-তে কল করে, যা Android 13-এর আগের ভার্সনে কাজ করে না।
  • অ্যাপ লেভেলে enableOnBackInvokedCallback ফ্ল্যাগ সেট করলে, অ্যাপের সব অ্যাক্টিভিটির জন্য ডিফল্ট ভ্যালু সেট হয়ে যায়। আগের কোড উদাহরণে যেমন দেখানো হয়েছে, অ্যাক্টিভিটি লেভেলে ফ্ল্যাগ সেট করে আপনি প্রতিটি অ্যাক্টিভিটির জন্য ডিফল্ট ভ্যালু ওভাররাইড করতে পারবেন।

কলব্যাক সংক্রান্ত নির্দেশিকা

সিস্টেম ব্যাক কলব্যাক ব্যবহার করার সময় এইসব নির্দেশিকা অনুসরণ করুন: PredictiveBackHandler অথবা BackHandler (Compose-এর জন্য), OnBackPressedCallback অথবা OnBackInvokedCallback।

UI স্টেট নির্ধারণ করুন যা প্রতিটি কলব্যাক চালু ও বন্ধ করে

UI স্টেট হল এমন একটি প্রপার্টি যা UI-এর বর্ণনা দেয়। আমরা আপনাকে এই হাই-লেভেল ধাপগুলি অনুসরণ করার সাজেস্ট করি।

  1. UI-এর অবস্থা নির্ধারণ করুন যা প্রতিটি কলব্যাক চালু এবং বন্ধ করে।

  2. অবজার্ভ করা যায় এমন ডেটা হোল্ডার টাইপ ব্যবহার করে সেই স্টেট নির্ধারণ করুন, যেমন StateFlow বা Compose State এবং স্টেট পরিবর্তন হওয়ার সাথে সাথে কলব্যাক চালু বা বন্ধ করুন।

আপনার অ্যাপ আগে শর্তসাপেক্ষ স্টেটমেন্টের সাথে ব্যাক লজিক অ্যাসোসিয়েট করে থাকলে, এর অর্থ হতে পারে যে আপনি ব্যাক ইভেন্ট ঘটার পরে প্রতিক্রিয়া জানাচ্ছেন। নতুন কলব্যাকের মাধ্যমে এই প্যাটার্ন এড়িয়ে চলুন। সম্ভব হলে, শর্তসাপেক্ষ স্টেটমেন্টের বাইরে কলব্যাক সরান এবং পরিবর্তে একটি পর্যবেক্ষণযোগ্য ডেটা হোল্ডার টাইপের সাথে কলব্যাক যুক্ত করুন।

UI লজিকের জন্য সিস্টেম ব্যাক কলব্যাক ব্যবহার করুন

UI লজিক UI কীভাবে দেখাতে হবে তা নির্দেশ করে। UI লজিক রান করতে সিস্টেম ব্যাক কলব্যাক ব্যবহার করুন, যেমন ডায়ালগ দেখানো বা অ্যানিমেশন রান করা।

আপনার অ্যাপ PRIORITY_DEFAULT বা PRIORITY_OVERLAY-এর সাথে OnBackPressedCallback বা OnBackInvokedCallback চালু করলে, আগের ধাপে ফিরে যাওয়া সংক্রান্ত পূর্বাভাস অ্যানিমেশন রান করে না এবং আপনাকে আগের ধাপে ফিরে যাওয়া সংক্রান্ত ইভেন্ট ম্যানেজ করতে হবে। বিজনেস লজিক রান করতে বা লগ করতে এইসব কলব্যাক তৈরি করবেন না।

ব্যবহারকারী সোয়াইপ করে ফিরে গেলে আপনার অ্যাপকে যদি বিজনেস লজিক বা লগ রান করতে হয়, তাহলে নিম্নলিখিত পদ্ধতি ব্যবহার করুন:

  • Compose-এ: Compose ডেস্টিনেশনের সাথে যুক্ত ViewModel-এর onCleared() কলব্যাকের মধ্যে লগ করুন। এটি জানার জন্য সেরা সিগন্যাল যখন একটি কম্পোজ ডেস্টিনেশন ব্যাক স্ট্যাক থেকে পপ অফ করা হয় এবং ধ্বংস করা হয়।
  • Android 16 ও তার পরের যেকোনও ভার্সনে: OnBackInvokedCallback-এর সাথে PRIORITY_SYSTEM_NAVIGATION_OBSERVER ব্যবহার করুন। এটি একটি অবজারভার কলব্যাক তৈরি করে যা ব্যাক ইভেন্ট ব্যবহার করে না। যেমন, ব্যবহারকারী রুট অ্যাক্টিভিটি থেকে (আপনার অ্যাপ ছেড়ে) ব্যাক ইভেন্ট লগ করতে বা বিজনেস লজিক রান করতে সোয়াইপ করে ফিরে গেলে আপনি এই কলব্যাক রেজিস্টার করতে পারেন, তবে ব্যাক-টু-হোম অ্যানিমেশন তখনও চলতে থাকবে।
  • ভিউ-ভিত্তিক অ্যাপে: ব্যাক ইভেন্ট ব্যবহার করার পরিবর্তে লাইফসাইকেল বা ব্যাক স্ট্যাক কলব্যাকের মধ্যে লগ করুন:
    • অ্যাক্টিভিটি ট্রানজিশনের জন্য, isFinishing, true-এর মধ্যে আছে কিনা তা চেক করুন Activity.onDestroy()।
    • ফ্র্যাগমেন্ট ট্রানজিশনের জন্য, isRemoving, ফ্র্যাগমেন্টের ভিউ লাইফসাইকেল onDestroy()-এর মধ্যে true কিনা তা চেক করুন অথবা FragmentManager.OnBackStackChangedListener (onBackStackChangeStarted / onBackStackChangeCommitted) ব্যবহার করুন।

একক দায়িত্ব কলব্যাক তৈরি করুন

আপনি ডিসপ্যাচারে একাধিক কলব্যাক যোগ করতে পারবেন। কলব্যাকগুলি একটি স্ট্যাকে যোগ করা হয় যেখানে শেষ যোগ করা চালু কলব্যাকটি প্রতিটি ব্যাক জেসচারের জন্য একটি কলব্যাক সহ পরবর্তী ব্যাক জেসচারটি পরিচালনা করে।

কোনও কলব্যাকের একটিই দায়িত্ব থাকলে, সেই কলব্যাকের চালু থাকা স্ট্যাটাস ম্যানেজ করা সহজ হয়। যেমন:

Compose-এ স্ট্যাকে কলব্যাকের ক্রম।
ছবি ২. Compose-এ কলব্যাক স্ট্যাক ডায়াগ্রাম।

চিত্র ২-এ দেখানো হয়েছে যে কীভাবে আপনি স্ট্যাকে একাধিক কলব্যাক রাখতে পারেন, যার প্রত্যেকটি একটি করে কাজের জন্য দায়ী। Compose-এ, কলব্যাকগুলি সবচেয়ে ভিতরের থেকে সবচেয়ে বাইরের কম্পোজেবল পর্যন্ত মূল্যায়ন করা হয় এবং একটি কলব্যাক তখনই চলে যদি স্ট্যাকে এর আগের কলব্যাকগুলি বন্ধ থাকে:

  • "আপনি কি নিশ্চিত..." ব্যবহারকারী কোনও ফর্মে ডেটা লিখলে PredictiveBackHandler চালু হয়, অন্যথায় বন্ধ থাকে। চালু করা থাকলে, এটি কনফার্মেশন ডায়ালগ বা কাস্টম ইন-অ্যাপ অ্যানিমেশন দেখানোর জন্য 'ফিরে যান' জেসচার ইন্টারসেপ্ট করে।
  • আগের কলব্যাক বন্ধ করা থাকলে স্ক্রিন-লেভেল BackHandler রান করে। এই উদাহরণে, এটি বন্ধ করা আছে।
  • পূর্ববর্তী কাস্টম কলব্যাক বন্ধ করা থাকলে, NavHost কলব্যাক ব্যাক স্ট্যাক থেকে পপ ডেস্টিনেশনে ব্যাক নেভিগেশন ম্যানেজ করে।
  • সবশেষে, আগের সব কলব্যাক বন্ধ করা থাকলে, সিস্টেম ফিরে যাওয়ার জেসচার ম্যানেজ করে। ব্যাক স্ট্যাক তার রুট ডেস্টিনেশনে থাকলে, সিস্টেম ব্যাক-টু-হোম, ক্রস-অ্যাক্টিভিটি এবং ক্রস-টাস্কের মতো সিস্টেম-লেভেল অ্যানিমেশন ট্রিগার করে।

ভিউ-ভিত্তিক অ্যাপের ক্ষেত্রেও একই স্ট্যাক আচরণ প্রযোজ্য: শেষবার যোগ করা চালু করা OnBackPressedCallback অগ্রাধিকার পায়, FragmentManager-এ ফিরে আসে এবং অবশেষে সিস্টেম ব্যাক হ্যান্ডলিং।

আগের ধাপে ফিরে যাওয়া সংক্রান্ত পূর্বাভাসের জেসচার অ্যানিমেশন পরীক্ষা করুন

Android 15 থেকে শুরু করে, ব্যাক-টু-হোম, ক্রস-টাস্ক এবং ক্রস-অ্যাক্টিভিটির মতো সিস্টেম অ্যানিমেশনগুলি ডিফল্টভাবে সেইসব অ্যাপের জন্য চালু করা হয় যেগুলি ফিরে যাওয়া সংক্রান্ত পূর্বাভাস নেভিগেশন সমর্থন করে। এগুলি আর ডেভেলপার বিকল্পের পিছনে নেই।

Android 13 বা Android 14 ভার্সন চলছে এমন ডিভাইসে, আপনি ডেভেলপার বিকল্প চালু করতে পারেন যাতে ছবি ১-এ দেখানো ব্যাক-টু-হোম অ্যানিমেশন পরীক্ষা করা যায়:

  1. আপনার ডিভাইসে, সেটিংস > সিস্টেম > ডেভেলপার বিকল্প-এ যান।

  2. প্রেডিকটিভ ব্যাক অ্যানিমেশন বিকল্প বেছে নিন।

  3. আপনার আপডেট করা অ্যাপ চালু করুন এবং এটি অ্যাকশনে দেখতে আগের ধাপে ফিরে যাওয়া সংক্রান্ত জেসচার ব্যবহার করুন।