Activity — کامپوننت اصلی برنامه Android که یک صفحه با رابط کاربری را نمایش میدهد. سیستم صفحهها را از طریق چرخه حیات دقیق — callbackهای onCreate، onResume و onDestroy مدیریت میکند. هر Activity در AndroidManifest.xml اعلام و از طریق Intent راهاندازی میشود. درباره تاریخچه Android در مستندات رسمی Google بیشتر بخوانید.
نکات اصلی
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 — مجموعه وضعیتها و callbackهایی که صفحه از ایجاد تا نابودی طی میکند. درک Lifecycle حیاتی است: کار نادرست با وضعیتها منجر به نشت حافظه، از دست رفتن دادهها و کرش برنامه میشود.
سیستم Android callbackها را به ترتیب دقیق فراخوانی میکند. توسعهدهنده متدهای لازم را برای مقداردهی منابع، ذخیره دادهها و آزادسازی حافظه بازنویسی میکند. هر callback یک جفت دارد: onCreate ↔ onDestroy، onStart ↔ onStop، onResume ↔ onPause.
| Callback | هدف | عمل توسعهدهنده |
|---|---|---|
| onCreate | هنگام ایجاد Activity فراخوانی میشود | مقداردهی UI، اشتراک ViewModel |
| onStart | Activity قابل مشاهده میشود | راهاندازی انیمیشنها، دوربین، GPS |
| onResume | Activity فوکوس ورودی میگیرد | ادامه ویدیو، تایمرها |
| onPause | Activity فوکوس را از دست میدهد | ذخیره پیشنویسها، توقف انیمیشنها |
| onStop | Activity توسط صفحه دیگری پنهان شده | آزادسازی منابع سنگین |
| onDestroy | Activity نابود میشود | پاکسازی اشتراکها، Closeable |
چهار وضعیت Activity متمایز میشود: Running (onResume فعال)، Paused (قابل مشاهده اما بدون فوکوس)، Stopped (قابل مشاهده نیست)، Destroyed (نابود شده). سیستم میتواند Activity را در وضعیت Stopped در صورت کمبود حافظه از بین ببرد — دادهها باید در onSaveInstanceState ذخیره شوند.
سه متد کلیدی چرخه حیات Activity را با مثال در Kotlin بررسی میکنیم. onCreate — نقطه ورود، یک بار فراخوانی میشود. در اینجا اتصال layout از طریق setContentView، مقداردهی RecyclerView، اشتراک LiveData انجام میشود. onStart — Activity برای کاربر قابل مشاهده میشود. onResume — Activity فوکوس میگیرد و آماده تعامل است.
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 اعلام شود. بدون ثبت، سیستم صفحه را پیدا نمیکند و استثنای ActivityNotFoundException را پرتاب میکند. در مانیفست نام کلاس، تم، جهت، launchMode و فیلترهای Intent مشخص میشوند.
<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) را فعال میکند.
Intent — شیئی که عملی را که باید انجام شود توصیف میکند. در زمینه Activity، Intent برای راهاندازی صفحه دیگر با انتقال داده استفاده میشود. Intent میتواند صریح (کلاس مشخص را نشان میدهد) و ضمنی (عمل را نشان میدهد، سیستم کامپوننت مناسب را انتخاب میکند) باشد.
// 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 کار میکند.
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 را تحمل میکند و دادهها را در حافظه نگه میدارد که برای اشیاء پیچیده و درخواستهای شبکه کارآمدتر است.
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())
}
}رویکرد مدرن Google — معماری Single Activity با یک Activity و چندین Fragment. برنامه از یک MainActivity استفاده میکند و تمام ناوبری توسط Navigation Component از طریق NavHostFragment انجام میشود. مزایا: ناوبری متمرکز، ViewModel مشترک در هر صفحه، کار صحیح با Deep Links.
Jetpack Navigation Component کار با back stack، انیمیشنهای انتقال و ارسال آرگومانها را خودکار میکند. NavHostFragment در layout Activity قرار میگیرد و گراف ناوبری (NavGraph) تمام صفحات و ارتباطات بین آنها را توصیف میکند. این رویکرد توسط Google برای پروژههای جدید توصیه میشود و با اصول Material Design مطابقت دارد.
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 — بخشی از UI درون Activity که بازآفرینی Activity را تحمل میکند و به Lifecycle آن وابسته است. Activity اجباری است، Fragment اختیاری.
محدودیتی وجود ندارد. هر صفحه معمولاً یک Activity جداگانه را نشان میدهد. برای برنامه ساده یک عدد کافی است، برای چندصفحهای — از ۵ تا ۲۰. Google یک Activity با چندین Fragment را توصیه میکند.
launchMode تعیین میکند که Activity چگونه در پشته وظایف ایجاد میشود. چهار حالت: standard (نمونه جدید ایجاد میشود)، singleTop، singleTask (یک نمونه در وظیفه) و singleInstance (وظیفه ایزوله). حالت در AndroidManifest.xml مشخص میشود.
از طریق Intent — شیئی با اکستراها (putExtra) که در آن primitives، رشتهها، Parcelable یا Serializable قرار میگیرند. برای بازخورد از Activity Result API استفاده میشود — جایگزین مدرن نوعامن startActivityForResult.
Configuration Change — بازآفرینی Activity هنگام تغییر پیکربندی (چرخش صفحه، تغییر زبان، صفحهکلید). سیستم onDestroy → onCreate را فراخوانی میکند. برای ذخیره دادهها از onSaveInstanceState یا ViewModel از Jetpack استفاده میشود.
خلاصه
ما یک اپلیکیشن موبایل به صورت کلید در دست توسعه خواهیم داد
IT Sectr از سال 2017 برنامههای iOS و Android را برای استارتاپها و کسبوکارها ایجاد میکند. ما به شما مشاوره میدهیم و بهترین راهحل را پیشنهاد خواهیم کرد.