onRestart — زندگی کے چکر میں Activity کی بحالی

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

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

اہم نکات

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

onRestart — Android زندگی کے چکر میں طریقہ کار کا جوہر

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 کب بلایا جاتا ہے: شرائط اور ترتیب

onRestart صرف اس وقت بلایا جاتا ہے جب Activity Stopped حالت سے واپس آتی ہے، جس میں Activity onStop بلائے جانے کے بعد داخل ہوئی تھی۔ ذیل میں وہ تمام منظرنامے ہیں جو onRestart کی طرف لے جاتے ہیں۔

onRestart طلبی کے منظرنامے:

  • کسی دوسری Activity سے واپسی — صارف نے ایک نئی Activity کھولی (مثال کے طور پر، اطلاع پر ٹیپ کیا) اور پھر واپس گیا («واپس» دبایا)۔ اسٹیک: MainActivity.onPause → MainActivity.onStop → SecondActivity بنائی جاتی ہے → صارف «واپس» دباتا ہے → SecondActivity.onPause → SecondActivity.onStop → SecondActivity.onDestroy → MainActivity.onRestart → MainActivity.onStart → MainActivity.onResume۔
  • چھوٹا کرنے سے واپسی — صارف نے ایپ کو چھوٹا کیا (ہوم) اور کچھ دیر بعد واپس آیا۔ CurrentActivity.onPause → CurrentActivity.onStop → (ایپ پس منظر میں) → صارف واپس آتا ہے → CurrentActivity.onRestart → CurrentActivity.onStart → CurrentActivity.onResume۔
  • لاک اسکرین سے واپسی — لاک اسکرین Activity کو ڈھانپتی ہے؛ انلاک کرنے کے بعد، Activity onRestart حاصل کرتی ہے اگر کافی وقت گزر چکا ہو (5 سیکنڈ سے زیادہ)۔
  • Intent کے ذریعے لانچ کردہ ایپ سے واپسی — کیمرہ، گیلری، براؤزر — کوئی بھی تیسری پارٹی ایپ startActivityForResult() یا ActivityResultLauncher کے ذریعے لانچ کی گئی۔

onRestart کب نہیں بلایا جاتا: اسکرین گھومنے کے دوران (Activity تباہ ہو جاتی ہے اور onCreate کے ذریعے دوبارہ بنائی جاتی ہے)، ڈائیلاگ باکس سے واپسی پر (Activity onStop میں نہیں جاتی، صرف onPause → onResume)، عمل کے خاتمے کے دوران (Activity دوبارہ بنائی جاتی ہے)۔

onRestart بمقابلہ onCreate: کون سا انتخاب کریں

onRestart اور onCreate Activity کو بحال کرنے کے دو مختلف طریقے ہیں۔ ان کے درمیان انتخاب کا انحصار اس بات پر ہے کہ Activity مکمل طور پر تباہ ہوئی تھی یا صرف چھپائی گئی تھی۔

خصوصیتonRestartonCreate
کب بلایا جاتا ہے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 کے استعمال کے منظرنامے: ڈیٹا اور UI اپ ڈیٹ

onRestart ان کاموں کے لیے مثالی جگہ ہے جو ہر بار اسکرین پر واپس آنے پر انجام دئیے جانے چاہئیں، لیکن پہلی بار کھولنے پر ضروری نہیں ہوتے۔ یہاں عام منظرنامے ہیں:

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

onRestart میں کیا نہ کریں: Views کو دوبارہ شروع نہ کریں — وہ زندہ ہیں کیونکہ Activity تباہ نہیں ہوئی تھی۔ LiveData کو دوبارہ سبسکرائب نہ کریں — onCreate میں سبسکرپشن اب بھی زندہ ہے۔ نئے Fragments نہ بنائیں — وہ پہلے سے FragmentManager میں ہیں۔

onRestart اور عمل کا خاتمہ: ایک اہم استثنا

سب سے اہم استثنا: onRestart نہیں بلایا جاتا اگر ایپ کا عمل سسٹم کے ذریعے ختم کر دیا گیا ہو۔ یہ ایک اہم نکتہ ہے جسے ڈویلپرز اکثر حالت کی بحالی کے لیے onRestart پر انحصار کرتے ہوئے نظر انداز کر دیتے ہیں۔

عمل کے خاتمے کے دوران:

  • ایپ پس منظر میں تھی، Android نے میموری خالی کرنے کے لیے عمل کو ختم کر دیا۔
  • صارف واپس آتا ہے — سسٹم ایک نیا عمل شروع کرتا ہے۔
  • Activity دوبارہ بنائی جاتی ہے: onCreate(Bundle) → onStart → onResume۔
  • onRestart نہیں بلایا جاتا — سسٹم کے لیے، یہ ایک نیا Activity نمونہ ہے۔

اس سے کیسے بچیں: ہمیشہ اہم حالت کو onSaveInstanceState(Bundle) میں محفوظ کریں (onStop سے پہلے بلایا جاتا ہے) یا ViewModel میں SavedStateHandle استعمال کریں۔ onCreate میں، savedInstanceState چیک کریں: اگر یہ null نہیں ہے، تو Bundle سے حالت بحال کریں؛ اگر null ہے، تو تازہ ڈیٹا لوڈ کریں۔

