Screen Continuity: چیست، API تا و تطبیق رابط

نویسنده: IT Sectr منتشر شده: 2026-06-09 زمان مطالعه: 5 دقیقه

Screen Continuity — مکانیزم Android که انتقال بی‌درز برنامه بین حالت بسته و باز دستگاه تاشو را تضمین می‌کند. هنگام باز کردن، صفحه ابعاد فیزیکی خود را تغییر می‌دهد و سیستم Activity را با پیکربندی‌های جدید راه‌اندازی مجدد می‌کند. طبق Google Developer, 2025، پردازش صحیح تداوم تجربه کاربر را ۴۰٪ بهبود می‌بخشد و تعداد شکایت‌ها در مورد بازنشانی حالت را کاهش می‌دهد. API ScreenContinuity از نسخه ۱٫۱ در Jetpack WindowManager گنجانده شده است و به توسعه‌دهنده اجازه می‌دهد چرخه حیات را هنگام تغییر حالت دستگاه مدیریت کند.

مهمترین نکات

  • Screen Continuity — فناوری حفظ حالت Activity هنگام تغییر پیکربندی فیزیکی صفحه در دستگاه‌های تاشو Android.
  • Jetpack WindowManager API را برای ردیابی حالت‌های دستگاه ارائه می‌دهد: HALF_OPENED, FLAT, TABLE_TOP.
  • onRetainNonConfigurationInstance — روش کلیدی برای حفظ داده‌ها هنگام بازآفرینی Activity پس از بستن یا باز کردن.
  • تست تداوم روی شبیه‌ساز دستگاه تاشو از طریق Android Studio یا روی دستگاه‌های فیزیکی Galaxy Z Fold انجام می‌شود.
  • نادیده گرفتن تداوم منجر به از دست دادن حالت صفحه، بازنشانی داده‌های فرم و کاهش تجربه کاربر می‌شود.

Screen Continuity چیست؟

Screen Continuity مکانیزم Android است که حالت Activity را هنگام تغییر پیکربندی فیزیکی صفحه در دستگاه‌های تاشو حفظ می‌کند. هنگامی که کاربر گوشی را باز یا بسته می‌کند، سیستم می‌تواند Activity را با ابعاد جدید پنجره راه‌اندازی مجدد کند. تداوم از از دست رفتن داده‌های وارد شده، موقعیت پیمایش و صفحه جلوگیری می‌کند.

بر خلاف چرخش معمولی صفحه، که در آن Android به سادگی Activity را با جهت‌گیری جدید بازآفرینی می‌کند، دستگاه‌های تاشو سناریوهای کاملاً جدیدی را معرفی می‌کنند. حالت HALF_OPENED به برنامه اجازه می‌دهد روی نیم صفحه کار کند و FLAT — در حالت تبلت کاملاً باز. بدون پشتیبانی از Screen Continuity هر تغییر حالت رابط را به حالت اولیه بازنشانی می‌کند.

طبق Google I/O 2024، بیش از ۶۲٪ از کاربران دستگاه‌های تاشو با برنامه‌هایی مواجه شده‌اند که تغییر بین حالت‌ها را به درستی پردازش نمی‌کنند. Screen Continuity این مشکل را در سطح API حل می‌کند و ابزارهای آماده برای ذخیره و بازیابی UI در اختیار توسعه‌دهنده قرار می‌دهد.

حالت‌های دستگاه‌های تاشو: وضعیت‌های صفحه

Jetpack WindowManager سه حالت پایه دستگاه تاشو را از طریق کلاس FoldingFeature تعریف می‌کند. هر حالت مربوط به موقعیت فیزیکی خاص لولا است و نیاز به پردازش ویژه رابط دارد.

HALF_OPENED — حالت نیمه‌باز

دستگاه در زاویه ۳۰ تا ۱۶۰ درجه قرار دارد. صفحه به دو ناحیه منطقی تقسیم می‌شود. برنامه می‌تواند محتوا را در نیمه بالایی و کنترل‌ها را در نیمه پایینی نمایش دهد. حالت Tabletop برای تماس‌های ویدیویی و پخش‌کننده‌های رسانه دقیقاً از این حالت استفاده می‌کند.

