چند رزومه

در اندروید ۹ (و پایین‌تر)، برنامه‌ها در شرایط زیر وارد حالت PAUSED می‌شدند:

  • یک فعالیت جدید و شفاف در بالای برنامه اجرا شد، در حالی که برنامه هنوز قابل مشاهده بود (و بنابراین متوقف نشده بود).
  • فعالیت از فوکوس خارج شد، اما مبهم نبود و کاربر می‌توانست با آن تعامل داشته باشد. برای مثال، در حالت چند پنجره‌ای، تعدادی از فعالیت‌ها می‌توانند قابل مشاهده باشند و همزمان ورودی لمسی دریافت کنند.

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

در اندروید ۱۰، تمام فعالیت‌های با بالاترین تمرکز در پشته‌های قابل مشاهده در حالت RESUMED قرار دارند. این امر سازگاری با حالت‌های چند پنجره‌ای و MD را برای برنامه‌هایی که از onPause() به جای onStop() برای متوقف کردن رفرش رابط کاربری و تعامل با کاربر استفاده می‌کنند، بهبود می‌بخشد. این به این معنی است:

  • هر دو فعالیت در حالت تقسیم صفحه نمایش از سر گرفته می‌شوند.
  • تمام فعالیت‌های قابل مشاهده از بالا در حالت پنجره‌بندی آزاد از سر گرفته می‌شوند.
  • فعالیت‌ها در چندین صفحه نمایش را می‌توان همزمان از سر گرفت.

شکل ۱. چند رزومه روی یک دستگاه تاشو

شکل ۲. چند رزومه در حالت دسکتاپ

فعالیت‌ها می‌توانند در حالت PAUSED قرار بگیرند، زمانی که نمی‌توان روی آنها تمرکز کرد یا تا حدی مسدود شده‌اند، مانند:

  • در یک صفحه نمایش تقسیم شده کوچک شده (با لانچر در کنار آن)، فعالیت اصلی از سر گرفته نمی‌شود زیرا قابل فوکوس نیست.
  • در حالت تصویر در تصویر، فعالیت از سر گرفته نمی‌شود زیرا قابل فوکوس نیست.
  • وقتی فعالیت‌ها توسط سایر فعالیت‌های شفاف در همان پشته پوشش داده می‌شوند.

این رویکرد به برنامه‌ها نشان می‌دهد که یک فعالیت فقط در حالت RESUMED می‌تواند از کاربر ورودی دریافت کند. قبل از اندروید ۱۰، فعالیت‌ها می‌توانستند در حالت PAUSED نیز ورودی دریافت کنند (برای مثال، سعی کنید هر دو فعالیت را به طور همزمان در حالت تقسیم صفحه در دستگاهی که اندروید ۹ دارد، لمس کنید).

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

Activity#onTopResumedActivityChanged(boolean onTop)

هنگام فراخوانی، این فراخوانی بین Activity#onResume() و Activity#onPause() فراخوانی می‌شود. این فراخوانی اختیاری است و می‌توان از آن صرف نظر کرد، بنابراین یک فعالیت می‌تواند از حالت RESUMED به حالت PAUSED برود بدون اینکه در بالاترین سطح سیستم قرار گیرد. به عنوان مثال، در حالت چند پنجره‌ای. از آنجا که این فراخوانی اختیاری است، بخشی از چرخه حیات فعالیت نیست و باید به ندرت مورد استفاده قرار گیرد.

فعالیت از سر گرفته شده‌ی قبلی، قبل از اینکه فعالیت از سر گرفته شده‌ی بعدی، onTopResumedActivity(false) را دریافت کند، اجرای onTopResumedActivity(true) را دریافت و به پایان می‌رساند، مگر اینکه فعالیت قبلی زمان زیادی را برای مدیریت فراخوانی متد صرف کند و به زمان انتظار ۵۰۰ میلی‌ثانیه برسد.

سازگاری

برای حفظ سازگاری هنگام پیاده‌سازی چند رزومه، این راه‌حل‌ها را در نظر بگیرید.

چندین فعالیت از سر گرفته شده در یک فرآیند برنامه

  • مشکل. در اندروید ۹ و پایین‌تر، فقط یک فعالیت در سیستم در یک زمان از سر گرفته می‌شود. همه انتقال‌ها بین فعالیت‌ها شامل مکث یک فعالیت قبل از از سرگیری فعالیت دیگر است. برخی از برنامه‌ها و چارچوب‌ها (مانند Flutter یا LocalActivityManager اندروید) از این واقعیت استفاده می‌کنند و وضعیت فعالیت از سر گرفته شده را در singletons ذخیره می‌کنند.
  • راه حل. در اندروید ۹ و پایین‌تر، اگر دو فعالیت از یک فرآیند مشابه هر دو از سر گرفته شوند، سیستم فقط فعالیتی را از سر می‌گیرد که در مرتبه Z بالاتر باشد. برنامه‌هایی که اندروید ۱۰ را هدف قرار می‌دهند می‌توانند از از سرگیری همزمان چندین فعالیت پشتیبانی کنند.

