رویدادهای مختلف، برخی توسط کاربر و برخی توسط سیستم، میتوانند باعث انتقال یک Activity از یک حالت به حالت دیگر شوند. این سند برخی از موارد رایجی را که در آنها چنین انتقالهایی رخ میدهد و نحوه مدیریت این انتقالها را شرح میدهد.
برای اطلاعات بیشتر در مورد وضعیت فعالیتها، به چرخه حیات فعالیت مراجعه کنید. برای کسب اطلاعات در مورد اینکه چگونه کلاس ViewModel میتواند به شما در مدیریت چرخه حیات فعالیت کمک کند، به نمای کلی ViewModel مراجعه کنید.
برای اکثر تغییرات فعالیت، نیازی نیست که مستقیماً به فراخوانیهای برگشتی در چرخه حیات فعالیت پاسخ دهید. از آنجایی که Compose رابطهای کاربری را از حالت بازسازی میکند، میتوانید با اطمینان از ذخیره شدن حالت در مکانی مناسب، مانند rememberSaveable یا ViewModel ، از ترکیب خودکار بهره ببرید.
تغییر پیکربندی رخ میدهد
تعدادی رویداد وجود دارد که میتوانند باعث تغییر پیکربندی شوند. شاید برجستهترین مثال، تغییر بین جهتگیری عمودی و افقی باشد. موارد دیگری که میتوانند باعث تغییرات پیکربندی شوند شامل تغییرات در تنظیمات زبان یا دستگاه ورودی است.
وقتی تغییری در پیکربندی رخ میدهد، اکتیویتی از بین رفته و دوباره ایجاد میشود. این باعث فراخوانیهای زیر در نمونه اکتیویتی اصلی میشود:
یک نمونه جدید از اکتیویتی ایجاد میشود و فراخوانیهای زیر فعال میشوند:
در Compose، معمولاً نمیتوان مستقیماً با این callbackها تعامل داشت. در عوض، از Lifecycle API برای مشاهده تغییرات حالت استفاده کنید. در Compose، میتوانید از LocalLifecycleOwner.current برای دریافت چرخه حیات فعلی و اضافه کردن یک ناظر استفاده کنید که به شما امکان میدهد به رویدادها پاسخ دهید.
از ترکیبی از نمونههای ViewModel ، rememberSaveable یا ذخیرهسازی محلی پایدار برای حفظ وضعیت رابط کاربری یک فعالیت در طول تغییرات پیکربندی استفاده کنید. تصمیمگیری در مورد نحوه ترکیب این گزینهها به پیچیدگی دادههای رابط کاربری شما، موارد استفاده برای برنامه شما و در نظر گرفتن سرعت بازیابی در مقابل استفاده از حافظه بستگی دارد. برای اکثر موارد استفاده، باید وضعیت را در یک ViewModel قرار دهید و rememberSaveable استفاده کنید تا اطمینان حاصل شود که وضعیت در طول تغییرات پیکربندی و مرگ فرآیند آغاز شده توسط سیستم، حفظ میشود. برای اطلاعات بیشتر در مورد ذخیره وضعیت رابط کاربری فعالیت خود، به Save UI states مراجعه کنید.
وقتی یک اکتیویتی به دلیل تغییر پیکربندی دوباره ایجاد میشود، ترکیب اولیه از بین میرود. استفاده از ViewModel یا rememberSaveable تضمین میکند که حالت رابط کاربری شما در ترکیب جدید بازیابی میشود.
برای اطلاعات بیشتر، به چرخه حیات در Jetpack Compose و State و Jetpack Compose مراجعه کنید.
کیسهای چند پنجرهای را مدیریت کنید
وقتی یک برنامه وارد حالت چند پنجرهای میشود، که در اندروید ۷.۰ (سطح API ۲۴) و بالاتر موجود است، سیستم به اکتیویتی در حال اجرا، تغییر پیکربندی را اطلاع میدهد و بدین ترتیب، گذارهای چرخه عمر که قبلاً توضیح داده شد را طی میکند.
این رفتار همچنین در صورتی رخ میدهد که یک برنامه که از قبل در حالت چند پنجرهای است، تغییر اندازه دهد. اکتیویتی شما میتواند خود تغییر پیکربندی را مدیریت کند، یا میتواند به سیستم اجازه دهد تا اکتیویتی را از بین ببرد و آن را با ابعاد جدید از نو بسازد.
برای اطلاعات بیشتر در مورد چرخه حیات چند پنجرهای، به توضیح چرخه حیات چند پنجرهای در پشتیبانی از حالت چند پنجرهای مراجعه کنید.
در حالت چند پنجرهای، اگرچه دو برنامه برای کاربر قابل مشاهده است، اما تنها برنامهای که کاربر با آن در تعامل است در پیشزمینه قرار دارد و فوکوس روی آن است. آن فعالیت در حالت از سرگیری (Resume) است، در حالی که برنامه در پنجره دیگر در حالت مکث (Paused) قرار دارد.
وقتی کاربر از برنامه A به برنامه B میرود، سیستم onPause در برنامه A و onResume در برنامه B فراخوانی میکند. هر بار که کاربر بین برنامهها جابجا میشود، بین این دو متد جابجا میشود.
برای جزئیات بیشتر در مورد حالت چند پنجرهای، به پشتیبانی از حالت چند پنجرهای مراجعه کنید.
فعالیت یا کادر محاورهای در پیشزمینه ظاهر میشود
اگر یک فعالیت یا کادر محاورهای جدید در پیشزمینه ظاهر شود، فوکوس را به خود اختصاص دهد و بخشی از فعالیت در حال انجام را بپوشاند، فعالیت تحت پوشش فوکوس را از دست میدهد و وارد حالت مکث میشود. سپس، سیستم onPause را روی آن فراخوانی میکند.
وقتی اکتیویتیِ تحت پوشش به پیشزمینه برمیگردد و فوکوس دوباره به آن برمیگردد، سیستم onResume را فراخوانی میکند.
اگر یک فعالیت یا کادر محاورهای جدید در پیشزمینه ظاهر شود، تمرکز را به خود جلب کند و فعالیت در حال انجام را کاملاً بپوشاند، فعالیت تحت پوشش تمرکز را از دست میدهد و وارد حالت متوقف شده میشود. سپس سیستم، به سرعت و پشت سر هم، توابع onPause و onStop را فراخوانی میکند.
وقتی همان نمونه از اکتیویتیِ پوشش داده شده به پیشزمینه برمیگردد، سیستم onRestart ، onStart و onResume را روی اکتیویتی فراخوانی میکند. اگر نمونه جدیدی از اکتیویتیِ پوشش داده شده به پسزمینه بیاید، سیستم onRestart فراخوانی نمیکند و فقط onStart و onResume .
ترکیب مجدد تحت تأثیر دیالوگهای ظاهر شده در پیشزمینه قرار نمیگیرد. با این حال، عوارض جانبی مرتبط با چرخه حیات، مانند جریانها و انیمیشنها، باید از APIهای آگاه از چرخه حیات (مانند collectAsStateWithLifecycle ) استفاده کنند تا در صورت نیاز، کار را به طور خودکار متوقف کرده و از سر بگیرند. برای اطلاعات بیشتر، به State و Jetpack Compose مراجعه کنید.
ضربهها یا حرکات کاربر برگشت
اگر یک اکتیویتی در پیشزمینه باشد و کاربر روی آن ضربه بزند یا با اشاره دست آن را به عقب برگرداند، اکتیویتی از طریق فراخوانیهای onPause ، onStop و onDestroy منتقل میشود. اکتیویتی از بین میرود و از پشته پشتی حذف میشود.
در یک برنامه تکفعالیتی، مانند اکثر برنامههای Compose، اگر composable از backstack ناوبری حذف شود، rememberSaveable وضعیت را حفظ نمیکند. دلیل این امر این است که وقتی کاربر روی Back ضربه میزند، انتظار نمیرود که به همان نمونه بازگردد، بنابراین تمام وضعیت پاک میشود.
برای پیادهسازی رفتار سفارشی Back، مانند نمایش یک کادر محاورهای که از کاربر میخواهد تأیید کند که میخواهد از برنامه شما خارج شود، از API NavigationEventHandler استفاده کنید.
سیستم، فرآیند برنامه را متوقف میکند
اگر برنامهای در پسزمینه باشد و سیستم نیاز به آزاد کردن حافظه برای یک برنامهی پیشزمینه داشته باشد، سیستم میتواند برنامهی پسزمینه را از بین ببرد. وقتی سیستم یک برنامه را از بین میبرد، هیچ تضمینی وجود ندارد که onDestroy در برنامه فراخوانی شود.
برای کسب اطلاعات بیشتر در مورد نحوه تصمیمگیری سیستم برای از بین بردن فرآیندهای مورد نظر، بخش وضعیت فعالیت و حذف از حافظه و بخش فرآیندها و چرخه حیات برنامه را مطالعه کنید.
برای یادگیری نحوه ذخیره وضعیت رابط کاربری اکتیویتی خود هنگامی که سیستم فرآیند برنامه شما را متوقف میکند، به ذخیره و بازیابی وضعیت رابط کاربری گذرا مراجعه کنید.