FLAT — حالت کاملاً باز

دستگاه ۱۸۰ درجه باز شده و یک صفحه بزرگ واحد تشکیل می‌دهد. برنامه به حالت تبلت با فضای کاری بزرگ‌تر منتقل می‌شود. در این حالت توصیه می‌شود از طرح چند صفحه‌ای با نوار ناوبری و محتوای جزئیات در کنار هم استفاده شود.

TABLE_TOP — حالت لپ‌تاپ

دستگاه روی سطح با زاویه حدود ۱۲۰ درجه قرار دارد. نیمه پایینی صفحه به عنوان پنل لمسی یا صفحه کلید عمل می‌کند. حالت Touchpad در این وضعیت امکان شبیه‌سازی تاچ‌پد را در نیمه پایینی صفحه فراهم می‌کند.

تداوم صفحه در Android چگونه کار می‌کند؟

Android تغییر پیکربندی دستگاه تاشو را از طریق مکانیزم configuration changes پردازش می‌کند. هنگامی که کاربر گوشی را باز می‌کند، سیستم تغییر اندازه پنجره را ثبت کرده و چرخه استاندارد بازآفرینی Activity را آغاز می‌کند. Screen Continuity این فرآیند را رهگیری کرده و داده‌های کلیدی را ذخیره می‌کند.

روش اصلی برای ذخیره حالت onRetainNonConfigurationInstance است که قبل از نابودی Activity فراخوانی می‌شود. توسعه‌دهنده مدل داده، موقعیت لیست و صفحه ناوبری فعلی را در آن ذخیره می‌کند. پس از بازآفرینی، Activity این داده‌ها را از طریق getLastNonConfigurationInstance دریافت کرده و UI را دقیقاً تا لحظه بسته شدن بازیابی می‌کند.

برای Fragments این مکانیزم از طریق setRetainInstance(true) پیاده‌سازی می‌شود که از نابودی فرگمنت هنگام تغییر پیکربندی جلوگیری می‌کند. در Jetpack Compose از rememberSaveable استفاده می‌شود که به طور خودکار حالت را هنگام تغییر Window Metrics ذخیره می‌کند.

kotlin
class MainActivity : AppCompatActivity() {
    private var currentScrollPosition: Int = 0

    override fun onRetainNonConfigurationInstance(): Any {
        return SavedState(scrollPosition = currentScrollPosition)
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        val saved = lastNonConfigurationInstance as? SavedState
        saved?.let { currentScrollPosition = it.scrollPosition }
    }
}

API ScreenContinuity در Jetpack WindowManager

Jetpack WindowManager نسخه ۱٫۱+ شامل کلاس ScreenContinuityController است که مکانیزم‌های آماده برای مدیریت تداوم صفحه ارائه می‌دهد. API به طور خودکار تغییر حالت را پردازش کرده و از طریق رابط‌های callback به برنامه اطلاع می‌دهد.

ScreenContinuityController

کلاس مرکزی که شنوندگان تغییر حالت را ثبت می‌کند. registerContinuityListener یک callback دریافت می‌کند که در هر انتقال بین حالت‌های دستگاه تاشو فعال می‌شود. کنترلر همچنین اطلاعاتی درباره حالت فعلی از طریق متد getCurrentFoldingFeature ارائه می‌دهد.

FoldingFeatureAdapter

کلاس کاربردی برای تبدیل داده‌های FoldingFeature به حالت‌های قابل فهم برای برنامه. FoldingFeatureAdapter مختصات لولا را نرمال کرده و تعیین می‌کند که آیا حالت فعلی HALF_OPENED، FLAT یا TABLE_TOP است. این کار توسعه‌دهنده را از محاسبه دستی زاویه‌ها و مقادیر آستانه بی‌نیاز می‌کند.

ادغام با Jetpack Compose

برای برنامه‌های Compose، WindowManager WindowSizeClass و اصلاح‌کننده‌هایی که تاشو را در نظر می‌گیرند ارائه می‌دهد. کامپوننت BoxWithConstraints بدون بازآفرینی Activity با تغییر ابعاد صفحه در زمان واقعی سازگار می‌شود. Compose به طور خودکار هنگام تغییر WindowMetrics باعث بازترکیب می‌شود.

