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 স্বয়ংক্রিয়ভাবে পোশ্চার পরিবর্তনগুলি হ্যান্ডল করে এবং callback ইন্টারফেসের মাধ্যমে অ্যাপকে অবহিত করে।
কেন্দ্রীয় ক্লাস যা পোশ্চার পরিবর্তন শ্রোতাদের নিবন্ধন করে। registerContinuityListener একটি callback গ্রহণ করে যা ফোল্ডেবল ডিভাইস অবস্থার মধ্যে প্রতিটি পরিবর্তনে সক্রিয় হয়। কন্ট্রোলার 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 অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।
আরও পড়ুন