onStop — Android لائف سائیکل میں Activity چھپانا

مصنف: IT Sectr اشاعت: 2026-03-04 مطالعے کا وقت: 9 منٹ

onStop — Android میں Activity لائف سائیکل کا ایک طریقہ، جسے سسٹم کال کرتا ہے جب Activity صارف کو نظر آنا بند کر دیتی ہے۔ Activity اسٹیٹ Stopped میں چلی جاتی ہے جب کوئی نئی Activity اسے مکمل طور پر ڈھانپ لیتی ہے، یا ایپلیکیشن کو چھوٹا کرنے پر۔ onStop طریقہ میں، ڈیویلپر کو اینیمیشن روکنا، کیمرہ اور سینسر وسائل کو آزاد کرنا، اور درج کردہ ڈیٹا کے ڈرافٹ محفوظ کرنے چاہئیں۔ Android Vitals (Google, 2025) کے مطابق، onStop کی درست ہینڈلنگ ایپلیکیشن کو چھوٹا کرنے پر ANR (ایپلیکیشن جواب نہیں دے رہی) کی تعداد کو 35% کم کرتی ہے۔ onStop کے بعد، سسٹم onRestart (اسکرین پر واپسی) یا onDestroy (مکمل خاتمہ) کال کر سکتا ہے۔ Activity لائف سائیکل پر Android Developers کی دستاویزات onStop کو مرئی اور غیر مرئی حالت کے درمیان حد کے طور پر بیان کرتی ہیں۔

اہم نکات

  • onStop — وہ طریقہ جو Activity کے مکمل طور پر دیدہ کھونے پر کال کیا جاتا ہے، لیکن Activity اب بھی میموری میں ہوتی ہے۔
  • onStop کے بعد، Activity Stopped حالت میں چلی جاتی ہے — میموری میں زندہ، لیکن نظر نہیں آتی اور صارف کے ساتھ تعامل نہیں کرتی۔
  • سسٹم Activity پر واپسی پر onRestart → onStart → onResume یا خاتمے پر onDestroy کال کر سکتا ہے۔
  • onStop میں وسائل کو آزاد کرنا ضروری ہے: اینیمیشن روکیں، سینسر اور کیمرہ بند کریں، درمیانی ڈیٹا محفوظ کریں۔
  • ملٹی ٹاسکنگ اور چھوٹا کرنے کے دوران ایپلیکیشن کے استحکام کے لیے onStop کا درست نفاذ ایک اہم عنصر ہے۔

Android میں 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 کب کال کیا جاتا ہے: منظرنامے اور ترتیب

onStop اس وقت کال کیا جاتا ہے جب Activity مکمل طور پر دیدہ کھو دیتی ہے، وجہ کچھ بھی ہو: موجودہ کے اوپر نئی Activity شروع کرنا، ایپلیکیشن کو چھوٹا کرنا (ہوم دبانا)، اسکرین لاک کرنا، آنے والی کال، یا سسٹم ڈائیلاگ کھولنا۔ ان تمام صورتوں میں، Activity پہلے onPause (جزوی فوکس کھونا) حاصل کرتی ہے، پھر onStop (مکمل دیدہ کھونا) حاصل کرتی ہے۔

onStop کال کے اہم منظرنامے:

  • موجودہ کے اوپر نئی Activity شروع کرنا — موجودہ Activity onPause، پھر onStop حاصل کرتی ہے؛ نئی Activity onCreate → onStart → onResume سے گزرتی ہے۔
  • ایپلیکیشن کو چھوٹا کرنا (ہوم) — Activity 200–300 ملی سیکنڈ میں onPause → onStop میں جاتی ہے، Stopped حالت میں میموری میں رہتی ہے۔
  • اسکرین لاک کرنا — سسٹم onPause → onStop کال کرتا ہے کیونکہ لاک اسکرین Activity کو مکمل طور پر ڈھانپ لیتی ہے۔
  • آنے والی کال — فون ایپلیکیشن (ڈائلر) اوپر شروع ہوتی ہے، موجودہ Activity onStop میں جاتی ہے۔
  • دوسری ایپلیکیشن پر سوئچ کرنا (حالیہ ایپلیکیشنز) — Activity چھپ جاتی ہے، onStop حاصل کرتی ہے، لیکن عمل کیش میں رہتی ہے۔

یہ سمجھنا ضروری ہے کہ اسکرین گھومنے پر onStop کال نہیں کیا جاتا — اس صورت میں، Activity تباہ (onPause → onStop → onDestroy) اور دوبارہ تخلیق (onCreate → onStart → onResume) ہوتی ہے۔ استثنا مینی فیسٹ میں android:configChanges="orientation" فلیگ ہے، جو Activity کی دوبارہ تخلیق کو روکتا ہے اور اس کے بجائے onConfigurationChanged() کال کرتا ہے۔