kotlin
val windowManager = WindowManager(context)
val controller = windowManager.screenContinuityController

controller.registerContinuityListener { feature: FoldingFeature ->
    when (feature.state) {
        FoldingFeature.State.HALF_OPENED -> enterTabletopMode()
        FoldingFeature.State.FLAT -> expandToTablet()
    }
}

نمونه پیاده‌سازی در Kotlin

بیایید یک نمونه کامل از Activity با پشتیبانی Screen Continuity را بررسی کنیم. MainActivity سه سناریو را پردازش می‌کند: بسته شدن، باز شدن و حالت نیمه‌باز. داده‌ها از طریق onRetainNonConfigurationInstance ذخیره شده و هنگام بازآفرینی بازیابی می‌شوند.

kotlin
class ContinuityActivity : AppCompatActivity() {
    private lateinit var binding: ActivityContinuityBinding
    private var itemList = mutableListOf<String>()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityContinuityBinding.inflate(layoutInflater)
        setContentView(binding.root)

        val savedState = lastNonConfigurationInstance as? ContinuityState
        if (savedState != null) {
            itemList.addAll(savedState.items)
            restoreUi(savedState)
        }
        setupWindowManager()
    }

    private fun setupWindowManager() {
        val controller = WindowManager(this).screenContinuityController
        controller.registerContinuityListener { feature ->
            updateLayoutForFeature(feature)
        }
    }

    private fun updateLayoutForFeature(feature: FoldingFeature) {
        when (feature.state) {
            FoldingFeature.State.HALF_OPENED -> binding.root.enableTabletopMode()
            FoldingFeature.State.FLAT -> binding.root.enableTabletMode()
            FoldingFeature.State.TABLE_TOP -> binding.root.enableTouchpadMode()
        }
    }

    override fun onRetainNonConfigurationInstance(): Any {
        return ContinuityState(itemList.toList(), binding.listView.firstVisiblePosition)
    }
}

data class ContinuityState(
    val items: List<String>,
    val scrollPosition: Int
)

عنصر کلیدی کلاس ContinuityState است که لیست عناصر و موقعیت پیمایش را ذخیره می‌کند. Activity آن را قبل از بازآفرینی ذخیره کرده و بلافاصله پس از فراخوانی onCreate بازیابی می‌کند. کنترلر WindowManager تغییرات حالت را دنبال کرده و طرح را بین حالت‌ها جابجا می‌کند.

تست تداوم روی شبیه‌ساز و دستگاه

Android Studio شبیه‌ساز دستگاه تاشو با پشتیبانی از هر سه حالت ارائه می‌دهد. برای تست Screen Continuity کافی است یک دستگاه مجازی از نوع Pixel Fold یا Samsung Galaxy Z Fold ایجاد کرده و حالت را از طریق پنل کنترل شبیه‌ساز تغییر دهید.

تنظیم شبیه‌ساز

یک AVD با رده Foldable ایجاد کرده و رزولوشن صفحه ۷٫۶ اینچی را انتخاب کنید. در کنترل‌های پیشرفته شبیه‌ساز تب Folding Postures را باز کرده و بین حالت‌ها جابجا شوید. هر جابجایی یک configuration change ایجاد می‌کند که باید به درستی توسط برنامه پردازش شود.

دستگاه فیزیکی

در دستگاه واقعی (Galaxy Z Fold 5, Pixel Fold) تست با باز کردن فیزیکی انجام می‌شود. حالت‌های Samsung DeX و Multi-Window نیز تداوم را فعال می‌کنند. برای اشکال‌زدایی از دستور ADB adb shell dumpsys window policy استفاده کنید که وضعیت فعلی تاشو را نمایش می‌دهد.

مشکلات رایج

خطاهای اصلی — از دست دادن حالت RecyclerView، بازنشانی متن در فیلدهای متنی و بسته شدن دیالوگ‌ها. ViewModel این مشکلات را با ذخیره داده‌ها در حافظه مستقل از چرخه حیات Activity حل می‌کند. همچنین مهم است که Activity را در مانیفست با پارامتر android:configChanges مشخص کنید اگر برنامه تغییرات را به صورت دستی پردازش می‌کند.

