ব্যবহারকারীরা ব্যাক নেভিগেশন ব্যবহার করে স্ক্রিনগুলোর মধ্যে পেছনে যান। বেশিরভাগ অ্যান্ড্রয়েড ডিভাইসে একটি ব্যাক বাটন থাকে—যা ফিজিক্যাল, সফটওয়্যার বা জেসচার-ভিত্তিক হতে পারে। সাধারণত, আপনার অ্যাপে একটি ব্যাক বাটন যোগ করা উচিত নয়। তবে, কম্প্যাটিবিলিটি মোডে থাকা অ্যান্ড্রয়েড অটোমোটিভ ওএস (AAOS) ডিভাইসগুলো একটি সিস্টেম ব্যাক বাটন ব্যবহার করে। এটি নেভিগেশনের কাজটি করে, তাই আপনার নিজের বাটন যোগ করার প্রয়োজন নেই। বিস্তারিত জানতে, AAOS কম্প্যাটিবিলিটি মোড দেখুন।
ব্যবহারকারী যখন আপনার অ্যাপ্লিকেশনের মধ্যে নেভিগেট করেন, তখন অ্যান্ড্রয়েড গন্তব্যগুলির একটি ব্যাক স্ট্যাক বজায় রাখে। এটি সাধারণত ব্যাক বাটন চাপলে অ্যান্ড্রয়েডকে পূর্ববর্তী গন্তব্যে সঠিকভাবে নেভিগেট করতে সাহায্য করে। তবে, এমন কিছু ক্ষেত্র রয়েছে যেখানে সর্বোত্তম ব্যবহারকারী অভিজ্ঞতা প্রদানের জন্য আপনার অ্যাপের নিজস্ব ব্যাক বিহেভিয়ার প্রয়োগ করার প্রয়োজন হতে পারে। উদাহরণস্বরূপ, একটি WebView ) ব্যবহার করার সময়, আপনি ডিফল্ট ব্যাক বাটনের বিহেভিয়ারকে ওভাররাইড করতে চাইতে পারেন, যাতে ব্যবহারকারী আপনার অ্যাপের পূর্ববর্তী স্ক্রিনগুলিতে না গিয়ে তাদের ওয়েব ব্রাউজিং হিস্টোরির মাধ্যমে ফিরে যেতে পারেন।
কম্পোজে কাস্টম ব্যাক নেভিগেশন প্রয়োগ করুন
Jetpack Compose-এ, আপনি BackHandler কম্পোজেবল ব্যবহার করে কাস্টম ব্যাক নেভিগেশন পরিচালনা করতে পারেন।
নেভিগেশন কম্পোজ ব্যবহার করার সময়, ব্যাক স্ট্যাকের আগের স্ক্রিনে নেভিগেট করার জন্য সাধারণত NavController.navigateUp() বা NavController.popBackStack() ব্যবহার করা হয়। তবে, ব্যবহারকারী যখন সিস্টেমের ব্যাক বাটন চাপেন বা ব্যাক জেসচার ব্যবহার করেন, তখন কাস্টম আচরণ প্রয়োগ করতে চাইলে BackHandler বেশ কার্যকর। উদাহরণস্বরূপ, আপনি যদি আপনার অ্যাপে একটি WebView প্রদর্শন করেন, তাহলে ব্যবহারকারীরা সিস্টেমের ব্যাক বাটন চাপলে আপনি তাদের ব্রাউজিং হিস্টোরির মাধ্যমে পিছনে নেভিগেট করার সুযোগ দিতে চাইতে পারেন।
আপনার কম্পোজেবল ট্রি-এর বিভিন্ন স্তরে যদি একাধিক সক্রিয় BackHandler কম্পোজেবল থাকে, তবে শুধুমাত্র সবচেয়ে ভেতরেরটিই ব্যাক ইভেন্টটি ইন্টারসেপ্ট করে।
ভিউ ব্যবহার করে কাস্টম ব্যাক নেভিগেশন বাস্তবায়ন করুন
ComponentActivity , যা FragmentActivity এবং AppCompatActivity এর বেস ক্লাস, আপনাকে এর OnBackPressedDispatcher ব্যবহার করে ব্যাক বাটনের আচরণ নিয়ন্ত্রণ করতে দেয়, যা আপনি getOnBackPressedDispatcher() কল করে পেতে পারেন।
OnBackPressedDispatcher নিয়ন্ত্রণ করে কীভাবে ব্যাক বাটন ইভেন্টগুলো এক বা একাধিক OnBackPressedCallback অবজেক্টে প্রেরণ করা হবে। OnBackPressedCallback এর কনস্ট্রাক্টরটি প্রাথমিক সক্রিয় অবস্থার জন্য একটি বুলিয়ান ভ্যালু গ্রহণ করে। শুধুমাত্র যখন একটি কলব্যাক সক্রিয় থাকে, উদাহরণস্বরূপ যখন isEnabled() true রিটার্ন করে, তখনই ডিসপ্যাচারটি ব্যাক বাটন ইভেন্টটি পরিচালনা করার জন্য কলব্যাকটির handleOnBackPressed() ফাংশনটিকে কল করবে। আপনি setEnabled() ফাংশনটি কল করে সক্রিয় অবস্থা পরিবর্তন করতে পারেন।
addCallback মেথড ব্যবহার করে কলব্যাক যোগ করা হয়। addCallback() মেথডটি ব্যবহার করুন, যা একটি LifecycleOwner গ্রহণ করে। এইভাবে, OnBackPressedCallback শুধুমাত্র তখনই যোগ করা হয় যখন LifecycleOwner টি Lifecycle.State.STARTED থাকে। অ্যাক্টিভিটিটি নিবন্ধিত কলব্যাকগুলিও সরিয়ে দেয় যখন তাদের সংশ্লিষ্ট 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 } ... }
জাভা
public class MyFragment extends Fragment { @Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); // This callback will only be called when MyFragment is at least Started. OnBackPressedCallback callback = new OnBackPressedCallback(true /* enabled by default */) { @Override public void handleOnBackPressed() { // Handle the back button event } }; requireActivity().getOnBackPressedDispatcher().addCallback(this, callback); // The callback can be enabled or disabled here or in handleOnBackPressed() } ... }
আপনি addCallback() ব্যবহার করে একাধিক কলব্যাক প্রদান করতে পারেন। এমনটা করলে, কলব্যাকগুলো যে ক্রমে যোগ করা হয় তার বিপরীত ক্রমে কল করা হয় - অর্থাৎ, সবশেষে যোগ করা কলব্যাকটিই প্রথমে 'Back' বাটনের ইভেন্টটি পরিচালনা করার সুযোগ পায়। উদাহরণস্বরূপ, যদি আপনি ক্রমানুসারে one , two এবং three নামের তিনটি কলব্যাক যোগ করেন, তাহলে সেগুলো যথাক্রমে three , two ' এবং one ক্রমে কল করা হবে।
কলব্যাকগুলো ‘চেইন অফ রেসপন্সিবিলিটি’ প্যাটার্ন অনুসরণ করে। চেইনের প্রতিটি কলব্যাক তখনই কল করা হয়, যখন তার পূর্ববর্তী কলব্যাকটি সক্রিয় থাকে না। এর মানে হলো, পূর্ববর্তী উদাহরণে, two কলব্যাকটি কেবল তখনই কল করা হবে যখন three কলব্যাকটি সক্রিয় থাকবে না। one কলব্যাকটি কেবল তখনই কল করা হবে যখন two কলব্যাকটি সক্রিয় থাকবে না, এবং এই প্যাটার্নটি পরবর্তী যেকোনো কলব্যাকের ক্ষেত্রেও চলতে থাকে।
উল্লেখ্য যে, addCallback() ব্যবহার করে যোগ করা হলে, LifecycleOwner যতক্ষণ না Lifecycle.State.STARTED অবস্থায় প্রবেশ করে, ততক্ষণ পর্যন্ত কলব্যাকটি দায়িত্বের শৃঙ্খলে যুক্ত হয় না।
অস্থায়ী পরিবর্তনের ক্ষেত্রে কলব্যাকের এনাবলড অবস্থা পরিবর্তন করার জন্য জোরালোভাবে সুপারিশ করা হয়, কারণ এটি পূর্বে বর্ণিত ক্রম বজায় রাখে, যা বিশেষভাবে গুরুত্বপূর্ণ যদি আপনার একাধিক ভিন্ন নেস্টেড লাইফসাইকেল ওনারের অধীনে কলব্যাক নিবন্ধিত থাকে।
তবে, যে ক্ষেত্রে আপনি কলব্যাকটি সম্পূর্ণরূপে মুছে ফেলতে চান, সেক্ষেত্রে আপনার remove() কল করা উচিত। যদিও সাধারণত এর প্রয়োজন হয় না, কারণ যখন কোনো কলব্যাকের সাথে যুক্ত LifecycleOwner ধ্বংস হয়ে যায় , তখন কলব্যাকগুলো স্বয়ংক্রিয়ভাবে মুছে যায়।