যখন আপনি একটি অ্যান্ড্রয়েড অ্যাপ তৈরি করা শুরু করেন, তখন আপনি বুঝতে পারেন যে এটি কম্পিউটারের প্রোগ্রামিং করার মতো নয়, যেখানে আপনি শুধু একটি প্রোগ্রাম খোলেন এবং কাজ শেষ। মোবাইলের ক্ষেত্রে পরিস্থিতি সম্পূর্ণ ভিন্ন, কারণ ব্যবহারকারী ক্রমাগত বিভিন্ন অ্যাপের মধ্যে আসা-যাওয়া করেন , ব্রাউজিংয়ে বাধা সৃষ্টিকারী কল রিসিভ করেন, অথবা স্ক্রিন ঘোরান, যা ডিভাইসটিকে ফ্রিজ হওয়া থেকে বাঁচাতে সিস্টেমকে অত্যন্ত কঠোরভাবে মেমোরি পরিচালনা করতে বাধ্য করে।
মূলত, অ্যাক্টিভিটি হলো একটি মৌলিক উপাদান যা একটি স্ক্রিনকে উপস্থাপন করে, যার সাথে ব্যবহারকারী ইন্টারঅ্যাক্ট করতে পারে। কিন্তু একটি মসৃণ অভিজ্ঞতা নিশ্চিত করতে এবং অ্যাপ ক্র্যাশ করা বা ডেটা হারিয়ে যাওয়া রোধ করতে, অ্যান্ড্রয়েড স্টেট মেশিন নামক একটি সিস্টেম ব্যবহার করে । কলব্যাক নামক একাধিক মেথডের মাধ্যমে অ্যাক্টিভিটি তার বর্তমান অবস্থা সম্পর্কে আমাদের জানায়, যার ফলে আমরা সিদ্ধান্ত নিতে পারি কখন একটি ভিডিও পজ করতে হবে, ড্রাফট সেভ করতে হবে, বা অন্য কোনো অ্যাপ্লিকেশনের ব্যবহারের জন্য ক্যামেরাটি ছেড়ে দিতে হবে।
রাষ্ট্রসমূহের মানচিত্র: এই প্রবাহ কীভাবে কাজ করে?
এটি বোঝার জন্য, কল্পনা করুন যে অ্যাক্টিভিটিটি তৈরি হওয়া থেকে শুরু করে সিস্টেম দ্বারা অপসারিত হওয়া পর্যন্ত একটি পথ অনুসরণ করে। এই পথটি রৈখিক নয়, কারণ ব্যবহারকারীর কার্যকলাপের উপর নির্ভর করে অ্যাক্টিভিটিটি বিভিন্ন অবস্থার মধ্যে আসা-যাওয়া করতে পারে । আমরা যে পর্যায় পরিবর্তন করেছি তা বোঝানোর জন্য, সিস্টেম "on" উপসর্গ দিয়ে শুরু হওয়া নির্দিষ্ট মেথডগুলো কল করে।
স্টার্টআপ: অনক্রিয়েট এবং অনস্টার্ট
সবকিছু শুরু হয় onCreate মেথড দিয়ে । এটি হলো "এগ" পর্যায়, যেখানে প্রাথমিক কনফিগারেশন শুধুমাত্র একবার করা হয়। এখানেই আমরা ডেটাকে ভিউয়ের সাথে লিঙ্ক করি, ViewModel-কে যুক্ত করি এবং ইন্টারফেসের ডিজাইন নির্ধারণ করি। অ্যাক্টিভিটি সঠিকভাবে তৈরি হওয়ার জন্য সুপারক্লাসকে কল করা অপরিহার্য। এটি শেষ হয়ে গেলে, আমরা onStart পর্যায়ে প্রবেশ করি , যখন অ্যাপটি ব্যবহারকারীর কাছে দৃশ্যমান হয়, যদিও এটি তখনও ইন্টারেক্টিভ থাকে না। ইন্টারফেসকে সক্রিয় রাখার কোড ইনিশিয়ালাইজ করার জন্য এটিই আদর্শ জায়গা।
প্রকৃত মিথস্ক্রিয়া: অনরেজ্যুমে
যখন অ্যাক্টিভিটি ফোরগ্রাউন্ডে ফিরে আসে এবং ব্যবহারকারী বাটন ট্যাপ করতে বা টাইপ করতে পারেন, তখন `onResume` মেথডটি ট্রিগার হয় । এই অবস্থায়, অ্যাপটির উপর সম্পূর্ণ ফোকাস থাকে। যদি ব্যবহারকারী কোনো কল রিসিভ করেন বা কোনো আধা-স্বচ্ছ ডায়ালগ খোলেন, তাহলে অ্যাক্টিভিটি এই অবস্থা থেকে বেরিয়ে যাবে। তাই, পজের সময় রিলিজ হওয়া কম্পোনেন্টগুলো , যেমন ক্যামেরা প্রিভিউ, পুনরায় চালু করার জন্য এই মেথডটি ব্যবহার করার পরামর্শ দেওয়া হয়, যাতে ব্যবহারকারী ফিরে আসার পর সবকিছু ঠিকঠাক কাজ করে।
আংশিক প্রত্যাহার: বিরতিতে
`onPause` মেথডটি হলো ব্যবহারকারী যে স্ক্রিনটি ছেড়ে যাচ্ছেন তার প্রথম লক্ষণ। মনে রাখবেন, এর মানে এই নয় যে অ্যাক্টিভিটিটি ধ্বংস হয়ে যাবে। অ্যাপটি তখনও দেখা যেতে পারে, যেমন স্প্লিট-স্ক্রিন বা মাল্টি-উইন্ডো মোডে , কিন্তু এটির উপর আর ফোকাস থাকে না। ব্যাটারি সাশ্রয়ের জন্য অ্যানিমেশন থামানো বা জিপিএস-এর মতো সেন্সরের ব্যবহার বন্ধ করার জন্য এটি একটি উপযুক্ত জায়গা। তবে, এখানে ডেটাবেসে ডেটা সেভ করার মতো রিসোর্স-ইনটেনসিভ কাজ করা উচিত নয়, কারণ সিস্টেম ব্লক হওয়া এড়াতে এই মেথডটিকে খুব দ্রুত এক্সিকিউট করতে হয়।
সম্পূর্ণ অদৃশ্যতা: অনস্টপ এবং অনরিস্টার্ট
যখন স্ক্রিনটি সম্পূর্ণ ফাঁকা থাকে, তখন আমরা onStop ধাপে প্রবেশ করি । ব্যবহারকারী অ্যাপটি না দেখলে যে রিসোর্সগুলো অপ্রয়োজনীয় হয়ে পড়ে, সেগুলোকে এই পর্যায়ে মুক্ত করতে হয়। যদি আমাদের সিপিইউ-নির্ভর সেভ করার বা লোকাল স্টোরেজে ডেটা সংরক্ষণ করার প্রয়োজন হয়, তবে এটিই আদর্শ সময়। যদি ব্যবহারকারী রিসেন্ট অ্যাপস তালিকা থেকে অ্যাপটিতে ফিরে আসার সিদ্ধান্ত নেন, তবে সিস্টেম একেবারে গোড়া থেকে শুরু করে না। এর পরিবর্তে, এটি onRestart ধাপটি কল করে এবং তারপর onStart ও onResume ধাপগুলো অনুসরণ করে, ঠিক যেখান থেকে কার্যক্রম থেমেছিল সেখান থেকেই পুনরায় শুরু করে।
পথের শেষ: ধ্বংস করো
অবশেষে, আমরা onDestroy- তে আসি । অ্যাক্টিভিটিটি মেমরি থেকে মুছে ফেলার ঠিক আগে এই মেথডটি চলে। এটি ঘটতে পারে কারণ ব্যবহারকারী অ্যাপটি স্থায়ীভাবে বন্ধ করে দিয়েছেন অথবা কোনো কনফিগারেশন পরিবর্তনের কারণে সিস্টেম এটিকে বন্ধ করার সিদ্ধান্ত নিয়েছে , যেমন স্ক্রিনটি পোর্ট্রেট থেকে ল্যান্ডস্কেপে ঘোরানো। থ্রেডগুলো পরিষ্কার করার বা এমন সংযোগগুলো বন্ধ করার এটিই শেষ সুযোগ, যেগুলো খোলা থাকলে মেমরি লিকের কারণ হতে পারে।
মেমরি ব্যবস্থাপনা এবং ডেটা টিকে থাকা

