Activity — چیست، صفحه برنامه در Android و Lifecycle آن

نویسنده: IT Sectr منتشر شده: 2026-02-22 زمان مطالعه: 7 دقیقه

Activity — کامپوننت اصلی برنامه Android که یک صفحه با رابط کاربری را نمایش می‌دهد. سیستم صفحه‌ها را از طریق چرخه حیات دقیق — callbackهای onCreate، onResume و onDestroy مدیریت می‌کند. هر Activity در AndroidManifest.xml اعلام و از طریق Intent راه‌اندازی می‌شود. درباره تاریخچه Android در مستندات رسمی Google بیشتر بخوانید.

نکات اصلی

  • Activity — کامپوننت Android نمایش‌دهنده یک صفحه با UI. از طریق Lifecycle مدیریت می‌شود
  • چرخه حیات شامل ۶ callback است: onCreate, onStart, onResume, onPause, onStop, onDestroy
  • Intent — مکانیزم راه‌اندازی Activity و انتقال داده بین صفحات
  • Manifest — ثبت اجباری هر Activity در AndroidManifest.xml
  • ViewModel — کامپوننت Jetpack برای ذخیره داده‌ها هنگام بازآفرینی Activity

Activity چیست؟

Activity — کامپوننت کلیدی برنامه Android که پنجره‌ای برای تعامل با کاربر فراهم می‌کند. هر Activity یک صفحه مجزا را مدیریت می‌کند: لیست وظایف، فرم ورود، نمایش عکس. سیستم Android Activity را درخواستی ایجاد می‌کند و هنگامی که حافظه برای برنامه‌های دیگر نیاز است، نابود می‌کند.

Activity برای اولین بار در Android 1.0 (2008) ظاهر شد و همچنان بلوک ساختمانی اصلی رابط کاربری است. طبق داده‌های Google (2026)، ۹۸٪ از برنامه‌های Google Play حداقل یک Activity دارند. در معماری مدرن، Google یک Activity با چندین Fragment را توصیه می‌کند، اما برنامه چندصفحه‌ای کلاسیک همچنان رایج است.

Activity stack (back stack) — پشته وظایف که تاریخچه انتقال‌ها را ذخیره می‌کند. وقتی کاربر دکمه «بازگشت» را فشار می‌دهد، Activity فعلی نابود و Activity قبلی بازیابی می‌شود. سیستم پشته را خودکار مدیریت می‌کند، اما توسعه‌دهنده می‌تواند رفتار را از طریق launchMode و پرچم‌های Intent کنترل کند.

چرخه حیات Activity

چرخه حیات Activity — مجموعه وضعیت‌ها و callbackهایی که صفحه از ایجاد تا نابودی طی می‌کند. درک Lifecycle حیاتی است: کار نادرست با وضعیت‌ها منجر به نشت حافظه، از دست رفتن داده‌ها و کرش برنامه می‌شود.

سیستم Android callbackها را به ترتیب دقیق فراخوانی می‌کند. توسعه‌دهنده متدهای لازم را برای مقداردهی منابع، ذخیره داده‌ها و آزادسازی حافظه بازنویسی می‌کند. هر callback یک جفت دارد: onCreate ↔ onDestroy، onStart ↔ onStop، onResume ↔ onPause.

Callbackهدفعمل توسعه‌دهنده
onCreateهنگام ایجاد Activity فراخوانی می‌شودمقداردهی UI، اشتراک ViewModel
onStartActivity قابل مشاهده می‌شودراه‌اندازی انیمیشن‌ها، دوربین، GPS
onResumeActivity فوکوس ورودی می‌گیردادامه ویدیو، تایمرها
onPauseActivity فوکوس را از دست می‌دهدذخیره پیش‌نویس‌ها، توقف انیمیشن‌ها
onStopActivity توسط صفحه دیگری پنهان شدهآزادسازی منابع سنگین
onDestroyActivity نابود می‌شودپاکسازی اشتراک‌ها، Closeable

وضعیت‌های Activity

چهار وضعیت Activity متمایز می‌شود: Running (onResume فعال)، Paused (قابل مشاهده اما بدون فوکوس)، Stopped (قابل مشاهده نیست)، Destroyed (نابود شده). سیستم می‌تواند Activity را در وضعیت Stopped در صورت کمبود حافظه از بین ببرد — داده‌ها باید در onSaveInstanceState ذخیره شوند.

متدهای چرخه حیات: onCreate, onStart, onResume

سه متد کلیدی چرخه حیات Activity را با مثال در Kotlin بررسی می‌کنیم. onCreate — نقطه ورود، یک بار فراخوانی می‌شود. در اینجا اتصال layout از طریق setContentView، مقداردهی RecyclerView، اشتراک LiveData انجام می‌شود. onStart — Activity برای کاربر قابل مشاهده می‌شود. onResume — Activity فوکوس می‌گیرد و آماده تعامل است.

