onStop — Android-এ Activity জীবনচক্রের একটি পদ্ধতি, যা সিস্টেম দ্বারা কল করা হয় যখন Activity ব্যবহারকারীর কাছে দৃশ্যমান হওয়া বন্ধ করে দেয়। Activity Stopped অবস্থায় চলে যায় যখন একটি নতুন Activity এটি সম্পূর্ণরূপে ঢেকে ফেলে, বা অ্যাপ্লিকেশনটি ছোট করার সময়। onStop পদ্ধতিতে, ডেভেলপারকে অ্যানিমেশন বন্ধ করতে, ক্যামেরা এবং সেন্সর সংস্থানগুলি মুক্ত করতে এবং প্রবেশ করানো ডেটার খসড়া সংরক্ষণ করতে হবে। Android Vitals (Google, 2025) অনুসারে, onStop-এর সঠিক হ্যান্ডলিং অ্যাপ্লিকেশন ছোট করার সময় ANR (অ্যাপ্লিকেশন প্রতিক্রিয়া করছে না) এর সংখ্যা 35% হ্রাস করে। onStop-এর পরে, সিস্টেম onRestart (স্ক্রিনে ফিরে আসা) বা onDestroy (সম্পূর্ণ সমাপ্তি) কল করতে পারে। Android Developers-এর Activity জীবনচক্র ডকুমেন্টেশন onStop-কে দৃশ্যমান এবং অদৃশ্য অবস্থার মধ্যে সীমানা হিসেবে বর্ণনা করে।
মূল বিষয়
onStop — AppCompatActivity ক্লাসের (এবং এর পূর্বসূরী Activity) একটি কলব্যাক পদ্ধতি, যা Android অপারেটিং সিস্টেম দ্বারা কল করা হয় যখন Activity ব্যবহারকারীর কাছে সম্পূর্ণরূপে দৃশ্যমান হওয়া বন্ধ করে দেয়। এই মুহূর্তে, Activity অন্য একটি Activity, ডায়ালগ উইন্ডো, সিস্টেম লঞ্চার বা লক স্ক্রিন দ্বারা লুকানো থাকে। জীবনচক্রের দৃষ্টিকোণ থেকে, onStop onPause-এর পরে আসে এবং সংকেত দেয় যে Activity আর স্ক্রিনে দৃশ্যমান নয়, যদিও Activity অবজেক্ট এবং তার অবস্থা মেমরিতে থাকে।
যখন Activity Stopped (থামানো) অবস্থায় যায়, এটি তার অবস্থা RAM-এ ধরে রাখে — সমস্ত ফিল্ড, ভিউ হায়ারার্কি এবং ViewModel অ্যাক্সেসযোগ্য থাকে। এটি Stopped-কে Destroyed (ধ্বংস) অবস্থা থেকে আলাদা করে, যেখানে Activity সম্পূর্ণরূপে মুছে ফেলা হয়। সিস্টেম UI মেমরির অভাব হলে Stopped অবস্থায় অ্যাপ্লিকেশন প্রক্রিয়াটি মেরে ফেলতে পারে — এটি তথাকথিত প্রক্রিয়া মৃত্যু। ডেভেলপারকে গুরুত্বপূর্ণ ডেটা (খসড়া, স্ক্রোল অবস্থান) onSaveInstanceState()-এ সংরক্ষণ করতে হবে, যা onStop-এর আগে কল করা হয়, যাতে প্রক্রিয়া মৃত্যুর সময় পুনরুদ্ধার নিশ্চিত হয়।
Android সামঞ্জস্যতা সংজ্ঞা দলিল (CDD) সংস্করণ 14+ অনুসারে, Stopped অবস্থায় একটি প্রক্রিয়ার OOM Killer দ্বারা নিহত হওয়ার অগ্রাধিকার কম — ব্যাকগ্রাউন্ড পর্যায়ের প্রক্রিয়াগুলির চেয়ে কম, কিন্তু ক্যাশে করা প্রক্রিয়াগুলির চেয়ে বেশি। Google পরিসংখ্যান অনুসারে, 68% প্রক্রিয়া মৃত্যুর ঘটনা ঘটে যখন Activity Stopped অবস্থায় থাকে, Paused নয়।
onStop কল করা হয় যখন Activity সম্পূর্ণরূপে দৃশ্যমানতা হারায়, কারণ যাই হোক না কেন: বর্তমানের উপরে একটি নতুন Activity শুরু করা, অ্যাপ্লিকেশন ছোট করা (হোম চাপা), স্ক্রিন লক করা, আগত কল, বা সিস্টেম ডায়ালগ খোলা। এই সমস্ত ক্ষেত্রে, Activity প্রথমে onPause (আংশিক ফোকাস হারানো) পায়, তারপর onStop (সম্পূর্ণ দৃশ্যমানতা হারানো) পায়।
onStop কলের প্রধান পরিস্থিতি:
এটি বোঝা গুরুত্বপূর্ণ যে স্ক্রিন ঘূর্ণনে onStop কল করা হয় না — এই ক্ষেত্রে, Activity ধ্বংস (onPause → onStop → onDestroy) এবং পুনরায় তৈরি (onCreate → onStart → onResume) হয়। ব্যতিক্রম হল ম্যানিফেস্টে android:configChanges="orientation" ফ্ল্যাগ, যা Activity পুনর্নির্মাণ প্রতিরোধ করে এবং পরিবর্তে onConfigurationChanged() কল করে।
onStop Activity জীবনচক্রের ক্রমে দৃশ্যমান এবং অদৃশ্য অবস্থার মধ্যে একটি কেন্দ্রীয় স্থান দখল করে। সম্পূর্ণ ক্রম: onCreate → onStart → onResume → (সক্রিয় অবস্থা) → onPause → onStop → onDestroy (অথবা ফিরে আসার সময় onRestart → onStart → onResume)।
| অবস্থা | পদ্ধতি | দৃশ্যমানতা | ইন্টারঅ্যাকশন | মেমরি |
|---|---|---|---|---|
| Created | onCreate | না | না | বরাদ্দ |
| Started | onStart | আংশিক | না | সম্পূর্ণ |
| Resumed | onResume | সম্পূর্ণ | হ্যাঁ | সম্পূর্ণ |
| Paused | onPause | আংশিক | না | সম্পূর্ণ |
| Stopped | onStop | না | না | সম্পূর্ণ* |
| Destroyed | onDestroy | না | না | মুক্ত |
*Stopped অবস্থায়, Activity মেমরিতে রাখা হয় কিন্তু সম্পদের অভাবে সিস্টেম দ্বারা মারা যেতে পারে। Stopped প্রক্রিয়া মারার অগ্রাধিকার শেষ থেকে দ্বিতীয়, শুধুমাত্র ক্যাশে করা খালি প্রক্রিয়াগুলির উপরে।
onStop এবং onSaveInstanceState: সিস্টেম গতিশীল UI অবস্থা সংরক্ষণের জন্য onStop-এর আগে onSaveInstanceState(Bundle) কল করে। ডেভেলপার এই পদ্ধতি ওভাররাইড করে ইনপুট ফিল্ডের মান, RecyclerView অবস্থান এবং নির্বাচিত আইটেম Bundle-এ সংরক্ষণ করে। এমনকি যদি Activity ধ্বংস না হয় (ব্যবহারকারী শুধু ছোট করে ফিরে এসেছে), Bundle কনফিগারেশন পরিবর্তনে onCreate-এ পাস করা হয়। Google শুধুমাত্র ক্ষণস্থায়ী UI অবস্থা — রিপোজিটরি ডেটা বা ViewModel নয়, যা Activity-র বাইরে থাকে — সংরক্ষণের পরামর্শ দেয়।
onStop-এ, ডেভেলপারকে সেই সমস্ত সংস্থান মুক্ত করতে হবে যা Activity দৃশ্যমান না হলে প্রয়োজন হয় না। এটি ব্যাটারি, CPU এবং মেমরির বোঝা হ্রাস করে, এবং Activity-তে ফিরে আসার সময় ANR প্রতিরোধ করে।
onStop-এ কী মুক্ত করবেন:
onStop-এ কী করবেন না: দীর্ঘস্থায়ী অপারেশন করবেন না — ডেটাবেসে বড় ডেটা সংরক্ষণ, নেটওয়ার্ক অনুরোধ, জটিল গণনা। onStop মূল থ্রেডে চলে এবং Activity-তে ফিরে আসা ব্লক করে। দীর্ঘস্থায়ী অপারেশনের জন্য, বিলম্ব সহ WorkManager বা viewModelScope-এ করুটিন ব্যবহার করুন। ViewModel সংস্থানগুলি মুক্ত করবেন না — ViewModel onStop থেকে বেঁচে থাকে এবং ফিরে আসার সময় ব্যবহার করা হবে।
onPause এবং onStop দৃশ্যমানতা হারানোর মাত্রা এবং বাধ্যতামূলক কর্মের পরিধিতে ভিন্ন। onPause আংশিক ফোকাস হারানোর সময় কল করা হয় (যেমন ডায়ালগ উইন্ডো বা সিস্টেম মেনু খোলা), onStop — সম্পূর্ণ দৃশ্যমানতা হারানোর সময়। এই পার্থক্য প্রতিটি পর্যায়ে কোন সংস্থানগুলি মুক্ত করতে হবে তা বেছে নেওয়ার জন্য গুরুত্বপূর্ণ।
| বৈশিষ্ট্য | onPause | onStop |
|---|---|---|
| দৃশ্যমানতার স্তর | আংশিকভাবে দৃশ্যমান | সম্পূর্ণরূপে অদৃশ্য |
| ফোকাস | হারানো | হারানো |
| নির্বাহের সময় | 500 মিলিসেকেন্ড পর্যন্ত | 5 সেকেন্ড পর্যন্ত (ANR টাইমআউট) |
| মুক্ত করার সংস্থান | গুরুত্বপূর্ণ (মিডিয়া, ক্যামেরা) | সমস্ত অদৃশ্য (সেন্সর, অ্যানিমেশন, অবস্থান) |
| পুনরুদ্ধার | onResume | onRestart → onStart → onResume |
| প্রক্রিয়া অগ্রাধিকার | উচ্চ (অগ্রভাগ) | মধ্যম (পশ্চাৎভাগ) |
সাধারণ নিয়ম: onPause-এ, সেই সিস্টেম সংস্থানগুলি মুক্ত করুন যা অবিলম্বে অন্য অ্যাপ্লিকেশনের ব্যবহারকারীর অভিজ্ঞতাকে প্রভাবিত করে (ক্যামেরা, মিডিয়া প্লেয়ার); onStop-এ — বাকি সমস্ত সংস্থান যা Activity লুকানো থাকলে প্রয়োজন নেই। Google দ্রুত সুইচিংয়ের সময় onStop কল নাও হতে পারে বলে onPause-এ গুরুত্বপূর্ণ ব্যবহারকারী ডেটা (ইমেল খসড়া, সেটিংস) সংরক্ষণের পরামর্শ দেয়।
যখন ব্যবহারকারী একটি লুকানো Activity-তে ফিরে আসে, সিস্টেম onRestart → onStart → onResume কল করে। onRestart পদ্ধতি সংকেত দেয় যে Activity Stopped অবস্থা থেকে ফিরে আসছে। এটি UI এবং সেই সংস্থানগুলি পুনরুদ্ধারের জন্য একটি গুরুত্বপূর্ণ পর্যায় যা onStop-এ মুক্ত করা হয়েছিল।
ফিরে আসার সময় কল ক্রম:
যদি অ্যাপ্লিকেশন প্রক্রিয়া Stopped অবস্থায় সিস্টেম দ্বারা মেরে ফেলা হয়, onRestart-এর পরিবর্তে onCreate কল করা হয়, এবং onSaveInstanceState থেকে Bundle অবস্থা পুনরুদ্ধারের জন্য পাস করা হয়। এই পরিস্থিতি (প্রক্রিয়া মৃত্যু) Android অ্যাপ্লিকেশনে বাগের সবচেয়ে সাধারণ কারণগুলির মধ্যে একটি: ডেভেলপাররা onRestart বাস্তবায়ন করে কিন্তু প্রক্রিয়া মৃত্যুর পরে onCreate-এর মাধ্যমে পুনরুদ্ধার বিবেচনা করতে ভুলে যায়।
Activity লুকানোর সময় সঠিক সেন্সর সদস্যতা বাতিল এবং অ্যানিমেশন বন্ধ করা প্রদর্শন করে। স্ক্রিনে ফিরে আসার সময়, onStart-এ সংস্থানগুলি পুনরুদ্ধার করা হয়।
class MainActivity : AppCompatActivity() {
private lateinit var sensorManager: SensorManager
private var accelerometer: Sensor? = null
private var rotationAnimator: ObjectAnimator? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
sensorManager = getSystemService(Context.SENSOR_SERVICE) as SensorManager
accelerometer = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER)
}
override fun onStart() {
super.onStart()
accelerometer?.let {
sensorManager.registerListener(sensorListener, it, SensorManager.SENSOR_DELAY_NORMAL)
}
rotationAnimator = ObjectAnimator.ofFloat(findViewById(R.id.icon), "rotation", 0f, 360f)
rotationAnimator?.apply {
duration = 3000
repeatMode = ValueAnimator.RESTART
repeatCount = ValueAnimator.INFINITE
start()
}
}
override fun onStop() {
super.onStop()
sensorManager.unregisterListener(sensorListener)
rotationAnimator?.cancel()
}
override fun onRestart() {
super.onRestart()
Log.d("MainActivity", "Activity Stopped অবস্থা থেকে ফিরে আসছে")
}
private val sensorListener = SensorEventListener { event, _ ->
Log.d("MainActivity", "ত্বরণ: x=${event.values[0]}, y=${event.values[1]}, z=${event.values[2]}")
}
}
কোডটি onStart-এ অ্যাক্সেলেরোমিটার সেন্সর নিবন্ধন করে এবং একটি অসীম ঘূর্ণন অ্যানিমেশন শুরু করে। onStop-এ, সেন্সর অনিবন্ধিত হয় এবং অ্যানিমেশন বাতিল হয় — এটি Activity লুকানো থাকলে ব্যাটারি খরচ প্রতিরোধ করে। onRestart → onStart-এর মাধ্যমে ফিরে আসার পরে, সংস্থানগুলি পুনরায় তৈরি হয়।
ViewModel + SavedStateHandle ব্যবহার করে আধুনিক পদ্ধতি। ম্যানুয়াল Bundle হ্যান্ডলিং ছাড়াই onStop-এর সময় ফর্ম ডেটা স্বয়ংক্রিয়ভাবে সংরক্ষিত হয়।
class FormViewModel(
private val savedStateHandle: SavedStateHandle
) : ViewModel() {
var email: String
get() = savedStateHandle["email"] ?: ""
set(value) { savedStateHandle["email"] = value }
var message: String
get() = savedStateHandle["message"] ?: ""
set(value) { savedStateHandle["message"] = value }
}
class FormActivity : AppCompatActivity() {
private val viewModel: FormViewModel by viewModels()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_form)
Log.d("FormActivity", "onCreate: email=${viewModel.email}")
}
override fun onStop() {
super.onStop()
Log.d("FormActivity", "onStop: ডেটা SavedStateHandle-এ সংরক্ষিত")
}
}
SavedStateHandle স্বয়ংক্রিয়ভাবে onSaveInstanceState-এর সময় Bundle-এ মান সংরক্ষণ করে, যা onStop-এর আগে কল করা হয়। স্ক্রিন ঘূর্ণন বা প্রক্রিয়া মৃত্যুর সময়, ডেটা ক্ষতি ছাড়াই পুনরুদ্ধার হয়। Google প্রত্যক্ষ onSaveInstanceState-এর পরিবর্তে ফর্ম এবং খসড়ার জন্য SavedStateHandle সুপারিশ করে।
onStop-এ রূপান্তরের সময় অ্যাসিঙ্ক্রোনাস ডেটা সংরক্ষণের জন্য করুটিন সহ lifecycleScope-এর ব্যবহার। করুটিন প্রধান থ্রেড ব্লক না করে IO ডিসপ্যাচারে চলে।
class NoteActivity : AppCompatActivity() {
private val noteRepository = NoteRepository()
override fun onStop() {
lifecycleScope.launch(Dispatchers.IO) {
val text = findViewById<EditText>(R.id.note_content).text.toString()
noteRepository.saveDraft(text)
withContext(Dispatchers.Main) {
Log.d("NoteActivity", "খসড়া onStop-এ সংরক্ষিত")
}
}
super.onStop()
}
}
lifecycleScope.launch করুটিন স্বয়ংক্রিয়ভাবে বাতিল হয় যদি Activity জীবনচক্র শেষ হয়। Dispatchers.IO-এর ব্যবহার নিশ্চিত করে যে ডেটাবেস বা ফাইল লেখা Activity-তে ফিরে আসা ব্লক করে না। Google-এর মতে, lifecycleScope-এ করুটিন onStop-এ অ্যাসিঙ্ক্রোনাস অপারেশন করার পছন্দের উপায়।
প্রায়শই জিজ্ঞাসিত প্রশ্ন
onStop — Activity দৃশ্যমান হওয়া বন্ধ করে কিন্তু Stopped অবস্থায় মেমরিতে থাকে। সিস্টেম onRestart-এর মাধ্যমে Activity ফিরিয়ে আনতে পারে। onDestroy — Activity ধ্বংস হয়, মেমরি মুক্ত হয়। onDestroy-এর পরে, শুধুমাত্র Activity-র নতুন উদাহরণ (onCreate) তৈরি করে ফিরে আসা সম্ভব।
হ্যাঁ, বাধ্যতামূলক। super.onStop() সিস্টেম উপাদানগুলির সঠিক কার্যকারিতা নিশ্চিত করে: ফ্র্যাগমেন্ট, LoaderManager, ViewModelStore। super.onStop() বাদ দিলে মেমরি লিক এবং ভুল ফ্র্যাগমেন্ট পুনরুদ্ধার হতে পারে। সর্বদা super.onStop() শেষে বা শুরুতে কল করুন — ক্রম গুরুত্বপূর্ণ নয়, কিন্তু কল বাধ্যতামূলক।
প্রতিটি জীবনচক্র পদ্ধতিতে Log.d বা Timber ব্যবহার করুন। আপনার Activity ট্যাগ দ্বারা logcat ফিল্টার চালু করুন। উৎপাদনের জন্য, Android Vitals ব্যবহার করুন — Google স্বয়ংক্রিয়ভাবে জীবনচক্র মেট্রিক সংগ্রহ করে এবং Play Console-এ অসঙ্গতি দেখায়। ProcessLifecycleOwner-এর মাধ্যমেও জীবনচক্র পর্যবেক্ষণ উপলব্ধ।
onStop-এ অ্যাকট ব্যতিক্রম অ্যাপ্লিকেশনের Force Close ঘটায়। সিস্টেম জীবনচক্র কলব্যাকে ব্যতিক্রম ধরে না। যদি onStop-এ এমন অপারেশন করা হয় যা ব্যতিক্রম নিক্ষেপ করতে পারে (ফাইল অপারেশন, নেটওয়ার্ক), সেগুলি try-catch-এ মোড়ান এবং super.onStop() বাধা না দিয়ে ত্রুটি লগ করুন।
না, Activity-তে Bitmap GC দ্বারা সংগ্রহ করা হবে যদি এর কোনো রেফারেন্স না থাকে। onStop-এ জোর করে মুক্ত করা (recycle()) প্রয়োজনীয় নয় এবং এমনকি ক্ষতিকারকও হতে পারে — যদি Activity onRestart-এর মাধ্যমে ফিরে আসে, তাহলে Bitmap পুনরায় লোড করতে হবে। ছবি লোড করার জন্য Glide বা Coil ব্যবহার করুন — এই লাইব্রেরিগুলি স্বয়ংক্রিয়ভাবে ক্যাশিং এবং জীবনচক্র পরিচালনা করে।
সারসংক্ষেপ
আমরা একটি মোবাইল অ্যাপ্লিকেশন টার্নকি তৈরি করব
IT Sectr 2017 সাল থেকে স্টার্টআপ এবং ব্যবসার জন্য iOS এবং Android অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।
আরও পড়ুন