دسترسی همزمان به دوربین

  • مشکلات . این مشکلات در اندروید ۹ و پایین‌تر نیز وجود دارند. برای مثال، یک فعالیت تمام‌صفحه و از سر گرفته شده می‌تواند فوکوس دوربین را از دست بدهد و در حالت تصویر در تصویر به یک فعالیت متوقف شده در بالا منتقل شود، اما با پذیرش گسترده‌تر حالت‌های چند پنجره‌ای و چند نمایشگری، بیشتر در معرض دید قرار می‌گیرد.
    • به دلیل تغییراتی که در وضعیت RESUME ایجاد شده است، ممکن است برنامه‌ها حتی در حین از سرگیری از دوربین جدا شوند. برای رفع این مشکل، برنامه‌ها باید قطع اتصال دوربین را بدون از کار افتادن مدیریت کنند. هنگام قطع اتصال، برنامه‌ها یک فراخوانی مجدد قطع اتصال دریافت می‌کنند و تمام فراخوانی‌های API شروع به صدور خطای CameraAccessException می‌کنند.
    • resizeableActivity=false تضمینی برای دسترسی انحصاری به دوربین نیست، زیرا برنامه‌های دیگری که از دوربین استفاده می‌کنند می‌توانند در نمایشگرهای دیگر باز شوند.
  • راه‌حل‌ها. توسعه‌دهندگان باید منطقی برای زمان قطع ارتباط برنامه با دوربین در نظر بگیرند. اگر برنامه‌ای از دوربین قطع ارتباط کند، باید فراخوانی‌های دسترسی به دوربین را بررسی کند تا سعی کند دوباره متصل شود و به استفاده از دوربین ادامه دهد. علاوه بر فراخوانی موجود CameraManager#AvailabilityCallback#onCameraAvailable() ، اندروید ۱۰ CameraManager#AvailabilityCallback#onCameraAccessPrioritiesChanged() را اضافه کرده است که مواردی را پوشش می‌دهد که فوکوس (و اولویت دوربین) بین چندین فعالیت از سر گرفته شده تغییر می‌کند. توسعه‌دهندگان برنامه باید از هر دوی این فراخوانی‌ها برای تعیین زمان مناسب برای تلاش برای دسترسی به دوربین استفاده کنند.

رزومه چندگانه

در اندروید ۱۰، وضعیت چرخه حیات اکتیویتی توسط قابلیت مشاهده (visibility) و Z-order تعیین می‌شود. برای اطمینان از وضعیت صحیح پس از به‌روزرسانی‌های قابلیت مشاهده (visibility) در یک اکتیویتی و ارزیابی اینکه کدام وضعیت چرخه حیات قابل اجرا است، متد ActivityRecord#makeActiveIfNeeded() را از مکان‌های مختلف فراخوانی کنید. در اندروید ۱۰، active به معنای RESUMED یا PAUSED است و فقط در این دو مورد کار می‌کند.

در اندروید ۱۰، از سرگیری یک فعالیت به جای یک مکان واحد در سیستم، در هر پشته به طور جداگانه ردیابی می‌شود. دلیل این امر این است که چندین انتقال فعالیت می‌توانند به طور همزمان در حالت‌های چند پنجره‌ای انجام شوند. برای جزئیات بیشتر، به ActivityStack#mInResumeTopActivity مراجعه کنید.

تماس مجدد با فعالیت‌های از سر گرفته شده برتر

پس از اقداماتی که می‌توانند منجر به تغییر فعالیت برتر شوند (مانند راه‌اندازی فعالیت، از سرگیری یا تغییر در Z-order)، ActivityStackSupervisor#updateTopResumedActivityIfNeeded() فراخوانی می‌شود. این متد بررسی می‌کند که آیا بالاترین فعالیت از سر گرفته شده تغییر کرده است یا خیر و در صورت نیاز به‌روزرسانی را انجام می‌دهد. اگر فعالیت از سر گرفته شده قبلی، وضعیت از سر گرفته شده برتر را آزاد نکرده باشد، یک پیام از دست دادن وضعیت از سر گرفته شده برتر به آن ارسال می‌شود و یک مهلت زمانی در سمت سرور برنامه‌ریزی می‌شود ( ActivityStackSupervisor#scheduleTopResumedStateLossTimeout() ). گزارشی از وضعیت از سر گرفته شده برتر پس از انتشار وضعیت توسط فعالیت قبلی یا هنگامی که مهلت زمانی فرا می‌رسد، به فعالیت بعدی ارسال می‌شود (به کاربردهای موارد زیر مراجعه کنید):

ActivityStackSupervisor#scheduleTopResumedActivityStateIfNeeded()

یک آیتم تراکنش جدید TopResumedActivityChangeItem اضافه شده است تا تغییرات حالت از سر گرفته شده برتر را به کلاینت‌ها گزارش دهد و از معماری ActivityLifecycler از اندروید ۹ بهره می‌برد.

وضعیت از سرگیریِ برتر در سمت کلاینت ذخیره می‌شود و هر بار که اکتیویتی به RESUMED یا PAUSED منتقل می‌شود، بررسی می‌کند که آیا فراخوانی onTopResumedActivityChanged() باید فراخوانی شود یا خیر. این امر امکان جداسازی خاصی را در ارتباط وضعیت‌های چرخه حیات و وضعیت از سرگیریِ برتر بین سمت سرور و کلاینت فراهم می‌کند.