Screen Continuity — ایک اینڈرائیڈ میکانزم ہے جو فولڈایبل ڈیوائس کی موڑی ہوئی اور کھلی ہوئی حالتوں کے درمیان ایپ کا بلا تعطل منتقلی یقینی بناتا ہے۔ کھولنے پر اسکرین اپنے طبعی ابعاد تبدیل کرتی ہے اور سسٹم نئی تشکیلات کے ساتھ Activity کو دوبارہ شروع کرتا ہے۔ Google Developer, 2025 کے مطابق، تسلسل کی صحیح پروسیسنگ صارف کے تجربے کو 40% بہتر بناتی ہے اور حالت کھونے کی شکایات کو کم کرتی ہے۔ ScreenContinuity API Jetpack WindowManager کا حصہ ہے جو ورژن 1.1 سے شروع ہوتی ہے اور ڈویلپر کو ڈیوائس کی پوزچر تبدیل ہونے پر لائف سائیکل منظم کرنے کی اجازت دیتی ہے۔
اہم نکات
Screen Continuity ایک اینڈرائیڈ میکانزم ہے جو فولڈایبل ڈیوائسز پر اسکرین کی طبعی تشکیل تبدیل ہونے پر Activity حالت محفوظ رکھتا ہے۔ جب صارف فون کھولتا یا موڑتا ہے، سسٹم نئی ونڈو جہتوں کے ساتھ Activity کو دوبارہ شروع کر سکتا ہے۔ تسلسل داخل کردہ ڈیٹا، اسکرول پوزیشن اور موجودہ اسکرین کے ضیاع کو روکتا ہے۔
عام اسکرین گردش کے برعکس جہاں اینڈرائیڈ صرف نئی سمت کے ساتھ Activity کو دوبارہ بناتا ہے، فولڈایبل ڈیوائسز بنیادی طور پر نئے منظرنامے متعارف کراتی ہیں۔ HALF_OPENED پوزچر ایپ کو آدھی اسکرین پر کام کرنے دیتی ہے، جبکہ FLAT مکمل طور پر کھلے ٹیبلٹ موڈ میں کام کرتی ہے۔ Screen Continuity سپورٹ کے بغیر، ہر پوزچر تبدیلی انٹرفیس کو اس کی ابتدائی حالت پر ری سیٹ کر دیتی ہے۔
Google I/O 2024 کے مطابق، 62% سے زیادہ فولڈایبل ڈیوائس صارفین نے ایسی ایپس دیکھی ہیں جو حالت کی تبدیلی کو غلط طریقے سے ہینڈل کرتی ہیں۔ Screen Continuity API سطح پر اس مسئلے کو حل کرتا ہے، ڈویلپر کو UI کو محفوظ اور بحال کرنے کے لیے تیار آلات فراہم کرتا ہے۔
Jetpack WindowManager FoldingFeature کلاس کے ذریعے فولڈایبل ڈیوائسز کے لیے تین بنیادی پوزچرز کی وضاحت کرتا ہے۔ ہر پوزچر قبضے کی ایک مخصوص طبعی پوزیشن سے مطابقت رکھتا ہے اور خصوصی انٹرفیس ہینڈلنگ کی ضرورت ہوتی ہے۔
ڈیوائس 30 سے 160 ڈگری کے زاویے پر ہوتی ہے۔ اسکرین دو منطقی حصوں میں تقسیم ہوتی ہے۔ ایپ اوپری حصے میں مواد اور نچلے حصے میں کنٹرول دکھا سکتی ہے۔ ویڈیو کالز اور میڈیا پلیئرز کے لیے ٹیبل ٹاپ موڈ اس پوزچر کو استعمال کرتا ہے۔
ڈیوائس 180 ڈگری پر کھلی ہوتی ہے، ایک بڑی اسکرین بناتی ہے۔ ایپ وسیع کام کی جگہ کے ساتھ ٹیبلٹ موڈ میں تبدیل ہو جاتی ہے۔ اس پوزچر میں، نیویگیشن پینل اور تفصیلی مواد کے ساتھ ملٹی پین لے آؤٹ دکھانے کی سفارش کی جاتی ہے۔
ڈیوائس تقریباً 120 ڈگری کے زاویے پر سطح پر کھڑی ہوتی ہے۔ اسکرین کا نچلا آدھا حصہ ٹچ پینل یا کی بورڈ کے طور پر کام کرتا ہے۔ اس پوزچر میں ٹچ پیڈ موڈ اسکرین کے نچلے حصے پر ٹریک پیڈ کا تخیل کرنے کی اجازت دیتا ہے۔
اینڈرائیڈ فولڈایبل ڈیوائس تشکیل کی تبدیلیوں کو configuration changes میکانزم کے ذریعے ہینڈل کرتا ہے۔ جب صارف فون کھولتا ہے، سسٹم ونڈو کے سائز کی تبدیلی کا پتہ لگاتا ہے اور معیاری Activity دوبارہ تخلیق سائیکل شروع کرتا ہے۔ Screen Continuity اس عمل کو روکتا ہے اور اہم ڈیٹا محفوظ کرتا ہے۔
حالت محفوظ کرنے کا اہم طریقہ onRetainNonConfigurationInstance ہے، جو Activity کو تباہ کرنے سے پہلے بلایا جاتا ہے۔ ڈویلپر اس میں ڈیٹا ماڈل، فہرست کی پوزیشن اور موجودہ نیویگیشن اسکرین محفوظ کرتا ہے۔ دوبارہ تخلیق کے بعد، Activity getLastNonConfigurationInstance کے ذریعے یہ ڈیٹا حاصل کرتی ہے اور UI کو بالکل موڑنے سے پہلے جیسی بحال کرتی ہے۔
Fragments کے لیے، میکانزم setRetainInstance(true) کے ذریعے لاگو کیا جاتا ہے، جو تشکیل کی تبدیلیوں پر fragment کو تباہ ہونے سے روکتا ہے۔ Jetpack Compose میں rememberSaveable استعمال ہوتا ہے، جو Window Metrics تبدیل ہونے پر خود بخود حالت محفوظ کرتا ہے۔
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 }
}
}
Jetpack WindowManager ورژن 1.1+ میں ScreenContinuityController کلاس شامل ہے، جو اسکرین تسلسل کو منظم کرنے کے لیے تیار میکانزم فراہم کرتی ہے۔ API خود بخود پوزچر تبدیلیوں کو ہینڈل کرتا ہے اور کال بیک انٹرفیس کے ذریعے ایپ کو مطلع کرتا ہے۔
مرکزی کلاس جو پوزچر تبدیلی سننے والوں کو رجسٹر کرتی ہے۔ registerContinuityListener ایک کال بیک قبول کرتا ہے جو فولڈایبل ڈیوائس حالتوں کے درمیان ہر منتقلی پر چالو ہوتا ہے۔ کنٹرولر getCurrentFoldingFeature طریقہ کے ذریعے موجودہ پوزچر کے بارے میں معلومات بھی فراہم کرتا ہے۔
FoldingFeature ڈیٹا کو ایپ کے لیے قابل مطالعہ حالتوں میں تبدیل کرنے کے لیے ایک افادیتی کلاس۔ FoldingFeatureAdapter قبضے کے کوآرڈینیٹ کو معمول بناتا ہے اور تعین کرتا ہے کہ موجودہ پوزچر HALF_OPENED، FLAT یا TABLE_TOP ہے۔ یہ ڈویلپر کو دستی زاویہ اور حد کی گنتی سے بچاتا ہے۔
Compose ایپس کے لیے، WindowManager WindowSizeClass اور موڈیفائر فراہم کرتا ہے جو موڑ کو مدنظر رکھتے ہیں۔ BoxWithConstraints جزو Activity کی دوبارہ تخلیق کے بغیر حقیقی وقت میں اسکرین کے سائز کی تبدیلیوں کے مطابق ڈھل جاتا ہے۔ Compose خود بخود WindowMetrics تبدیل ہونے پر دوبارہ تشکیل کو متحرک کرتا ہے۔
val windowManager = WindowManager(context)
val controller = windowManager.screenContinuityController
controller.registerContinuityListener { feature: FoldingFeature ->
when (feature.state) {
FoldingFeature.State.HALF_OPENED -> enterTabletopMode()
FoldingFeature.State.FLAT -> expandToTablet()
}
}
Screen Continuity سپورٹ کے ساتھ ایک مکمل Activity مثال دیکھتے ہیں۔ MainActivity تین منظرناموں کو ہینڈل کرتا ہے: موڑنا، کھولنا اور آدھی موڑی ہوئی حالت۔ ڈیٹا onRetainNonConfigurationInstance کے ذریعے محفوظ کیا جاتا ہے اور دوبارہ تخلیق پر بحال کیا جاتا ہے۔
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 قسم کا ایک ورچوئل ڈیوائس بنائیں اور ایمولیٹر کنٹرول پینل کے ذریعے پوزچرز تبدیل کریں۔
Foldable زمرے کے ساتھ AVD بنائیں اور 7.6 انچ اسکرین ریزولوشن منتخب کریں۔ ایمولیٹر کے توسیعی کنٹرولز میں، 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 پیرامیٹر کے ساتھ تشریح کرنا بھی اہم ہے۔
<!-- AndroidManifest.xml -->
@android:configChanges="screenSize|smallestScreenSize|screenLayout|orientation"
اکثر پوچھے گئے سوالات
Screen Continuity صرف گردش کے دوران نہیں بلکہ اسکرین کے سائز کی طبعی تبدیلیوں کے دوران حالت محفوظ کرتا ہے۔ عام onSaveInstanceState فولڈایبل ڈیوائس پوزچرز تبدیل کرتے وقت حالت کے تحفظ کی ضمانت نہیں دیتا، جبکہ ScreenContinuityController اس مخصوص منظر نامے کو ہینڈل کرتا ہے۔
Android 10+ اور Google Play Services والے تمام فولڈایبل ڈیوائسز۔ سپورٹ Pixel Fold، Galaxy Z Fold سیریز، Huawei Mate X، Oppo Find N اور OnePlus Open میں شامل ہے۔ Jetpack WindowManager ورژن 1.1 یا اس سے اوپر درکار ہے۔
Jetpack Compose rememberSaveable اور WindowSizeClass کے ذریعے Screen Continuity کو سپورٹ کرتا ہے۔ ترکیب خود بخود WindowMetrics تبدیلیوں کا جواب دیتی ہے، اور rememberSaveable دوبارہ تشکیل کے درمیان حالت محفوظ رکھتا ہے۔ onSizeChanged موڈیفائر حقیقی وقت میں سائز کی تبدیلیوں کو ٹریک کرنے کی اجازت دیتا ہے۔
جب ڈیوائس کھولی یا موڑی جاتی ہے، Activity حالت محفوظ کیے بغیر دوبارہ بنائی جاتی ہے۔ صارف داخل کردہ ڈیٹا کھو دیتا ہے، اسکرول ری سیٹ ہو جاتا ہے اور کھلے ہوئے ڈائیلاگ بند ہو جاتے ہیں۔ اس سے Google Play پر منفی جائزے اور ایپ کی درجہ بندی میں کمی آتی ہے۔
Android Emulator فولڈایبل ڈیوائس سمولیشن کو سپورٹ کرتا ہے۔ Pixel Fold قسم کا AVD بنائیں، Extended Controls کھولیں اور Folding Postures ٹیب منتخب کریں۔ پوزچرز تبدیل کرنے سے configuration change متحرک ہوتا ہے، جس سے طبعی ڈیوائس کے بغیر حالت کے تحفظ کی جانچ ممکن ہوتی ہے۔
خلاصہ
ہم ایک موبائل ایپلیکیشن ٹرنکی تیار کریں گے
IT Sectr 2017 سے اسٹارٹ اپس اور کاروبار کے لیے iOS اور Android ایپلیکیشنز بناتا ہے۔ ہم آپ کو مشورہ دیں گے اور بہترین حل تجویز کریں گے۔
مزید پڑھیں