ব্যবহারকারীরা ব্যাক নেভিগেশন ব্যবহার করে স্ক্রিনের মাধ্যমে পিছনের দিকে নেভিগেট করেন। বেশিরভাগ Android ডিভাইসে একটি 'ফিরে যান' বোতাম থাকে (ফিজিক্যাল, সফ্টওয়্যার বা জেসচার-ভিত্তিক)। সাধারণত, আপনার অ্যাপে ফিরে যাওয়ার বোতাম যোগ করা উচিত নয়। তবে, কম্প্যাটিবিলিটি মোডে Android Automotive OS (AAOS) ডিভাইস সিস্টেমের ফিরে যাওয়ার বোতাম ব্যবহার করে। এটি নেভিগেশন ম্যানেজ করে, তাই আপনাকে নিজের নেভিগেশন যোগ করতে হবে না। আরও বিবরণের জন্য, AAOS কম্প্যাটিবিলিটি মোড দেখুন।
ব্যবহারকারী আপনার অ্যাপ্লিকেশন জুড়ে নেভিগেট করার সময় Android গন্তব্যের একটি ব্যাক স্ট্যাক
মেইনটেন করে। এটি সাধারণত Android-কে 'ফিরে যান' বোতাম প্রেস করা হলে
আগের গন্তব্যে সঠিকভাবে নেভিগেট করার অনুমতি দেয়। তবে, কিছু ক্ষেত্রে
ব্যবহারকারীকে সবচেয়ে ভালো অভিজ্ঞতা প্রদান করার জন্য আপনার অ্যাপকে নিজস্ব 'ফিরে যান' আচরণ
প্রয়োগ করতে হতে পারে। যেমন, WebView ব্যবহার করার সময়,
আপনি হয়ত ডিফল্ট 'ফিরে যান' বোতামের আচরণ ওভাররাইড করতে চাইবেন যাতে ব্যবহারকারী
আপনার অ্যাপের আগের স্ক্রিনের পরিবর্তে তার ওয়েব ব্রাউজিং ইতিহাসের মাধ্যমে
ফিরে যেতে পারেন।
Compose-এ কাস্টম ব্যাক নেভিগেশন প্রয়োগ করা
Jetpack Compose-এ, আপনি
BackHandler কম্পোজেবল ব্যবহার করে কাস্টম ব্যাক নেভিগেশন ম্যানেজ করতে পারবেন।
নেভিগেশন কম্পোজ ব্যবহার করার সময়, ব্যাক স্ট্যাকের আগের স্ক্রিনে নেভিগেট করতে আপনি সাধারণত
NavController.navigateUp() বা NavController.popBackStack()
ব্যবহার করেন। তবে, BackHandler
এমন ক্ষেত্রে উপযোগী যেখানে ব্যবহারকারী সিস্টেমের ফিরে যাওয়ার বোতাম প্রেস করলে বা ফিরে যাওয়ার জেসচার ব্যবহার করলে
আপনি কাস্টম আচরণ প্রয়োগ করতে চান। যেমন, আপনি যদি
আপনার অ্যাপে WebView দেখান, তাহলে ব্যবহারকারী সিস্টেমের 'ফিরে যান' বোতাম প্রেস করলে, আপনি হয়ত তাকে
ব্রাউজিং ইতিহাসের মাধ্যমে ফিরে যাওয়ার অনুমতি দিতে চাইবেন।
প্রাথমিক ব্যবহার
কাস্টম স্টেট (যেমন, প্যানেল ছোট করা) নিয়ন্ত্রণ করার জন্য কীভাবে ব্যাক ইভেন্ট ইন্টারসেপ্ট করতে হয় তার একটি উদাহরণ এখানে দেওয়া হল:
@Composable fun MyScreen() { var isExpanded by remember { mutableStateOf(false) } // Intercept the back button or gesture only when isExpanded is true BackHandler(enabled = isExpanded) { // Collapsing the content disables this handler, so it does not // receive the next back event. isExpanded = false } if (isExpanded) { Text("Expanded content. Go back to collapse it.") } else { Button(onClick = { isExpanded = true }) { Text("Expand") } } }
কম্পোজেবল ট্রি ইন্টারসেপশন
আপনার কম্পোজেবল ট্রির বিভিন্ন লেভেলে একাধিক চালু করা BackHandler কম্পোজেবল থাকলে, শুধুমাত্র সবচেয়ে ভিতরেরটি ব্যাক ইভেন্ট ইন্টারসেপ্ট করে।
Views-এর মাধ্যমে কাস্টম ব্যাক নেভিগেশন প্রয়োগ করা
ComponentActivity, FragmentActivity এবং
AppCompatActivity-এর মূল ক্লাস, আপনাকে OnBackPressedDispatcher ব্যবহার করে
'ফিরে যান' বোতামের আচরণ নিয়ন্ত্রণ করতে দেয়, যা আপনি
getOnBackPressedDispatcher() কল করে ফিরিয়ে আনতে পারবেন।
OnBackPressedDispatcher কন্ট্রোল করে যে কীভাবে 'ব্যাক' বোতামের ইভেন্ট
এক বা একাধিক OnBackPressedCallback অবজেক্টে ডিসপ্যাচ করা হয়। OnBackPressedCallback-এর
কনস্ট্রাক্টর প্রাথমিক চালু থাকা অবস্থার জন্য একটি বুলিয়ান নেয়। কলব্যাক চালু থাকলে, যেমন isEnabled() true রিটার্ন করলে, তবেই
ডিসপ্যাচার কলব্যাকের handleOnBackPressed() কল করে
ব্যাক বোতাম ইভেন্ট হ্যান্ডেল করবে। আপনি setEnabled()-এ কল করে চালু করার স্ট্যাটাস পরিবর্তন করতে পারবেন।
addCallback পদ্ধতি ব্যবহার করে কলব্যাক যোগ করা হয়। addCallback() পদ্ধতি ব্যবহার করুন যা LifecycleOwner নেয়। এইভাবে, LifecycleOwnerটি
Lifecycle.State.STARTED হলে তবেই
OnBackPressedCallback যোগ করা হয়। এছাড়াও, অ্যাক্টিভিটি রেজিস্টার করা কলব্যাক সরিয়ে দেয়
যখন সেটির সাথে যুক্ত LifecycleOwner ধ্বংস হয়ে যায়, এটি মেমরি লিক
প্রতিরোধ করে এবং এটিকে ফ্র্যাগমেন্ট বা অন্যান্য লাইফসাইকেল মালিকদের মধ্যে ব্যবহারের উপযুক্ত করে তোলে যেগুলির
অ্যাক্টিভিটির থেকে কম লাইফটাইম থাকে।
এখানে কলব্যাক প্রয়োগের একটি উদাহরণ দেওয়া হল:
class MyFragment : Fragment() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) // This callback will only be called when MyFragment is at least Started. val callback = requireActivity().onBackPressedDispatcher.addCallback(this) { // Handle the back button event } // The callback can be enabled or disabled here or in the lambda } ... }
আপনি addCallback() ব্যবহার করে একাধিক কলব্যাক প্রদান করতে পারবেন।
এটি করার সময়, কলব্যাকগুলি যে ক্রমে যোগ করা হয়েছে তার বিপরীত ক্রমে কল করা হয়—শেষ যোগ করা কলব্যাকটি প্রথমে Back বোতাম ইভেন্টটি পরিচালনা করার সুযোগ পায়। যেমন, আপনি যদি এই ক্রমে
one, two এবং three নামের তিনটি কলব্যাক যোগ করেন, তাহলে সেগুলি যথাক্রমে
three, two এবং one ক্রমে ইনভোক করা হবে।
কলব্যাক
দায়িত্বের চেইন
প্যাটার্ন অনুসরণ করে। চেনের প্রতিটি কলব্যাক তখনই ইনভোক করা হয়, যদি তার আগের
কলব্যাক চালু না থাকে। এর অর্থ হল, আগের
উদাহরণে, কলব্যাক three চালু না থাকলে তবেই কলব্যাক two
ইনভোক করা হবে। কলব্যাক two
চালু না থাকলে তবেই কলব্যাক one ইনভোক করা হবে এবং এই প্যাটার্নটি যেকোনও অতিরিক্ত কলব্যাকের জন্য চলতে থাকবে।
মনে রাখবেন যে addCallback() ব্যবহার করে যোগ করা হলে,
কলব্যাকটি দায়িত্বের চেনে যোগ করা হয় না যতক্ষণ না
LifecycleOwner
Lifecycle.State.STARTED
স্টেটে প্রবেশ করে।
কলব্যাকে চালু থাকা স্ট্যাটাস পরিবর্তন করার বিষয়টি সাময়িক পরিবর্তনের জন্য সাজেস্ট করা হয় কারণ এটি আগে বর্ণনা করা ক্রম বজায় রাখে, যা আপনার কাছে একাধিক নেস্টেড লাইফসাইকেল মালিকের জন্য রেজিস্টার করা কলব্যাক থাকলে বিশেষভাবে গুরুত্বপূর্ণ।
আপনি কলব্যাক সম্পূর্ণভাবে সরিয়ে দিতে চাইলে, remove() নম্বরে কল করুন।
সাধারণত এটি করার প্রয়োজন হয় না কারণ সংশ্লিষ্ট LifecycleOwner নষ্ট হয়ে গেলে
কলব্যাক অটোমেটিক সরিয়ে দেওয়া হয়।