وضعیت فعالیت تغییر می کند

رویدادهای مختلف، برخی توسط کاربر و برخی دیگر توسط سیستم، می توانند باعث شوند که یک Activity از یک حالت به حالت دیگر منتقل شود. این سند برخی از موارد متداول را که در آن چنین انتقال‌هایی اتفاق می‌افتد و نحوه رسیدگی به آن انتقال را شرح می‌دهد.

برای اطلاعات بیشتر در مورد وضعیت های فعالیت، به چرخه عمر فعالیت مراجعه کنید. برای آشنایی با اینکه چگونه کلاس ViewModel می تواند به شما در مدیریت چرخه حیات فعالیت کمک کند، به نمای کلی ViewModel مراجعه کنید.

تغییر پیکربندی رخ می دهد

تعدادی رویداد وجود دارد که می تواند باعث تغییر پیکربندی شود. شاید بارزترین مثال تغییر بین جهت گیری های پرتره و منظره باشد. موارد دیگری که می توانند باعث تغییرات پیکربندی شوند عبارتند از تغییرات در تنظیمات زبان یا دستگاه ورودی.

هنگامی که یک تغییر پیکربندی رخ می دهد، فعالیت از بین می رود و دوباره ایجاد می شود. این باعث می شود که تماس های زیر در نمونه فعالیت اصلی ایجاد شود:

  1. onPause()
  2. onStop()
  3. onDestroy()

نمونه جدیدی از فعالیت ایجاد می شود و تماس های زیر فعال می شوند:

  1. onCreate()
  2. onStart()
  3. onResume()

از ترکیبی از نمونه‌های ViewModel ، روش onSaveInstanceState() یا ذخیره‌سازی محلی دائمی برای حفظ وضعیت رابط کاربری یک فعالیت در سراسر تغییرات پیکربندی استفاده کنید. تصمیم‌گیری درباره نحوه ترکیب این گزینه‌ها به پیچیدگی داده‌های رابط کاربری، موارد استفاده برای برنامه‌تان و در نظر گرفتن سرعت بازیابی در مقابل استفاده از حافظه بستگی دارد. برای اطلاعات بیشتر در مورد ذخیره وضعیت رابط کاربری فعالیت خود، به ذخیره وضعیت رابط کاربری مراجعه کنید.

دسته چند پنجره ای

هنگامی که یک برنامه وارد حالت چند پنجره‌ای می‌شود که در اندروید 7.0 (سطح API 24) و بالاتر موجود است، سیستم فعالیت در حال اجرا را از تغییر پیکربندی مطلع می‌کند، بنابراین از طریق انتقال چرخه زندگی که قبلاً توضیح داده شد، می‌گذرد.

این رفتار همچنین در صورتی رخ می‌دهد که اندازه برنامه‌ای که قبلاً در حالت چند پنجره‌ای قرار دارد تغییر اندازه دهد. فعالیت شما می تواند خود تغییر پیکربندی را کنترل کند، یا می تواند به سیستم اجازه دهد تا فعالیت را از بین ببرد و آن را با ابعاد جدید بازسازی کند.

برای اطلاعات بیشتر در مورد چرخه عمر چند پنجره ای، به توضیح چرخه عمر چند پنجره ای در صفحه پشتیبانی از چند پنجره مراجعه کنید.

در حالت چند پنجره ای، اگرچه دو برنامه برای کاربر قابل مشاهده است، اما تنها برنامه ای که کاربر با آن تعامل دارد در پیش زمینه است و فوکوس دارد. آن فعالیت در وضعیت Resumed است، در حالی که برنامه در پنجره دیگر در حالت Paused است.

هنگامی که کاربر از برنامه A به برنامه B تغییر مکان می دهد، سیستم onPause() در برنامه A و onResume() در برنامه B فرا می خواند. هر بار که کاربر بین برنامه ها جابجا می شود بین این دو روش جابه جا می شود.

برای جزئیات بیشتر در مورد حالت چند پنجره ای، به پشتیبانی از چند پنجره مراجعه کنید.

فعالیت یا گفتگو در پیش زمینه ظاهر می شود

اگر یک فعالیت یا گفتگوی جدید در پیش‌زمینه ظاهر شود که تمرکز را به خود اختصاص دهد و تا حدی فعالیت در حال انجام را پوشش دهد، فعالیت تحت پوشش تمرکز خود را از دست می‌دهد و وارد حالت Paused می‌شود. سپس، سیستم onPause() را روی آن فراخوانی می کند.

هنگامی که فعالیت تحت پوشش به پیش زمینه باز می گردد و دوباره تمرکز می کند، سیستم onResume() را فرا می خواند.

اگر یک اکتیویتی یا گفتگوی جدید در پیش زمینه ظاهر شود که تمرکز را به خود اختصاص دهد و فعالیت در حال انجام را به طور کامل پوشش دهد، فعالیت تحت پوشش تمرکز خود را از دست داده و وارد حالت توقف شده می شود. سپس سیستم به‌سرعت، onPause() و onStop() را فراخوانی می‌کند.

هنگامی که همان نمونه از اکتیویتی تحت پوشش به پیش زمینه باز می گردد، سیستم onRestart() , onStart() و onResume() را روی اکتیویتی فراخوانی می کند. اگر نمونه جدیدی از فعالیت تحت پوشش است که به پس‌زمینه می‌آید، سیستم onRestart() فراخوانی نمی‌کند، فقط onStart() و onResume() .

کاربر به عقب ضربه می زند یا اشاره می کند

اگر یک اکتیویتی در پیش‌زمینه باشد و کاربر به بازگشت ضربه بزند یا اشاره کند، فعالیت از طریق تماس‌های onPause() , onStop() و onDestroy() منتقل می‌شود. فعالیت از بین می رود و از پشته حذف می شود.

به طور پیش‌فرض، در این مورد، فراخوانی onSaveInstanceState() فعال نمی‌شود. این رفتار فرض می‌کند که کاربر بدون انتظار بازگشت به همان نمونه فعالیت، روی Back ضربه می‌زند.

با این حال، می‌توانید روش onBackPressed() را برای پیاده‌سازی رفتار سفارشی لغو کنید، مانند نمایش یک گفتگو که از کاربر می‌خواهد تأیید کند که می‌خواهد از برنامه شما خارج شود.

اگر متد onBackPressed() را نادیده می گیرید، اکیداً توصیه می کنیم که همچنان super.onBackPressed() از متد overrid شده خود فراخوانی کنید. در غیر این صورت ممکن است رفتار Back سیستم برای کاربر آزاردهنده باشد.

سیستم فرآیند برنامه را از بین می برد

اگر برنامه‌ای در پس‌زمینه باشد و سیستم باید حافظه را برای برنامه پیش‌زمینه آزاد کند، سیستم می‌تواند برنامه پس‌زمینه را از بین ببرد. هنگامی که سیستم یک برنامه را می کشد، هیچ تضمینی وجود ندارد که onDestroy() در برنامه فراخوانی شود.

برای اطلاعات بیشتر در مورد اینکه سیستم چگونه تصمیم می‌گیرد کدام فرآیندها را از بین ببرد، وضعیت فعالیت و خروج از حافظه و فرآیندها و چرخه عمر برنامه را بخوانید.

برای یادگیری نحوه ذخیره وضعیت رابط کاربری فعالیت خود در زمانی که سیستم فرآیند برنامه شما را از بین می‌برد، به ذخیره و بازیابی حالت رابط کاربری گذرا مراجعه کنید.