onRestart — Android میں Activity کے زندگی کے چکر کا ایک طریقہ، جسے سسٹم کے ذریعے Activity کے Stopped حالت سے Started حالت میں واپس آنے سے پہلے بلایا جاتا ہے۔ onRestart اشارہ کرتا ہے کہ ایک Activity، جو پہلے کسی دوسری اسکرین سے چھپائی گئی تھی یا پس منظر میں چھوٹی کر دی گئی تھی، صارف کے لیے دوبارہ نظر آنے لگی ہے۔ onRestart میں، ڈویلپر پرانے ڈیٹا کو اپ ڈیٹ کرتا ہے، فہرستوں کو دوبارہ لوڈ کرتا ہے اور UI کی حالت کو بحال کرتا ہے جو Activity کے پوشیدہ رہنے کے دوران بدل سکتی تھی۔ Google Android Vitals (2025) کے مطابق، onRestart کو ڈیٹا اپ ڈیٹ کرنے کے لیے استعمال کرنے والی ایپس اسکرین پر واپس آنے پر 25% کم غلط معلومات کی نمائش کرتی ہیں۔ Android Developers دستاویزات onRestart کو Activity کے اسکرین پر دوبارہ ظاہر ہونے سے پہلے ایک تیاری کے مرحلے کے طور پر بیان کرتی ہیں۔
اہم نکات
onRestart — ایک کال بیک طریقہ ہے جسے Android onStart سے بالکل پہلے بلاتا ہے جب کوئی Activity پوشیدہ Stopped حالت سے واپس نظر آنے والی حالت میں آتی ہے۔ یہ طریقہ اس لحاظ سے منفرد ہے کہ یہ صرف اس وقت بلایا جاتا ہے جب Activity دوبارہ دکھائی جاتی ہے — مثال کے پہلے تخلیق کے دوران، ترتیب onCreate سے شروع ہوتی ہے، onRestart کو چھوڑتے ہوئے۔ مکمل چکر: onCreate → onStart → onResume (پہلا آغاز) یا onRestart → onStart → onResume (بعد میں نمائش)۔
Android سسٹم کے نقطہ نظر سے، onRestart ایک اصلاح ہے جو Activity کو اس کی واپسی کے لیے تیار ہونے دیتی ہے: ذخیرہ سے ڈیٹا اپ ڈیٹ کرنا، UI حالت کو ہم آہنگ کرنا، نیٹ ورک کنیکٹیویٹی چیک کرنا۔ onResume کے برعکس، جو ہر بار Activity کے فوکس حاصل کرنے پر بلایا جاتا ہے (ڈائیلاگ یا سسٹم مینو سے واپسی بھی شامل ہے)، onRestart صرف مکمل چھپانے اور واپسی کے چکر کے دوران متحرک ہوتا ہے۔ یہ onRestart کو «بھاری» اپ ڈیٹ آپریشنز کے لیے مثالی جگہ بناتا ہے جو جزوی فوکس کے نقصان کے دوران ضروری نہیں ہوتے۔
Android Activity زندگی کے چکر کی تفصیلات کے مطابق، onStop اور onRestart کے درمیان وقت کا فرق چند سیکنڈ (صارف نے جلدی سوئچ کیا) سے لے کر کئی گھنٹے (ایپ پس منظر میں تھی اور صارف واپس آیا) تک ہو سکتا ہے۔ اس دوران، دور دراز ماخذ (API، DB) میں ڈیٹا بدل سکتا تھا، لہذا onRestart تازگی کی جانچ کے لیے ایک فطری نقطہ ہے۔
onRestart صرف اس وقت بلایا جاتا ہے جب Activity Stopped حالت سے واپس آتی ہے، جس میں Activity onStop بلائے جانے کے بعد داخل ہوئی تھی۔ ذیل میں وہ تمام منظرنامے ہیں جو onRestart کی طرف لے جاتے ہیں۔
onRestart طلبی کے منظرنامے:
onRestart کب نہیں بلایا جاتا: اسکرین گھومنے کے دوران (Activity تباہ ہو جاتی ہے اور onCreate کے ذریعے دوبارہ بنائی جاتی ہے)، ڈائیلاگ باکس سے واپسی پر (Activity onStop میں نہیں جاتی، صرف onPause → onResume)، عمل کے خاتمے کے دوران (Activity دوبارہ بنائی جاتی ہے)۔
onRestart اور onCreate Activity کو بحال کرنے کے دو مختلف طریقے ہیں۔ ان کے درمیان انتخاب کا انحصار اس بات پر ہے کہ Activity مکمل طور پر تباہ ہوئی تھی یا صرف چھپائی گئی تھی۔
| خصوصیت | onRestart | onCreate |
|---|---|---|
| کب بلایا جاتا ہے | Activity Stopped سے واپس آتی ہے | Activity پہلی بار بنائی جاتی ہے یا تباہ ہونے کے بعد |
| حالت محفوظ | ہاں — ViewModel اور فیلڈز زندہ ہیں | نہیں — سب کچھ نیا بنایا جاتا ہے |
| Bundle | منتقل نہیں کیا جاتا | منتقل کیا جاتا ہے (savedInstanceState) |
| عام اقدامات | ڈیٹا اپ ڈیٹ، UI تازہ کاری | View ابتداء، LiveData سبسکرپشن |
| طلبی کی تعدد | ہر بار واپسی پر | ایک بار یا تباہی کے بعد |
انتخاب کا اصول: View ابتداء اور LiveData/StateFlow سبسکرپشن onCreate میں کریں (Fragment کے لیے onViewCreated میں)۔ ڈیٹا اپ ڈیٹ، فہرست دوبارہ لوڈ کرنا اور حالت کی جانچ — onRestart میں۔ اگر ڈیٹا ViewModel کے ذریعے لوڈ کیا جاتا ہے، تو onRestart صرف ViewModel پر refresh() طریقہ کو کال کر سکتا ہے، اور View ایک رد عمل والے سٹریم کے ذریعے اپ ڈیٹ کردہ ڈیٹا کو سبسکرائب کرے گی۔
Google تجویز کرتا ہے: onRestart میں onCreate کی منطق کو نقل نہ کریں۔ ViewModel میں refresh() طریقے نکالیں جو موجودہ ڈیٹا لوڈ کرتے ہیں، اور انہیں onRestart میں کال کریں۔ یہ صاف MVVM آرکیٹیکچر کو محفوظ رکھتا ہے اور کوڈ کے نقل کو ختم کرتا ہے۔
onRestart ان کاموں کے لیے مثالی جگہ ہے جو ہر بار اسکرین پر واپس آنے پر انجام دئیے جانے چاہئیں، لیکن پہلی بار کھولنے پر ضروری نہیں ہوتے۔ یہاں عام منظرنامے ہیں:
viewModel.refreshItems() کال کریں۔onRestart میں کیا نہ کریں: Views کو دوبارہ شروع نہ کریں — وہ زندہ ہیں کیونکہ Activity تباہ نہیں ہوئی تھی۔ LiveData کو دوبارہ سبسکرائب نہ کریں — onCreate میں سبسکرپشن اب بھی زندہ ہے۔ نئے Fragments نہ بنائیں — وہ پہلے سے FragmentManager میں ہیں۔
سب سے اہم استثنا: onRestart نہیں بلایا جاتا اگر ایپ کا عمل سسٹم کے ذریعے ختم کر دیا گیا ہو۔ یہ ایک اہم نکتہ ہے جسے ڈویلپرز اکثر حالت کی بحالی کے لیے onRestart پر انحصار کرتے ہوئے نظر انداز کر دیتے ہیں۔
عمل کے خاتمے کے دوران:
اس سے کیسے بچیں: ہمیشہ اہم حالت کو onSaveInstanceState(Bundle) میں محفوظ کریں (onStop سے پہلے بلایا جاتا ہے) یا ViewModel میں SavedStateHandle استعمال کریں۔ onCreate میں، savedInstanceState چیک کریں: اگر یہ null نہیں ہے، تو Bundle سے حالت بحال کریں؛ اگر null ہے، تو تازہ ڈیٹا لوڈ کریں۔
Google Android Vitals کے مطابق، پس منظر میں طویل وقت کے بعد Activity میں تقریباً 7% واپسیاں عمل کے خاتمے کے بعد ہوتی ہیں۔ اس کا مطلب ہے کہ ہر 15ویں Activity جسے onRestart بلانا چاہیے تھا، درحقیقت onCreate سے گزرتی ہے۔ اس منظر نامے کو نظر انداز کرنا «واپسی کے بعد خالی اسکرین» کی خرابیوں کی ایک اہم وجہ ہے۔
Activity ترمیم کی اسکرین سے واپس آنے کے بعد کاموں کی فہرست کو اپ ڈیٹ کرنے کے لیے onRestart میں viewModel.refreshTasks() کو کال کرتی ہے۔
class TaskListActivity : AppCompatActivity() {
private val viewModel: TaskViewModel by viewModels()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_task_list)
viewModel.tasks.observe(this) { tasks ->
Log.d("TaskList", "${tasks.size} کام موصول ہوئے")
}
}
override fun onRestart() {
super.onRestart()
Log.d("TaskList", "onRestart: کاموں کی فہرست اپ ڈیٹ ہو رہی ہے")
viewModel.refreshTasks()
}
}
class TaskViewModel : ViewModel() {
private val _tasks = MutableLiveData<List<Task>>()
val tasks: LiveData<List<Task>> get() = _tasks
fun refreshTasks() {
viewModelScope.launch {
_tasks.value = TaskRepository().getAllTasks()
}
}
}
ViewModel.refreshTasks() ذخیرہ سے موجودہ ڈیٹا لوڈ کرتا ہے۔ LiveData خود بخود Activity کو ڈیٹا کی تبدیلیوں سے آگاہ کرتا ہے — UI بغیر اضافی کوڈ کے اپ ڈیٹ ہو جاتا ہے۔ onRestart نیا سبسکرپشن نہیں بناتا — یہ پہلے ہی onCreate میں ترتیب دیا جا چکا تھا۔
Activity واپسی پر ٹوکن کی درستگی چیک کرتی ہے اور اگر ضروری ہو تو لاگ ان پر ری ڈائریکٹ کرتی ہے۔
class ProfileActivity : AppCompatActivity() {
private val authManager = AuthManager()
private val launcher = registerForActivityResult(
ActivityResultContracts.StartActivityForResult()
) { Log.d("Profile", "لاگ ان اسکرین سے واپس آیا") }
override fun onRestart() {
super.onRestart()
if (!authManager.isTokenValid()) {
Log.d("Profile", "ٹوکن میعاد ختم — لاگ ان پر ری ڈائریکٹ")
launcher.launch(Intent(this, LoginActivity::class.java))
}
}
}
class AuthManager {
fun isTokenValid(): Boolean {
val expiry = SharedPreferencesManager().getTokenExpiry()
return System.currentTimeMillis() < expiry
}
}
اگر صارف نے ایپ کو طویل عرصے تک چھوٹا کیا اور ٹوکن کی میعاد ختم ہونے کے بعد واپس آیا، تو onRestart انہیں لاگ ان اسکرین پر ری ڈائریکٹ کرے گا۔ یہ میعاد ختم شدہ ٹوکن کے ساتھ درخواست کرنے کی کوشش کرتے وقت API کی غلطیوں کو روکتا ہے۔ نوٹ: چیک onRestart میں ہے، onResume میں نہیں، ڈائیلاگ سے واپسی پر غیر ضروری چیک سے بچنے کے لیے۔
Fragment ڈیٹا اپ ڈیٹ کرنے کے لیے LifecycleObserver کے ذریعے onRestart استعمال کرتا ہے۔
class FeedFragment : Fragment() {
private val viewModel: FeedViewModel by viewModels()
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
viewLifecycleOwner.lifecycle.addObserver(object : LifecycleObserver {
@OnLifecycleEvent(Lifecycle.Event.ON_RESTART)
fun onRestart() {
Log.d("FeedFragment", "LifecycleObserver کے ذریعے onRestart")
viewModel.refreshFeed()
}
})
}
}
Fragment میں onRestart کو اوور رائڈ کرنے کے بجائے، LifecycleObserver استعمال کیا جاتا ہے — ایک زیادہ لچکدار طریقہ جو وراثت کے بغیر زندگی کے چکر کے واقعات کی منطق شامل کرنے کی اجازت دیتا ہے۔ ViewLifecycleOwner اس بات کو یقینی بناتا ہے کہ observer View کے دائرہ کار میں رہے (یہ onDestroyView سے آگے زندہ نہیں رہتا)۔
اکثر پوچھے گئے سوالات
onResume ہر بار بلایا جاتا ہے جب Activity فوکس حاصل کرتی ہے — ڈائیلاگ یا سسٹم مینو سے واپسی بھی شامل ہے (Activity onStop میں نہیں گئی تھی)۔ onRestart صرف Stopped حالت سے واپسی پر بلایا جاتا ہے، جب Activity مکمل طور پر چھپی ہوئی تھی۔ onRestart «بھاری» اپ ڈیٹس کے لیے ایک تنگ تر واقعہ ہے، جبکہ onResume ہلکی کارروائیوں (عنوان تبدیل کرنا، وقت اپ ڈیٹ کرنا) کے لیے ہے۔
نہیں، نہیں ہو سکتا۔ onRestart onStop کے ساتھ جوڑا ہوا طریقہ ہے: onRestart صرف اس وقت بلایا جاتا ہے جب Activity onStop سے گزری ہو۔ اگر Activity onStop میں نہیں گئی (مثلاً، ایک ڈائیلاگ باکس کھولا گیا تھا)، تو واپسی پر onRestart نہیں بلایا جاتا — صرف onResume۔
ایمولیٹر میں Home (گھر کا بٹن) دبائیں — Activity چھوٹی ہو جائے گی اور onStop حاصل کرے گی۔ پھر حالیہ ایپس یا لانچر کے ذریعے ایپ کھولیں — Activity onRestart → onStart → onResume حاصل کرے گی۔ ڈیبگنگ کے لیے، onRestart میں بریک پوائنٹس کے ساتھ Debug یا Activity ٹیگ کے ساتھ Log.d استعمال کریں۔
onRestart میں پکڑا نہ گیا استثنا Force Close کا سبب بنے گا۔ سسٹم زندگی کے چکر کے کال بیکس میں استثناؤں کو نہیں پکڑتا۔ اگر onRestart میں ایسی کارروائیاں کی جاتی ہیں جو استثنا پھینک سکتی ہیں (try-catch کے بغیر نیٹ ورک کی درخواست، null View کے ساتھ کام)، تو انہیں try-catch میں لپیٹیں۔
نہیں۔ onRestart صرف زندہ Activities کے لیے بلایا جاتا ہے جو Stopped حالت سے واپس آ رہی ہیں۔ onRestart میں isFinishing() ہمیشہ false ہوگا۔ isFinishing() چیک کرنا onPause (ڈیٹا محفوظ کرنا) اور onDestroy (دوبارہ تخلیق کو finish() سے ممتاز کرنا) میں معنی رکھتا ہے۔
خلاصہ
ہم ایک موبائل ایپلیکیشن ٹرنکی تیار کریں گے
IT Sectr 2017 سے اسٹارٹ اپس اور کاروبار کے لیے iOS اور Android ایپلیکیشنز بناتا ہے۔ ہم آپ کو مشورہ دیں گے اور بہترین حل تجویز کریں گے۔
مزید پڑھیں