Activity لائف سائیکل میں onStop

onStop Activity لائف سائیکل کی ترتیب میں مرئی اور غیر مرئی حالت کے درمیان ایک مرکزی مقام رکھتا ہے۔ مکمل ترتیب: onCreate → onStart → onResume → (فعال حالت) → onPause → onStop → onDestroy (یا واپسی پر onRestart → onStart → onResume)۔

حالتطریقہدیدہتعاملمیموری
CreatedonCreateنہیںنہیںمختص
StartedonStartجزوینہیںمکمل
ResumedonResumeمکملہاںمکمل
PausedonPauseجزوینہیںمکمل
StoppedonStopنہیںنہیںمکمل*
DestroyedonDestroyنہیںنہیںآزاد

*Stopped حالت میں، Activity میموری میں رکھی جاتی ہے لیکن وسائل کی کمی پر سسٹم کے ذریعے ختم کی جا سکتی ہے۔ Stopped عمل کو ختم کرنے کی ترجیح آخری سے دوسری ہے، صرف کیش شدہ خالی عمل سے اوپر۔

onStop اور onSaveInstanceState: سسٹم متحرک UI حالت محفوظ کرنے کے لیے onStop سے پہلے onSaveInstanceState(Bundle) کال کرتا ہے۔ ڈیویلپر اس طریقے کو اوور رائڈ کر کے ان پٹ فیلڈ کی اقدار، RecyclerView پوزیشن اور منتخب اشیاء Bundle میں محفوظ کرتا ہے۔ چاہے Activity تباہ نہ ہو (صارف نے صرف چھوٹا کیا اور واپس آیا)، Bundle کنفیگریشن تبدیلیوں پر onCreate کو بھیجا جاتا ہے۔ Google صرف عارضی UI حالت — ریپوزٹری ڈیٹا یا ViewModel نہیں، جو Activity سے باہر رہتے ہیں — محفوظ کرنے کی تجویز کرتا ہے۔

onStop میں کون سے وسائل آزاد کریں

onStop میں، ڈیویلپر کو وہ تمام وسائل آزاد کرنے چاہئیں جو Activity کے نظر نہ آنے پر ضروری نہیں ہوتے۔ اس سے بیٹری، CPU اور میموری کا بوجھ کم ہوتا ہے، اور Activity پر واپسی پر ANR کو بھی روکتا ہے۔

onStop میں کیا آزاد کریں:

  • اینیمیشن اور ٹرانزیشن — ObjectAnimator، ValueAnimator، ViewPropertyAnimator روکیں۔ غیر مرئی Activity پر چلنے والی اینیمیشن GPU سائیکل ضائع کرتی ہیں۔
  • سینسر — SensorManager سے رکنیت ختم کریں (ایکسلیرومیٹر، جائروسکوپ، میگنیٹومیٹر)۔ سینسر Activity چھپی ہونے پر بھی توانائی استعمال کرتے ہیں۔
  • کیمرہ اور مائیکروفون — Camera2 یا CameraX آزاد کریں، MediaRecorder روکیں۔ Activity چھپی ہونے پر کیمرہ فعال چھوڑنا Google Play پالیسی کے ذریعے ممنوع ہے۔
  • LocationListener — FusedLocationProviderClient یا LocationManager سے رکنیت ختم کریں۔ جغرافیائی محل وقوع سب سے زیادہ توانائی استعمال کرنے والا وسیلہ ہے۔
  • نیٹ ورک سننے والے — WebSocket بند کریں، HTTP درخواستیں منسوخ کریں جو پس منظر میں ضروری نہیں ہیں۔
  • MediaPlayer اور ExoPlayer — پلے بیک روکیں یا بند کریں اگر اسے پس منظر میں جاری نہیں رہنا چاہیے۔

onStop میں کیا نہ کریں: طویل مدتی کارروائیاں نہ کریں — ڈیٹابیس میں بڑا ڈیٹا محفوظ کرنا، نیٹ ورک کی درخواستیں، پیچیدہ حسابات۔ onStop مرکزی تھریڈ پر چلتا ہے اور Activity پر واپسی کو روکتا ہے۔ طویل مدتی کارروائیوں کے لیے، تاخیر کے ساتھ WorkManager یا viewModelScope میں کوروٹین استعمال کریں۔ ViewModel وسائل کو آزاد نہ کریں — ViewModel onStop سے بچ جاتا ہے اور واپسی پر استعمال ہوگا۔

onStop اور onPause میں فرق