অ্যান্ড্রয়েড খুবই বাস্তববাদী: ফোরগ্রাউন্ডে চলমান কোনো অ্যাপের জন্য যদি র্যামের প্রয়োজন হয়, তবে এটি ব্যাকগ্রাউন্ড প্রসেস বন্ধ করে দিতে দ্বিধা করে না । আপনার অ্যাপটি বন্ধ হয়ে যাওয়ার সম্ভাবনা তার অবস্থার উপর নির্ভর করে: একটি বন্ধ অ্যাক্টিভিটি, পুনরায় চালু হওয়া অ্যাক্টিভিটির চেয়ে অনেক বেশি ঝুঁকিপূর্ণ। একারণেই ব্যাকআপ কৌশল বাস্তবায়ন করা অত্যাবশ্যক।
স্ক্রিন ঘোরানোর সমস্যা
অনেকেই অবাক হয়ে দেখেন যে, ফোন ঘোরানোর সময় তাদের দেওয়া ডেটা অদৃশ্য হয়ে যায়। এমনটা ঘটে কারণ ফোন ঘোরানোর ফলে অ্যাক্টিভিটিটি সম্পূর্ণভাবে ধ্বংস হয়ে যায় এবং পুনরায় তৈরি হয়। এই ঝামেলা এড়াতে, Jetpack Compose-এর rememberSaveable-এর মতো টুল UI-কে স্বয়ংক্রিয়ভাবে লাইটওয়েট স্টেটগুলো সংরক্ষণ করতে সাহায্য করে, অথবা ViewModel ব্যবহার করে বিজনেস লজিককে ভিউ-এর লাইফসাইকেল থেকে আলাদা রাখা হয়।
আধুনিক নেভিগেশন এবং স্থাপত্য
বর্তমানে, একক-অ্যাক্টিভিটি আর্কিটেকচার ব্যবহার করার পরামর্শ দেওয়া হয় । প্রতিটি স্ক্রিনের জন্য একটি নতুন অ্যাক্টিভিটি চালু করার পরিবর্তে, কম্পোজেবল স্ক্রিনগুলোর মধ্যে স্যুইচ করার জন্য একটিমাত্র কন্টেইনার এবং নেভিগেশন কম্পোনেন্ট ব্যবহার করা হয়। এটি লাইফসাইকেল ম্যানেজমেন্টকে ব্যাপকভাবে সরল করে, কারণ আমাদের বিভিন্ন অ্যাক্টিভিটি ইনস্ট্যান্সের মধ্যে এতগুলো জটিল ট্রানজিশন সমন্বয় করতে হয় না।
এই ট্রানজিশনগুলো আয়ত্ত করার মাধ্যমে একটি অ্যাপ্লিকেশন শক্তিশালী হয়ে ওঠে, যা কল এলে সেটিকে অপ্রত্যাশিতভাবে বন্ধ হওয়া থেকে রক্ষা করে এবং ব্যবহারকারী ডিভাইস ঘোরালেও বা অ্যাপ্লিকেশন পরিবর্তন করলেও তার কাজের অগ্রগতি অক্ষুণ্ণ রাখে। এর ফলে সার্বিক পারফরম্যান্স এবং ব্যবহারকারীর অভিজ্ঞতা উন্নত হয়। এই তথ্যটি শেয়ার করুন যাতে অন্য ব্যবহারকারীরাও এ সম্পর্কে জানতে পারে ।
