onStart ایک Android لائف سائیکل طریقہ ہے جو اس وقت کال کیا جاتا ہے جب Activity یا Fragment صارف کو نظر آنے لگتا ہے۔ اس لمحے، اسکرین ڈیوائس ڈسپلے پر ظاہر ہوتی ہے، لیکن ابھی تک صارف کے ساتھ تعامل نہیں کر سکتی — ان پٹ فوکس onResume کال ہونے تک غیر حاضر رہتا ہے۔ onStart طریقہ سسٹم سننے والوں کو رجسٹر کرنے، جغرافیائی محل وقوع کی خدمات سے منسلک ہونے اور اینیمیشن شروع کرنے کے لیے مثالی ہے جو اس وقت تک چلنی چاہئیں جب تک جزو اسکرین پر نظر آ رہا ہو۔ مکمل Activity لائف سائیکل کے بارے میں مزید جاننے کے لیے مضمون پڑھیں Activity Lifecycle۔
اہم نکات
onStart Activity لائف سائیکل کا دوسرا طریقہ ہے، جسے سسٹم onCreate کے بعد (یا رکی ہوئی حالت سے واپسی پر onRestart کے بعد) کال کرتا ہے۔ onStart کال کے لمحے، Activity یا Fragment اسکرین پر نظر آتا ہے۔ صارف انٹرفیس دیکھتا ہے، لیکن اسکرین ابھی تعامل کے لیے تیار نہیں ہے — ان پٹ فوکس صرف onResume کے بعد ظاہر ہوگا۔
onStart طریقہ Activity کے «مرئی زندگی» (visible lifetime) میں آتا ہے — onStart اور onStop کے درمیان کا وقفہ۔ اس مدت کے دوران، Activity دوسری ونڈوز (مثلاً شفاف Activity یا ڈائیلاگ ونڈو) سے جزوی طور پر ڈھکی ہو سکتی ہے، لیکن اس کا UI نظر آتا رہتا ہے۔ یہ مرئی زندگی کو «پیش منظر زندگی» (onResume — onPause) سے ممتاز کرتا ہے، جب Activity کے پاس مکمل ان پٹ فوکس ہوتا ہے۔
اس تین سطحی درجہ بندی کو سمجھنا کوڈ کی صحیح تقسیم کے لیے اہم ہے۔ onCreate — ایک بار کی ابتدائیہ، onStart — مرئی وسائل کو منسلک کرنا، onResume — خصوصی وسائل تک خصوصی رسائی۔ ڈویلپر جو ان سطحوں کو الجھاتا ہے، اسکرینوں کے درمیان سوئچ کرتے وقت میموری رساو یا ایپلیکیشن کے غلط رویے کا خطرہ مول لیتا ہے۔
Activity میں، onStart طریقہ ہر بار کال کیا جاتا ہے جب اسکرین ڈسپلے پر ظاہر ہوتی ہے — پہلی بار لانچ پر (onCreate کے بعد) اور پس منظر سے واپسی پر (onRestart کے بعد) دونوں۔ onCreate کے برعکس، onStart کو Activity مثال کی زندگی میں کئی بار کال کیا جا سکتا ہے، اس لیے وہ کوڈ جو اسکرین ظاہر ہونے پر ہر بار چلنا چاہیے یہاں رکھا جاتا ہے۔
class DashboardActivity : AppCompatActivity() {
private val connectivityReceiver = object : BroadcastReceiver() {
override fun onReceive(context: Context?, intent: Intent?) {
val isConnected = ... // ConnectivityManager چیک
binding?.statusIndicator?.setColor(
if (isConnected) Color.GREEN else Color.RED
)
}
}
override fun onStart() {
super.onStart()
registerReceiver(
connectivityReceiver,
IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION)
)
SensorManager.getInstance().registerStepCounter()
}
override fun onStop() {
unregisterReceiver(connectivityReceiver)
SensorManager.getInstance().unregisterStepCounter()
super.onStop()
}
}
اہم قاعدہ: onStart میں منسلک تمام وسائل onStop میں جاری کیے جانے چاہئیں۔ یہ یقینی بناتا ہے کہ جب Activity اسکرین سے چھپی ہو، تو وہ بیٹری استعمال نہ کرے، سسٹم ایونٹس نہ سنے، اور میموری نہ گھیرے۔ Android Studio میں lint قواعد ہیں جو متعلقہ ان رجسٹریشن کے بغیر BroadcastReceiver رجسٹر کرنے پر متنبہ کرتے ہیں۔
Fragment میں onStart کنٹینر Activity کے لائف سائیکل سے قریبی تعلق رکھتا ہے۔ Fragment کو onStart کال اس وقت ملتی ہے جب اس پر مشتمل Activity کو onStart مل چکا ہوتا ہے۔ تاہم، اگر Fragment کو تاخیری موڈ میں شامل کیا گیا ہے (addToBackStack کے بغیر FragmentTransaction.commit())، تو onStart تاخیر سے کال ہو سکتا ہے۔
class MapFragment : Fragment() {
private var mapView: MapView? = null
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View {
mapView = MapView(requireContext())
return mapView!!
}
override fun onStart() {
super.onStart()
mapView?.onStart()
LocationService.connect(requireContext())
}
override fun onStop() {
mapView?.onStop()
LocationService.disconnect()
super.onStop()
}
}
Fragment.onStart کی خصوصیت: اگر Fragment offscreenPageLimit = 1 والے ViewPager میں ہے، تو پڑوسی فریگمنٹس بھی نظر آنے سے پہلے onStart حاصل کریں گے۔ یہ قبل از وقت سننے والے رجسٹریشن کا سبب بن سکتا ہے۔ ایسے معاملات میں، setUserVisibleHint() طریقہ استعمال کریں یا صرف حقیقت میں نظر آنے والے فریگمنٹس کے لیے سننے والے رجسٹر کرنے کے لیے onStart کے اندر isVisible چیک کریں۔
onStart اور onResume کے درمیان بنیادی فرق اسکرین سرگرمی کی سطح ہے۔ onStart اشارہ کرتا ہے کہ Activity اسکرین پر نظر آ رہی ہے لیکن ضروری نہیں کہ پیش منظر میں ہو۔ onResume اشارہ کرتا ہے کہ Activity پیش منظر میں ہے اور اس کے پاس ان پٹ فوکس ہے۔ فرق ڈائیلاگ ونڈو کی مثال سے ظاہر ہوتا ہے: جب Activity کے اوپر Dialog ظاہر ہوتا ہے، Activity onResume کھو دیتی ہے (onPause کال ہوتا ہے) لیکن نظر آتی رہتی ہے — onStart/onStop کال نہیں ہوتے۔
موازنہ جدول واضح طور پر دکھاتا ہے کہ کن منظرناموں میں ہر طریقہ کال کیا جاتا ہے:
| منظرنامہ | onStart | onResume |
|---|---|---|
| ایپلیکیشن لانچ | کال ہوتا ہے | کال ہوتا ہے |
| Activity کے اوپر Dialog کھلا | کال نہیں ہوتا | onPause (فوکس کھوتا ہے) |
| ہوم بٹن دبایا | onStop (چھپا) | onPause → onStop |
| حالیہ سے واپسی | onStart (مرئی) | onResume (فوکس) |
| اسکرین گھمائی | onCreate → onStart | → onResume |
| آنے والی کال | onStop (چھپا) | onPause → onStop |
یہ جدول ڈویلپر کو یہ فیصلہ کرنے میں مدد دیتی ہے کہ مخصوص کوڈ کس طریقہ میں رکھنا ہے۔ مثال کے طور پر، اگر ایپلیکیشن کو کسی بھی اسکرین اوورلیپ (ڈائیلاگ سمیت) پر ویڈیو پلے بیک روکنا چاہیے، تو کوڈ onPause میں رکھا جاتا ہے۔ اگر ویڈیو صرف اسکرین مکمل چھپنے پر رکنا چاہیے — کوڈ onStop میں رکھا جاتا ہے۔
onStart ان سننے والوں کو رجسٹر کرنے کے لیے بہترین جگہ ہے جنہیں صرف اس وقت کام کرنا چاہیے جب Activity اسکرین پر نظر آ رہی ہو۔ یہ سسٹم کے تین اہم اجزاء سے متعلق ہے: سسٹم ایونٹس کے لیے BroadcastReceiver، جغرافیائی محل وقوع کے لیے LocationListener، اور ڈیوائس سینسرز کے لیے SensorListener۔
BroadcastReceiver کو onStart میں Context.registerReceiver() کے ذریعے متحرک طور پر رجسٹر کیا جاتا ہے اور onStop میں unregisterReceiver() کے ذریعے ہٹایا جاتا ہے۔ متحرک رجسٹریشن جامد رجسٹریشن (مینی فیسٹ میں) سے بہتر ہے کیونکہ یہ وصول کنندہ کی زندگی کو Activity کی مرئیت کی مدت تک محدود کرتی ہے — جب Activity چھپی ہوتی ہے تو ایپلیکیشن سسٹم براڈکاسٹ پیغامات سے نہیں جاگتی۔
private val batteryReceiver = object : BroadcastReceiver() {
override fun onReceive(context: Context?, intent: Intent) {
val level = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, -1)
binding?.batteryText?.text = "$level%"
}
}
override fun onStart() {
super.onStart()
registerReceiver(batteryReceiver, IntentFilter(Intent.ACTION_BATTERY_CHANGED))
}
override fun onStop() {
unregisterReceiver(batteryReceiver)
super.onStop()
}
جغرافیائی محل وقوع اور سینسرز وسائل پر بھاری عمل ہیں۔ onStart میں GPS اپ ڈیٹس کی درخواست کرنا اور onStop میں منسوخ کرنا یقینی بناتا ہے کہ اسکرین چھپی ہونے پر ایپلیکیشن بیٹری ختم نہ کرے۔ باریک ترتیبات کے لیے، کم از کم وقفہ اور فاصلہ کے ساتھ requestLocationUpdates استعمال کریں — مثال کے طور پر، 10 سیکنڈ اور 10 میٹر، جو درستگی اور توانائی کی کھپت کے درمیان بہترین توازن فراہم کرتا ہے۔
onCreate کی بجائے onStart میں اینیمیشن شروع کرنا یقینی بناتا ہے کہ اینیمیشن ہر بار اسکرین ظاہر ہونے پر شروع ہو۔ اگر آپ onCreate میں اینیمیشن شروع کرتے ہیں، تو یہ صرف پہلی Activity تخلیق پر کام کرے گی، پس منظر سے واپسی پر نہیں۔ onStart ہر بار کال ہوتا ہے جب Activity نظر آتی ہے، جو اسے چکری اینیمیشنز اور منتقلیاں شروع کرنے کے لیے مثالی جگہ بناتا ہے۔
private lateinit var pulseAnimator: ValueAnimator
override fun onStart() {
super.onStart()
pulseAnimator.start()
binding?.loadingIndicator?.animate()?.alpha(1f)?.start()
}
override fun onStop() {
pulseAnimator.cancel()
binding?.loadingIndicator?.animate()?.cancel()
super.onStop()
}
ObjectAnimator یا ValueAnimator استعمال کرنے والی اینیمیشنز کے لیے، onStop میں cancel() کال کرنا اہم ہے۔ اگر Activity چھپنے کے بعد اینیمیشن چلتی رہتی ہے، تو یہ بیکار میں GPU اور CPU وسائل استعمال کرتی ہے، جس سے آلہ کی کارکردگی بگڑتی ہے اور بیٹری ختم ہونے میں تیزی آتی ہے۔ Android Studio Profiler (GPU گراف) آپ کو فعال اینیمیشنز ٹریک کرنے اور رساو کا پتہ لگانے کی اجازت دیتا ہے۔
onStart/onStop جوڑی کا قاعدہ پیش نظارہ کے لیے کیمرہ (CameraX) کے ساتھ کام کرنے پر بھی لاگو ہوتا ہے۔ onStart میں کیمرہ کھولنا اور onStop میں بند کرنا یقینی بناتا ہے کہ جب آپ کی ایپلیکیشن اسکرین پر نظر نہیں آ رہی تو کیمرہ دوسری ایپلیکیشنز کے لیے مسدود نہ ہو۔ اس قاعدے کی خلاف ورزی Google Play پر منفی جائزوں کی ایک عام وجہ ہے۔
اکثر پوچھے گئے سوالات
onStart — ان سننے والوں کے لیے جنہیں اسکرین نظر آنے تک کام کرنا چاہیے (BroadcastReceiver، LocationListener، SensorListener)۔ onResume — ان وسائل کے لیے جنہیں خصوصی رسائی درکار ہے (کیمرہ، ویڈیو کیپچر، تقریر کی شناخت)۔ سسٹم ایونٹ سننے والوں کو خصوصی رسائی کی ضرورت نہیں ہے اور وہ جزوی اوورلیپ کے ساتھ کام کر سکتے ہیں — انہیں onStart میں رجسٹر کیا جاتا ہے۔ کیمرہ صرف مکمل فوکس کے ساتھ فعال ہونا چاہیے — اسے onResume میں کھولا جاتا ہے۔
onStart ہمیشہ کال ہوتا ہے اگر Activity مرئی حالت میں آتی ہے۔ onStart کے بغیر واحد منظرنامہ — Activity بنائی جاتی ہے اور فوراً ختم ہو جاتی ہے (مثلاً، onCreate میں خرابی کی وجہ سے)۔ اس صورت میں، onCreate کے فوراً بعد onDestroy کال ہوتا ہے۔ لیکن یہ ایک ہنگامی منظرنامہ ہے جو صحیح طریقے سے لکھے گئے کوڈ میں نہیں ہونا چاہیے۔
ہاں، onStart کو onResume نہیں مل سکتا اگر کوئی دوسرا Activity یا شفاف ونڈو فوراً Activity کے اوپر کھل جائے۔ مثال کے طور پر، اگر onCreate کے بعد ایک اجازت نامہ اسکرین لانچ کی جاتی ہے (Activity A → Activity B)، تو Activity A میں onStart کال ہوتا ہے، لیکن onResume نہیں — اسکرین B سے ھٹپ جانے پر اسے فوراً onPause → onStop ملتا ہے۔
onStart کو Activity مثال کی زندگی میں کئی بار کال کیا جا سکتا ہے۔ ہر بار جب Activity چھپی حالت (onStop) سے مرئی حالت میں آتی ہے، onStart کال ہوتا ہے۔ عملی طور پر، فعال ایپلیکیشن استعمال کے ساتھ، onStart فی سیشن درجنوں یا سینکڑوں بار کال ہو سکتا ہے۔
onStart میں ڈیٹا لوڈ کرنا مناسب ہے اگر ڈیٹا کو اسکرین ظاہر ہونے پر ہر بار اپ ڈیٹ کیا جانا چاہیے۔ مثال کے طور پر، خبروں کی فیڈ یا اطلاعوں کی فہرست۔ تاہم، لوڈنگ غیر متزامن ہونی چاہیے — lifecycleScope کے ساتھ کوروٹین کے ذریعے، UI تھریڈ کو بلاک کرنے سے بچنے کے لیے۔ ان ڈیٹا کے لیے جو اسکرین ظاہر ہونے کے درمیان تبدیل نہیں ہوتے، onCreate میں ایک بار لوڈ کرنا کافی ہے۔
خلاصہ
ہم ایک موبائل ایپلیکیشن ٹرنکی تیار کریں گے
IT Sectr 2017 سے اسٹارٹ اپس اور کاروبار کے لیے iOS اور Android ایپلیکیشنز بناتا ہے۔ ہم آپ کو مشورہ دیں گے اور بہترین حل تجویز کریں گے۔
مزید پڑھیں