onPause اور onStop دیدہ کھونے کی ڈگری اور لازمی اقدامات کے دائرہ کار میں مختلف ہیں۔ onPause جزوی فوکس کھونے پر کال کیا جاتا ہے (مثال کے طور پر، ڈائیلاگ ونڈو یا سسٹم مینو کھولنا)، onStop — مکمل دیدہ کھونے پر۔ یہ فرق ہر مرحلے پر وسائل آزاد کرنے کے انتخاب کے لیے اہم ہے۔

خصوصیتonPauseonStop
دیدہ کی سطحجزوی طور پر مرئیمکمل طور پر غیر مرئی
فوکسکھویاکھویا
عملدرآمد کا وقت500 ملی سیکنڈ تک5 سیکنڈ تک (ANR ٹائم آؤٹ)
آزاد کرنے کے وسائلاہم (میڈیا، کیمرہ)تمام غیر مرئی (سینسر، اینیمیشن، مقام)
بحالیonResumeonRestart → onStart → onResume
عمل کی ترجیحاعلیٰ (پیش منظر)درمیانی (پس منظر)

عام اصول: onPause میں، وہ سسٹم وسائل آزاد کریں جو فوری طور پر کسی دوسری ایپلیکیشن کے صارف تجربے کو متاثر کرتے ہیں (کیمرہ، میڈیا پلیئر)؛ onStop میں — وہ تمام دیگر وسائل جو Activity چھپی ہونے پر ضروری نہیں ہیں۔ Google تیز سوئچنگ کے دوران onStop کال نہ ہونے کے امکان کی وجہ سے onPause میں اہم صارف ڈیٹا (ای میل ڈرافٹ، ترتیبات) محفوظ کرنے کی تجویز کرتا ہے۔

onStop → onRestart: اسکرین پر واپسی

جب صارف چھپی ہوئی Activity پر واپس آتا ہے، سسٹم onRestart → onStart → onResume کال کرتا ہے۔ onRestart طریقہ اشارہ کرتا ہے کہ Activity Stopped حالت سے واپس آ رہی ہے۔ یہ UI اور ان وسائل کی بحالی کے لیے ایک اہم مرحلہ ہے جو onStop میں آزاد کیے گئے تھے۔

واپسی پر کال کی ترتیب:

  • onRestart() — Activity کو مطلع کیا جاتا ہے کہ اسے دوبارہ دکھایا جائے گا۔ عام اقدامات: ڈیٹا دوبارہ لوڈ کرنا، فہرستیں اپ ڈیٹ کرنا۔
  • onStart() — Activity مرئی ہو جاتی ہے لیکن ابھی فعال نہیں۔ یہاں onStop میں آزاد کیے گئے وسائل دوبارہ شروع کیے جاتے ہیں۔
  • onResume() — Activity فوکس حاصل کرتی ہے اور تعامل کے لیے تیار ہوتی ہے۔ اینیمیشن شروع ہوتی ہیں، سینسر رجسٹر ہوتے ہیں۔

اگر ایپلیکیشن کا عمل Stopped حالت میں سسٹم کے ذریعے ختم کر دیا گیا تھا، تو onRestart کے بجائے onCreate کال کیا جاتا ہے، اور onSaveInstanceState سے Bundle حالت کی بحالی کے لیے بھیجا جاتا ہے۔ یہ منظرنامہ (عمل کی موت) Android ایپلیکیشنز میں کیڑوں کی سب سے عام وجوہات میں سے ایک ہے: ڈیویلپر onRestart کو نافذ کرتے ہیں لیکن عمل کی موت کے بعد onCreate کے ذریعے بحالی پر غور کرنا بھول جاتے ہیں۔

Kotlin میں onStop کی کوڈ مثالیں

مثال 1: سینسر آزاد کرنے کے ساتھ بنیادی onStop نفاذ

Activity چھپانے پر درست سینسر رکنیت ختم کرنے اور اینیمیشن روکنے کو ظاہر کرتا ہے۔ اسکرین پر واپسی پر، وسائل onStart میں بحال ہوتے ہیں۔

kotlin
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 کے ذریعے واپسی کے بعد، وسائل دوبارہ تخلیق ہوتے ہیں۔

مثال 2: SavedStateHandle کے ذریعے حالت کے تحفظ کے ساتھ onStop

ViewModel + SavedStateHandle استعمال کرنے والا جدید طریقہ۔ فارم کا ڈیٹا دستی Bundle ہینڈلنگ کے بغیر onStop کے دوران خود بخود محفوظ ہو جاتا ہے۔

kotlin
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 کی تجویز کرتا ہے۔

مثال 3: onStop میں کارروائیوں کے لیے lifecycleScope

onStop میں منتقلی کے دوران غیر متزامن ڈیٹا محفوظ کرنے کے لیے کوروٹین کے ساتھ lifecycleScope کا استعمال۔ کوروٹین مرکزی تھریڈ کو روکے بغیر IO ڈسپیچر پر چلتی ہے۔