kotlin
class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val recyclerView = findViewById<RecyclerView>(R.id.rv_items)
        recyclerView.layoutManager = LinearLayoutManager(this)
        loadItems()
    }

    override fun onStart() {
        super.onStart()
        startLocationUpdates()
    }

    override fun onResume() {
        super.onResume()
        resumeVideoPlayer()
    }
}

در مثال onCreate RecyclerView را مقداردهی و داده‌ها را بارگذاری می‌کند. onStart به‌روزرسانی موقعیت جغرافیایی را راه‌اندازی می‌کند — منبعی که فقط وقتی صفحه قابل مشاهده است باید کار کند. onResume ویدیوی متوقف‌شده در onPause را ادامه می‌دهد. چنین تقسیم‌بندی از کار اضافی در پس‌زمینه جلوگیری می‌کند.

اعلام Activity در AndroidManifest.xml

هر Activity باید در فایل AndroidManifest.xml اعلام شود. بدون ثبت، سیستم صفحه را پیدا نمی‌کند و استثنای ActivityNotFoundException را پرتاب می‌کند. در مانیفست نام کلاس، تم، جهت، launchMode و فیلترهای Intent مشخص می‌شوند.

xml
<application
    android:allowBackup="true"
    android:label="@string/app_name"
    android:theme="@style/Theme.MyApp">

    <activity
        android:name=".MainActivity"
        android:exported="true">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

    <activity
        android:name=".DetailActivity"
        android:parentActivityName=".MainActivity" />
</application>

پرچم exported تعیین می‌کند که آیا سایر برنامه‌ها می‌توانند Activity را راه‌اندازی کنند. برای صفحه اصلی exported=true، برای صفحات داخلی — false. ویژگی parentActivityName ناوبری استاندارد «بالا» (Up Navigation) را فعال می‌کند.

راه‌اندازی Activity از طریق Intent

Intent — شیئی که عملی را که باید انجام شود توصیف می‌کند. در زمینه Activity، Intent برای راه‌اندازی صفحه دیگر با انتقال داده استفاده می‌شود. Intent می‌تواند صریح (کلاس مشخص را نشان می‌دهد) و ضمنی (عمل را نشان می‌دهد، سیستم کامپوننت مناسب را انتخاب می‌کند) باشد.

kotlin
// Intent صریح — راه‌اندازی DetailActivity با داده‌ها
val intent = Intent(this, DetailActivity::class.java).apply {
    putExtra("item_id", itemId)
    putExtra("item_name", itemName)
}
startActivity(intent)

// دریافت داده‌ها در DetailActivity
val itemId = intent.getLongExtra("item_id", 0L)
val itemName = intent.getStringExtra("item_name") ?: ""

برای دریافت نتیجه از Activity راه‌اندازی شده از Activity Result API استفاده می‌شود که جایگزین startActivityForResult قدیمی شده است. API جدید نوع‌امن، اعلانی است و با Jetpack Compose کار می‌کند.

kotlin
private val getResult = registerForActivityResult(
    ActivityResultContracts.StartActivityForResult()
) { result ->
    if (result.resultCode == Activity.RESULT_OK) {
        val data = result.data?.getStringExtra("result_key")
    }
}

fun openPicker() {
    val intent = Intent(this, PickerActivity::class.java)
    getResult.launch(intent)
}

ذخیره وضعیت هنگام بازآفرینی

هنگام چرخش صفحه یا تغییر پیکربندی، Android Activity را بازآفرینی می‌کند — به ترتیب onDestroy و onCreate را فراخوانی می‌کند. بدون ذخیره وضعیت، کاربر داده‌های واردشده، موقعیت اسکرول و عناصر انتخاب‌شده را از دست می‌دهد. برای حل این مشکل Android دو مکانیزم ارائه می‌دهد: onSaveInstanceState و ViewModel.

onSaveInstanceState داده‌های ساده را قبل از فراخوانی onDestroy در Bundle ذخیره می‌کند. ViewModel از Jetpack بازآفرینی Activity را تحمل می‌کند و داده‌ها را در حافظه نگه می‌دارد که برای اشیاء پیچیده و درخواست‌های شبکه کارآمدتر است.

kotlin
class MainActivity : AppCompatActivity() {

    private val viewModel: MainViewModel by viewModels()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        // ViewModel به‌طور خودکار داده‌ها را ذخیره می‌کند
        viewModel.items.observe(this) { items ->
            updateAdapter(items)
        }
    }

    override fun onSaveInstanceState(outState: Bundle) {
        super.onSaveInstanceState(outState)
        outState.putInt("scroll_position", recyclerView.computeVerticalScrollOffset())
    }
}