xml
<!-- AndroidManifest.xml -->
@android:configChanges="screenSize|smallestScreenSize|screenLayout|orientation"

سوالات متداول

Screen Continuity چه تفاوتی با ذخیره‌سازی معمولی حالت دارد؟

Screen Continuity حالت را هنگام تغییر فیزیکی اندازه صفحه ذخیره می‌کند، نه فقط هنگام چرخش. onSaveInstanceState معمولی حفظ حالت را هنگام تغییر وضعیت‌های دستگاه تاشو تضمین نمی‌کند، در حالی که ScreenContinuityController دقیقاً این سناریو را پردازش می‌کند.

کدام دستگاه‌های Android از Screen Continuity پشتیبانی می‌کنند؟

تمام دستگاه‌های تاشو با Android ۱۰+ و سرویس‌های Google Play. پشتیبانی در Pixel Fold، سری Galaxy Z Fold، Huawei Mate X، Oppo Find N و OnePlus Open گنجانده شده است. برای کار به Jetpack WindowManager نسخه ۱٫۱ و بالاتر نیاز است.

Screen Continuity چگونه با Jetpack Compose کار می‌کند؟

Jetpack Compose از Screen Continuity از طریق rememberSaveable و WindowSizeClass پشتیبانی می‌کند. ترکیب به طور خودکار به تغییر WindowMetrics واکنش نشان می‌دهد و rememberSaveable حالت را بین بازترکیب‌ها ذخیره می‌کند. اصلاح‌کننده onSizeChanged امکان ردیابی تغییر اندازه در زمان واقعی را فراهم می‌کند.

اگر Screen Continuity پیاده‌سازی نشود چه اتفاقی می‌افتد؟

هنگام باز یا بسته شدن دستگاه، Activity بدون ذخیره حالت بازآفرینی می‌شود. کاربر داده‌های وارد شده را از دست می‌دهد، پیمایش بازنشانی می‌شود و دیالوگ‌های باز بسته می‌شوند. این منجر به نظرات منفی و کاهش رتبه برنامه در Google Play می‌شود.

چگونه Screen Continuity را بدون دستگاه فیزیکی تست کنیم؟

Android Emulator از شبیه‌سازی دستگاه‌های تاشو پشتیبانی می‌کند. یک AVD از نوع Pixel Fold ایجاد کنید، Extended Controls را باز کنید و تب Folding Postures را انتخاب کنید. جابجایی بین حالت‌ها یک configuration change ایجاد می‌کند و امکان تست ذخیره حالت را بدون دستگاه فیزیکی فراهم می‌کند.

خلاصه

  • Screen Continuity — مکانیزم Android برای حفظ حالت Activity هنگام تغییر پیکربندی فیزیکی دستگاه تاشو.
  • Jetpack WindowManager ScreenContinuityController را برای ردیابی حالت‌های HALF_OPENED، FLAT و TABLE_TOP ارائه می‌دهد.
  • onRetainNonConfigurationInstance — روش اصلی برای ذخیره داده‌ها قبل از بازآفرینی Activity هنگام باز کردن.
  • ViewModel و rememberSaveable در Compose مشکل از دست رفتن حالت را بدون مدیریت دستی چرخه حیات حل می‌کنند.
  • شبیه‌ساز Android Studio امکان تست تمام حالت‌های دستگاه تاشو را بدون دستگاه فیزیکی فراهم می‌کند.
  • نادیده گرفتن Screen Continuity منجر به بازنشانی رابط کاربری و از دست رفتن داده‌های وارد شده هنگام بستن می‌شود.
  • توصیه می‌شود پشتیبانی از تداوم را به تمام برنامه‌های طراحی شده برای دستگاه‌های تاشو و تبلت‌ها اضافه کنید.

ما یک اپلیکیشن موبایل به صورت کلید در دست توسعه خواهیم داد

IT Sectr از سال 2017 برنامه‌های iOS و Android را برای استارتاپ‌ها و کسب‌وکارها ایجاد می‌کند. ما به شما مشاوره می‌دهیم و بهترین راه‌حل را پیشنهاد خواهیم کرد.

بحث درباره پروژه

همچنین بخوانید