kotlin
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 اور onDestroy میں کیا فرق ہے؟

onStop — Activity نظر آنا بند کر دیتی ہے لیکن Stopped حالت میں میموری میں رہتی ہے۔ سسٹم onRestart کے ذریعے Activity واپس لا سکتا ہے۔ onDestroy — Activity تباہ ہو جاتی ہے، میموری آزاد ہو جاتی ہے۔ onDestroy کے بعد، واپسی صرف Activity کی نئی مثال (onCreate) بنا کر ممکن ہے۔

کیا super.onStop() کال کرنا لازمی ہے؟

ہاں، لازمی ہے۔ super.onStop() سسٹم کے اجزاء: فریگمنٹس، LoaderManager، ViewModelStore کے درست کام کو یقینی بناتا ہے۔ super.onStop() چھوڑنے سے میموری لیک اور غلط فریگمنٹ بحالی ہو سکتی ہے۔ super.onStop() ہمیشہ آخر میں یا شروع میں کال کریں — ترتیب اہم نہیں، لیکن کال لازمی ہے۔

کیسے تصدیق کریں کہ onStop کال ہوا؟

ہر لائف سائیکل طریقہ میں Log.d یا Timber استعمال کریں۔ اپنے Activity ٹیگ کے ذریعے logcat فلٹر فعال کریں۔ پروڈکشن کے لیے Android Vitals استعمال کریں — Google خود بخود لائف سائیکل میٹرکس جمع کرتا ہے اور Play Console میں بے ضابطگیاں دکھاتا ہے۔ ProcessLifecycleOwner کے ذریعے لائف سائیکل کی نگرانی بھی دستیاب ہے۔

اگر onStop میں استثناء پھینکا جائے تو کیا ہوتا ہے؟

onStop میں نہ پکڑا گیا استثناء ایپلیکیشن کے Force Close کا سبب بنتا ہے۔ سسٹم لائف سائیکل کال بیکس میں استثناء نہیں پکڑتا۔ اگر onStop میں ایسی کارروائیاں کی جاتی ہیں جو استثناء پھینک سکتی ہیں (فائل کارروائیاں، نیٹ ورک)، تو انہیں try-catch میں لپیٹیں اور super.onStop() میں خلل ڈالے بغیر خرابی لاگ کریں۔

کیا onStop میں Bitmap آزاد کرنا چاہیے؟

نہیں، Activity میں Bitmap کو GC جمع کرے گا اگر اس کا کوئی حوالہ نہیں ہے۔ onStop میں جبری آزاد کرنا (recycle()) ضروری نہیں اور نقصان دہ بھی ہو سکتا ہے — اگر Activity onRestart کے ذریعے واپس آتی ہے، تو Bitmap دوبارہ لوڈ کرنا پڑے گا۔ تصویر لوڈ کرنے کے لیے Glide یا Coil استعمال کریں — یہ لائبریریاں خود بخود کیشنگ اور لائف سائیکل کا انتظام کرتی ہیں۔

خلاصہ

  • onStop — Activity لائف سائیکل کا طریقہ جو مکمل دیدہ کھونے پر کال کیا جاتا ہے۔ Activity Stopped حالت میں میموری میں رہتی ہے۔
  • onStop کے بعد، دو منظرنامے ممکن ہیں: onRestart (اسکرین پر واپسی) یا onDestroy (Activity کی تباہی)۔
  • onStop میں، سینسر، اینیمیشن، کیمرہ، مقام سننے والے آزاد کرنے چاہئیں — وہ سب جو Activity کے غیر مرئی ہونے پر ضروری نہیں۔
  • onStop، onPause سے دیدہ کی سطح میں مختلف ہے: onPause — جزوی، onStop — مکمل دیدہ کھونا۔
  • onSaveInstanceState onStop سے پہلے کال کیا جاتا ہے — عارضی UI حالت محفوظ کرنے کے لیے اسے استعمال کریں۔
  • Dispatchers.IO کے ساتھ lifecycleScope کوروٹین — onStop میں غیر متزامن کارروائیوں کا ترجیحی طریقہ۔
  • ہمیشہ super.onStop() کال کریں اور Force Close سے بچنے کے لیے خطرناک کارروائیوں کو try-catch میں لپیٹیں۔

ہم ایک موبائل ایپلیکیشن ٹرنکی تیار کریں گے

IT Sectr 2017 سے اسٹارٹ اپس اور کاروبار کے لیے iOS اور Android ایپلیکیشنز بناتا ہے۔ ہم آپ کو مشورہ دیں گے اور بہترین حل تجویز کریں گے۔

پروجیکٹ پر بحث کریں

مزید پڑھیں