معماری Single Activity و Jetpack

رویکرد مدرن Google — معماری Single Activity با یک Activity و چندین Fragment. برنامه از یک MainActivity استفاده می‌کند و تمام ناوبری توسط Navigation Component از طریق NavHostFragment انجام می‌شود. مزایا: ناوبری متمرکز، ViewModel مشترک در هر صفحه، کار صحیح با Deep Links.

Jetpack Navigation Component کار با back stack، انیمیشن‌های انتقال و ارسال آرگومان‌ها را خودکار می‌کند. NavHostFragment در layout Activity قرار می‌گیرد و گراف ناوبری (NavGraph) تمام صفحات و ارتباطات بین آنها را توصیف می‌کند. این رویکرد توسط Google برای پروژه‌های جدید توصیه می‌شود و با اصول Material Design مطابقت دارد.

kotlin
class MainActivity : AppCompatActivity() {

    private val navController by lazy {
        findViewById<NavHostFragment>(R.id.nav_host_fragment)
            .navController
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        // پیکربندی NavigationUI برای AppBar
        setupActionBarWithNavController(navController)
    }

    override fun onSupportNavigateUp() = 
        navController.navigateUp() || super.onSupportNavigateUp()
}

سوالات متداول

Activity چه تفاوتی با Fragment دارد؟

Activity — صفحه کامل برنامه با چرخه حیات خاص خود. Fragment — بخشی از UI درون Activity که بازآفرینی Activity را تحمل می‌کند و به Lifecycle آن وابسته است. Activity اجباری است، Fragment اختیاری.

چند Activity می‌تواند در یک برنامه باشد؟

محدودیتی وجود ندارد. هر صفحه معمولاً یک Activity جداگانه را نشان می‌دهد. برای برنامه ساده یک عدد کافی است، برای چندصفحه‌ای — از ۵ تا ۲۰. Google یک Activity با چندین Fragment را توصیه می‌کند.

launchMode در Activity چیست؟

launchMode تعیین می‌کند که Activity چگونه در پشته وظایف ایجاد می‌شود. چهار حالت: standard (نمونه جدید ایجاد می‌شود)، singleTop، singleTask (یک نمونه در وظیفه) و singleInstance (وظیفه ایزوله). حالت در AndroidManifest.xml مشخص می‌شود.

چگونه داده بین Activityها منتقل کنیم؟

از طریق Intent — شیئی با اکستراها (putExtra) که در آن primitives، رشته‌ها، Parcelable یا Serializable قرار می‌گیرند. برای بازخورد از Activity Result API استفاده می‌شود — جایگزین مدرن نوع‌امن startActivityForResult.

Configuration Change در Android چیست؟

Configuration Change — بازآفرینی Activity هنگام تغییر پیکربندی (چرخش صفحه، تغییر زبان، صفحه‌کلید). سیستم onDestroy → onCreate را فراخوانی می‌کند. برای ذخیره داده‌ها از onSaveInstanceState یا ViewModel از Jetpack استفاده می‌شود.

خلاصه

  • Activity — کامپوننت اصلی Android که یک صفحه با رابط کاربری را نمایش می‌دهد و از طریق چرخه حیات مدیریت می‌شود
  • چرخه حیات از شش callback تشکیل شده: onCreate, onStart, onResume, onPause, onStop, onDestroy — هر کدام هدف مشخصی دارند
  • Intent راه‌اندازی Activity و انتقال داده بین صفحات را از طریق فراخوانی‌های صریح و ضمنی تضمین می‌کند
  • AndroidManifest.xml ثبت اجباری هر Activity با نام، تم، جهت و فیلترها را الزامی می‌کند
  • ViewModel از Jetpack داده‌ها را هنگام بازآفرینی Activity ذخیره می‌کند و جایگزین ذخیره دستی در onSaveInstanceState می‌شود
  • معماری Single Activity با Navigation Component — استاندارد مدرن توصیه‌شده توسط Google برای پروژه‌های Android
  • launchMode رفتار Activity را در پشته وظایف مدیریت می‌کند: از standard تا singleInstance برای صفحات ایزوله

ما یک اپلیکیشن موبایل به صورت کلید در دست توسعه خواهیم داد

IT Sectr از سال 2017 برنامه‌های iOS و Android را برای استارتاپ‌ها و کسب‌وکارها ایجاد می‌کند. ما به شما مشاوره می‌دهیم و بهترین راه‌حل را پیشنهاد خواهیم کرد.

بحث درباره پروژه

همچنین بخوانید