Google Android Vitals کے مطابق، پس منظر میں طویل وقت کے بعد Activity میں تقریباً 7% واپسیاں عمل کے خاتمے کے بعد ہوتی ہیں۔ اس کا مطلب ہے کہ ہر 15ویں Activity جسے onRestart بلانا چاہیے تھا، درحقیقت onCreate سے گزرتی ہے۔ اس منظر نامے کو نظر انداز کرنا «واپسی کے بعد خالی اسکرین» کی خرابیوں کی ایک اہم وجہ ہے۔

Kotlin میں onRestart کے ساتھ کوڈ کی مثالیں

مثال 1: ViewModel کے ذریعے فہرست اپ ڈیٹ کے ساتھ onRestart

Activity ترمیم کی اسکرین سے واپس آنے کے بعد کاموں کی فہرست کو اپ ڈیٹ کرنے کے لیے onRestart میں viewModel.refreshTasks() کو کال کرتی ہے۔

kotlin
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 میں ترتیب دیا جا چکا تھا۔

مثال 2: اختیار کی جانچ کے ساتھ onRestart

Activity واپسی پر ٹوکن کی درستگی چیک کرتی ہے اور اگر ضروری ہو تو لاگ ان پر ری ڈائریکٹ کرتی ہے۔

kotlin
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 میں نہیں، ڈائیلاگ سے واپسی پر غیر ضروری چیک سے بچنے کے لیے۔

مثال 3: ViewLifecycleOwner کے ساتھ Fragment میں onRestart

Fragment ڈیٹا اپ ڈیٹ کرنے کے لیے LifecycleObserver کے ذریعے onRestart استعمال کرتا ہے۔

kotlin
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 سے آگے زندہ نہیں رہتا)۔

اکثر پوچھے گئے سوالات

onRestart onResume سے کیسے مختلف ہے؟

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

کیا onRestart onStop کے بغیر بلایا جا سکتا ہے؟

نہیں، نہیں ہو سکتا۔ onRestart onStop کے ساتھ جوڑا ہوا طریقہ ہے: onRestart صرف اس وقت بلایا جاتا ہے جب Activity onStop سے گزری ہو۔ اگر Activity onStop میں نہیں گئی (مثلاً، ایک ڈائیلاگ باکس کھولا گیا تھا)، تو واپسی پر onRestart نہیں بلایا جاتا — صرف onResume۔

ایمولیٹر میں onRestart کیسے نقل کیا جائے؟

ایمولیٹر میں Home (گھر کا بٹن) دبائیں — Activity چھوٹی ہو جائے گی اور onStop حاصل کرے گی۔ پھر حالیہ ایپس یا لانچر کے ذریعے ایپ کھولیں — Activity onRestart → onStart → onResume حاصل کرے گی۔ ڈیبگنگ کے لیے، onRestart میں بریک پوائنٹس کے ساتھ Debug یا Activity ٹیگ کے ساتھ Log.d استعمال کریں۔

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

onRestart میں پکڑا نہ گیا استثنا Force Close کا سبب بنے گا۔ سسٹم زندگی کے چکر کے کال بیکس میں استثناؤں کو نہیں پکڑتا۔ اگر onRestart میں ایسی کارروائیاں کی جاتی ہیں جو استثنا پھینک سکتی ہیں (try-catch کے بغیر نیٹ ورک کی درخواست، null View کے ساتھ کام)، تو انہیں try-catch میں لپیٹیں۔

کیا مجھے onRestart میں isFinishing() چیک کرنے کی ضرورت ہے؟

نہیں۔ onRestart صرف زندہ Activities کے لیے بلایا جاتا ہے جو Stopped حالت سے واپس آ رہی ہیں۔ onRestart میں isFinishing() ہمیشہ false ہوگا۔ isFinishing() چیک کرنا onPause (ڈیٹا محفوظ کرنا) اور onDestroy (دوبارہ تخلیق کو finish() سے ممتاز کرنا) میں معنی رکھتا ہے۔

خلاصہ

  • onRestart — زندگی کے چکر کا ایک طریقہ ہے جو Activity کے Stopped حالت سے واپس آنے پر بلایا جاتا ہے، onStart اور onResume سے پہلے۔
  • onRestart Activity کے پہلی بار بننے پر نہیں بلایا جاتا — صرف مکمل طور پر چھپائے جانے کے بعد دوبارہ دکھائے جانے پر۔
  • onRestart کا بنیادی مقصد پرانے ڈیٹا کو اپ ڈیٹ کرنا اور حالت (ٹوکن، نیٹ ورک، ترتیبات) چیک کرنا ہے۔
  • onRestart عمل کے خاتمے کے دوران نہیں بلایا جاتا — عمل کے خاتمے کے بعد بحالی کے لیے Bundle کے ساتھ onCreate استعمال کریں۔
  • onRestart میں onCreate کی منطق نقل نہ کریں: ابتداء onCreate میں کریں، اپ ڈیٹس onRestart میں کریں۔
  • Fragment کے لیے، onRestart کو اوور رائڈ کرنے کے بجائے viewLifecycleOwner پر LifecycleObserver استعمال کریں۔
  • onRestart کا صحیح نفاذ ملٹی ٹاسکنگ کے دوران UX کو بہتر بناتا ہے اور پرانے ڈیٹا کی نمائش کو روکتا ہے۔

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

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

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

مزید پڑھیں