onStop — Android میں Activity لائف سائیکل کا ایک طریقہ، جسے سسٹم کال کرتا ہے جب Activity صارف کو نظر آنا بند کر دیتی ہے۔ Activity اسٹیٹ Stopped میں چلی جاتی ہے جب کوئی نئی Activity اسے مکمل طور پر ڈھانپ لیتی ہے، یا ایپلیکیشن کو چھوٹا کرنے پر۔ onStop طریقہ میں، ڈیویلپر کو اینیمیشن روکنا، کیمرہ اور سینسر وسائل کو آزاد کرنا، اور درج کردہ ڈیٹا کے ڈرافٹ محفوظ کرنے چاہئیں۔ Android Vitals (Google, 2025) کے مطابق، onStop کی درست ہینڈلنگ ایپلیکیشن کو چھوٹا کرنے پر ANR (ایپلیکیشن جواب نہیں دے رہی) کی تعداد کو 35% کم کرتی ہے۔ onStop کے بعد، سسٹم onRestart (اسکرین پر واپسی) یا onDestroy (مکمل خاتمہ) کال کر سکتا ہے۔ Activity لائف سائیکل پر Android Developers کی دستاویزات onStop کو مرئی اور غیر مرئی حالت کے درمیان حد کے طور پر بیان کرتی ہیں۔
اہم نکات
onStop — AppCompatActivity کلاس (اور اس کے پیشرو Activity) کا ایک کال بیک طریقہ ہے، جسے Android آپریٹنگ سسٹم کال کرتا ہے جب Activity صارف کو مکمل طور پر نظر آنا بند کر دیتی ہے۔ اس وقت، Activity کسی دوسری Activity، ڈائیلاگ ونڈو، سسٹم لانچر یا لاک اسکرین کے ذریعے چھپی ہوتی ہے۔ لائف سائیکل کے نقطہ نظر سے، onStop onPause کے بعد آتا ہے اور اشارہ کرتا ہے کہ Activity اب اسکرین پر نظر نہیں آتی، اگرچہ Activity آبجیکٹ اور اس کی حالت میموری میں رہتی ہے۔
جب Activity Stopped (روکی گئی) حالت میں جاتی ہے، تو یہ اپنی حالت RAM میں برقرار رکھتی ہے — تمام فیلڈز، View درجہ بندی اور 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 ایپلیکیشنز بناتا ہے۔ ہم آپ کو مشورہ دیں گے اور بہترین حل تجویز کریں گے۔
مزید پڑھیں