چند رزومه

در اندروید 9 (و پایین‌تر)، برنامه‌ها در حالت PAUSED قرار می‌گرفتند که:

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

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

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

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

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

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

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

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

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

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

Activity#onTopResumedActivityChanged(boolean onTop)

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

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

سازگاری

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

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

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

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

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

چند رزومه

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

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

پاسخ به تماس با فعالیت برتر از سر گرفته شده

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

ActivityStackSupervisor#scheduleTopResumedActivityStateIfNeeded()

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

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