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

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

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

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

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

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

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

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

কোডল্যাব ও Google I/O ভিডিও

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

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

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

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

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 ব্যবহার করুন।

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

সাধারণত 'প্রেডিক্টিভ ব্যাক' ফিচার চালু করা থাকে।

আপনার অ্যাপে Fragments বা Navigation Component ব্যবহার করা হলে, AndroidX Activity 1.6.0 বা তার পরের যেকোনও ভার্সনে আপগ্রেড করুন।

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

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

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

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

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

OnBackPressedDispatcher আগে থেকেই ব্যবহার করা হচ্ছে এমন API (যেমন, Fragments ও Navigation Component) যাতে প্রেডিক্টিভ ব্যাক জেসচারের সাথে নির্বিঘ্নে কাজ করতে পারে তা নিশ্চিত করতে, AndroidX Activity 1.6.0 বা তার পরবর্তী যেকোনও ভার্সনে আপগ্রেড করুন।

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

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

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

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

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

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

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

  4. AndroidX Activity 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 স্টেট এবং স্টেট পরিবর্তন হওয়ার সাথে সাথে কলব্যাক চালু বা বন্ধ করুন।

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

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

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

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

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

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

সিঙ্গেল রেসপন্সিবিলিটি কলব্যাক তৈরি করা

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

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

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

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

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

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

'আগের ধাপে ফিরে যাওয়া' জেসচার অ্যানিমেশন পরীক্ষা করা

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

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

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

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

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