কানেক্টেড ডিসপ্লেগুলো সাধারণ ফোনেও ডেস্কটপ উইন্ডো ব্যবহারের অভিজ্ঞতা দেয়, যার ফলে ব্যবহারকারীরা তাদের মোবাইল ডিভাইস থেকেই বড় স্ক্রিন ব্যবহারের সুযোগ পান। এই সক্ষমতা অ্যাপের সাথে মিথস্ক্রিয়া এবং ব্যবহারকারীর কর্মদক্ষতার ক্ষেত্রে নতুন সম্ভাবনার দ্বার উন্মোচন করে।
ডেস্কটপ উইন্ডোইং-এর সমস্ত স্বতন্ত্র বৈশিষ্ট্য সংযুক্ত ডিসপ্লেগুলোর ক্ষেত্রেও প্রযোজ্য। যখন আপনি একটি ফোনকে কোনো ডিসপ্লের সাথে সংযুক্ত করেন, তখন ফোনটির অবস্থা অপরিবর্তিত থাকে এবং সংযুক্ত ডিসপ্লেটিতে একটি খালি ডেস্কটপ সেশন চালু হয়। ডিভাইস এবং ডিসপ্লে দুটি পৃথক সিস্টেম হিসেবে কাজ করে, এবং প্রতিটি ডিসপ্লের জন্য নিজস্ব অ্যাপ থাকে।
আপনি যদি ট্যাবলেটের মতো ডেস্কটপ উইন্ডোইং-সক্ষম কোনো ডিভাইসকে একটি এক্সটার্নাল মনিটরের সাথে সংযুক্ত করেন, তাহলে ডেস্কটপ সেশনটি উভয় ডিসপ্লে জুড়ে বিস্তৃত হয়। তখন ডিসপ্লে দুটি একটি অবিচ্ছিন্ন সিস্টেম হিসেবে কাজ করে। এই ব্যবস্থাটি উইন্ডো, কন্টেন্ট এবং কার্সারকে ডিসপ্লে দুটির মধ্যে অবাধে চলাচল করতে দেয়।
সংযুক্ত ডিসপ্লেগুলোকে কার্যকরভাবে সমর্থন করার জন্য আপনার অ্যাপের ডিজাইন ও বাস্তবায়নের বিভিন্ন দিকের প্রতি মনোযোগ দেওয়া প্রয়োজন। নিম্নলিখিত সর্বোত্তম অনুশীলনগুলো একটি মসৃণ ও ফলপ্রসূ ব্যবহারকারীর অভিজ্ঞতা নিশ্চিত করে।
গতিশীল ডিসপ্লে পরিবর্তনগুলি পরিচালনা করুন
অনেক অ্যাপ এই ধারণার উপর ভিত্তি করে তৈরি করা হয় যে, অ্যাপটির জীবনচক্র চলাকালীন Display অবজেক্ট এবং এর বৈশিষ্ট্যগুলো অপরিবর্তিত থাকবে। তবে, যখন কোনো ব্যবহারকারী একটি এক্সটার্নাল মনিটর সংযোগ বা বিচ্ছিন্ন করেন, অথবা এমনকি একটি অ্যাপ উইন্ডোকে বিভিন্ন ডিসপ্লের মধ্যে স্থানান্তর করেন, তখন আপনার অ্যাপের কনটেক্সট বা উইন্ডোর সাথে যুক্ত অন্তর্নিহিত Display অবজেক্টটি পরিবর্তিত হতে পারে। ডিসপ্লের প্রোপার্টিগুলো, যেমন সাইজ, রেজোলিউশন, রিফ্রেশ রেট, HDR সাপোর্ট এবং ডেনসিটি, সবই ভিন্ন হতে পারে। উদাহরণস্বরূপ, আপনি যদি ফোনের স্ক্রিনের উপর ভিত্তি করে ভ্যালুগুলো হার্ডকোড করেন, তাহলে আপনার লেআউটগুলো সম্ভবত এক্সটার্নাল ডিসপ্লেতে ভেঙে যাবে।
বাহ্যিক ডিসপ্লেগুলোর পিক্সেল ডেনসিটিও ব্যাপকভাবে ভিন্ন হতে পারে। আপনাকে নিশ্চিত করতে হবে যেন আপনার অ্যাপ ডেনসিটির পরিবর্তনে সঠিকভাবে সাড়া দেয়। এর জন্য লেআউটের জন্য ডেনসিটি-নিরপেক্ষ পিক্সেল (dp) ব্যবহার করা, ডেনসিটি-নির্দিষ্ট রিসোর্স সরবরাহ করা এবং আপনার UI যেন যথাযথভাবে স্কেল হয় তা নিশ্চিত করতে হবে।
যদি কোনো অ্যাক্টিভিটি এক্সটার্নাল ডিসপ্লেতে চলার সময় ডিসপ্লেটি সংযোগ বিচ্ছিন্ন হয়ে যায়, তাহলে সিস্টেম অ্যাক্টিভিটিটিকে প্রাইমারি ডিসপ্লেতে সরিয়ে দেয়। এই স্থানান্তরের ফলে স্ক্রিনের আকার এবং ডেনসিটির মতো কনফিগারেশনে পরিবর্তন আসে, যার কারণে অ্যাক্টিভিটিটি পুনরায় তৈরি হতে পারে। ডেটা নষ্ট হওয়া বা ব্যবহারকারীর জন্য বিভ্রান্তিকর অভিজ্ঞতা এড়াতে আপনার অ্যাপকে অবশ্যই UI স্টেট সেভ এবং রিস্টোর করার মাধ্যমে এই কনফিগারেশন পরিবর্তনটি সামাল দিতে হবে।
সঠিক প্রেক্ষাপট ব্যবহার করুন
একাধিক ডিসপ্লেযুক্ত পরিবেশে সঠিক কনটেক্সট ব্যবহার করা অত্যন্ত গুরুত্বপূর্ণ। রিসোর্স অ্যাক্সেস করার সময়, অ্যাক্টিভিটি কনটেক্সট (যা প্রদর্শিত হয়) অ্যাপ্লিকেশন কনটেক্সট (যা প্রদর্শিত হয় না) থেকে ভিন্ন হয়।
অ্যাক্টিভিটি কনটেক্সটে ডিসপ্লে সম্পর্কিত তথ্য থাকে এবং অ্যাক্টিভিটিটি যে ডিসপ্লে এরিয়াতে প্রদর্শিত হয়, তার জন্য এটি সর্বদা সামঞ্জস্য করা থাকে। এর ফলে আপনি আপনার অ্যাপের ডিসপ্লে ডেনসিটি বা উইন্ডো মেট্রিক্স সম্পর্কে সঠিক তথ্য পেতে পারেন। বর্তমান উইন্ডো বা ডিসপ্লে সম্পর্কে তথ্য পেতে সর্বদা অ্যাক্টিভিটি কনটেক্সট (বা অন্য কোনো UI-ভিত্তিক কনটেক্সট) ব্যবহার করুন। এটি এমন কিছু সিস্টেম API-কেও প্রভাবিত করে, যেগুলো কনটেক্সট থেকে তথ্য ব্যবহার করে।
Jetpack Compose-এ, আপনি LocalConfiguration.current এবং LocalDensity.current মতো CompositionLocal অবজেক্ট ব্যবহার করে ডিসপ্লে-নির্দিষ্ট তথ্য অ্যাক্সেস করতে পারেন। যখন কোনো অ্যাক্টিভিটি বা উইন্ডো এক ডিসপ্লে থেকে অন্য ডিসপ্লেতে স্থানান্তরিত হয়, তখন ডিভাইসের কনফিগারেশন পরিবর্তিত হয়, যা নতুন ডিসপ্লে মেট্রিক্স সহ রিকম্পোজিশন শুরু করে। CompositionLocal অবজেক্ট আপনার UI-কে নির্বিঘ্নে মানিয়ে নিতে সক্ষম করে।
ডিসপ্লে তথ্য পান
আপনি ডিসপ্লে সাইজ, ডেনসিটি বা ফ্ল্যাগের মতো তথ্য পেতে Display ক্লাসটি ব্যবহার করতে পারেন। উপলব্ধ ডিসপ্লেগুলো পেতে DisplayManager সিস্টেম সার্ভিসটি ব্যবহার করুন। এক্সটার্নাল ডিসপ্লে শনাক্ত করতে, Display.DEFAULT_DISPLAY ফিল্টার করে বাদ দিন, যা সাধারণত ফোন বা ট্যাবলেটের বিল্ট-ইন স্ক্রিন হয়ে থাকে।
val displayManager = getSystemService(Context.DISPLAY_SERVICE) as DisplayManager val displays = displayManager.getDisplays() // The default display is 0. External displays have other IDs. val externalDisplays = displays.filter { it.displayId != Display.DEFAULT_DISPLAY }
অ্যাক্টিভিটি লঞ্চ এবং কনফিগারেশন পরিচালনা করুন
কানেক্টেড ডিসপ্লে-এর মাধ্যমে, অ্যাপগুলো নির্দিষ্ট করে দিতে পারে যে চালু হওয়ার সময় বা অন্য কোনো অ্যাক্টিভিটি তৈরি করার সময় অ্যাপটি কোন ডিসপ্লেতে চলবে। এই আচরণটি ম্যানিফেস্ট ফাইলে সংজ্ঞায়িত অ্যাক্টিভিটি লঞ্চ মোড এবং অ্যাক্টিভিটিটি চালুকারী এনটিটি দ্বারা সেট করা ইনটেন্ট ফ্ল্যাগ ও অপশনগুলোর উপর নির্ভর করে।
যখন কোনো অ্যাক্টিভিটি একটি সেকেন্ডারি ডিসপ্লেতে স্থানান্তরিত হয়, তখন আপনার অ্যাপে কনটেক্সট আপডেট, উইন্ডোর আকার পরিবর্তন এবং কনফিগারেশন ও রিসোর্সের পরিবর্তন ঘটতে পারে। যদি অ্যাক্টিভিটিটি কনফিগারেশন পরিবর্তনটি পরিচালনা করে, তবে তাকে onConfigurationChanged() ফাংশনে জানানো হয়। অন্যথায়, অ্যাক্টিভিটিটি পুনরায় চালু করা হয়।
যদি কোনো অ্যাক্টিভিটির জন্য নির্বাচিত লঞ্চ মোড একাধিক ইনস্ট্যান্সের অনুমতি দেয়, তবে একটি সেকেন্ডারি স্ক্রিনে সেটি চালু করলে অ্যাক্টিভিটিটির একটি নতুন ইনস্ট্যান্স তৈরি হতে পারে। উভয় অ্যাক্টিভিটি একই সময়ে পুনরায় চালু হয়, যা নির্দিষ্ট মাল্টিটাস্কিং পরিস্থিতিতে সুবিধাজনক হতে পারে।
আপনি ActivityOptions ব্যবহার করে একটি নির্দিষ্ট ডিসপ্লেতে অ্যাক্টিভিটি চালু করতে পারেন। মনে রাখবেন যে, launchDisplayId জন্য Android 8 (API level 26) বা তার উচ্চতর সংস্করণ প্রয়োজন।
// Get DisplayManager and find the first external display. val displayManager = getSystemService(Context.DISPLAY_SERVICE) as DisplayManager val externalDisplayId = displayManager.displays .firstOrNull { it.displayId != Display.DEFAULT_DISPLAY } ?.displayId // If an external display is found, launch the activity on it. if (externalDisplayId != null) { val intent = Intent(this, MySecondaryActivity::class.java) val options = ActivityOptions.makeBasic() if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { options.launchDisplayId = externalDisplayId } startActivity(intent, options.toBundle()) } else { // Optionally, handle the case where no external display is connected. }
ডিভাইস অনুমোদিত তালিকা এড়িয়ে চলুন
অ্যাপগুলো কখনও কখনও একটি অ্যালাওলিস্টের মাধ্যমে অথবা BUILD.MODEL এবং বিল্ট-ইন ডিসপ্লে সাইজ যাচাই করে নির্দিষ্ট কিছু ডিভাইসের জন্য বড় স্ক্রিনের UI ও ফিচারগুলো সীমাবদ্ধ করে দেয়। কানেক্টেড ডিসপ্লের ক্ষেত্রে এই পদ্ধতিটি কার্যকর নয়, কারণ কার্যত যেকোনো ডিভাইসকেই একটি বড় স্ক্রিনের সাথে সংযুক্ত করা যায় এবং একটি এক্সটার্নাল ডিসপ্লে সংযুক্ত করা হলেও ডিভাইসের মডেল পরিবর্তিত হয় না।
অ্যালাওলিস্ট ব্যবহার করা বা BUILD.MODEL এবং বিল্ট-ইন ডিসপ্লে সাইজ চেক করার পরিবর্তে, UI সংক্রান্ত সিদ্ধান্ত নেওয়ার জন্য রানটাইমে উইন্ডো মেট্রিক্স বা ডিভাইস ক্যাপাবিলিটিজ চেক করুন। বিভিন্ন স্ক্রিন সাইজ এবং ডেনসিটির জন্য রেসপন্সিভ ও অ্যাডাপ্টিভ লেআউট তৈরি করতে Jetpack WindowManager API বা উইন্ডো সাইজ ক্লাস ব্যবহার করুন।
বাহ্যিক পেরিফেরাল সমর্থন করুন
যখন ব্যবহারকারীরা কোনো এক্সটার্নাল ডিসপ্লেতে সংযোগ স্থাপন করেন, তখন তারা প্রায়শই একটি ডেস্কটপের মতো পরিবেশ তৈরি করেন। এর জন্য প্রায়শই এক্সটার্নাল কিবোর্ড, মাউস, ট্র্যাকপ্যাড, ওয়েবক্যাম, মাইক্রোফোন এবং স্পিকার ব্যবহার করতে হয়। আপনাকে নিশ্চিত করতে হবে যে আপনার অ্যাপটি এই পেরিফেরালগুলোর সাথে নির্বিঘ্নে কাজ করে। এর মধ্যে রয়েছে কিবোর্ড শর্টকাট পরিচালনা করা, মাউস পয়েন্টারের কার্যকলাপ নিয়ন্ত্রণ করা, এক্সটার্নাল ক্যামেরা বা মাইক্রোফোনকে সঠিকভাবে সাপোর্ট করা এবং অডিও আউটপুট রাউটিং মেনে চলা। আরও বিস্তারিত জানতে, ‘বড় স্ক্রিনে ইনপুট সামঞ্জস্যতা’ দেখুন।
ব্যবহারকারীর উৎপাদনশীলতা বৃদ্ধি করুন
কানেক্টেড ডিসপ্লে ব্যবহারকারীর কর্মদক্ষতা বাড়ানোর একটি গুরুত্বপূর্ণ সুযোগ তৈরি করে। ডেস্কটপ অ্যাপ্লিকেশনের সমতুল্য অভিজ্ঞতা দিতে পারে এমন মোবাইল অ্যাপ তৈরি করার সরঞ্জাম এখন আপনার হাতে রয়েছে। ব্যবহারকারীর কর্মদক্ষতা বাড়াতে নিম্নলিখিত বৈশিষ্ট্যগুলো প্রয়োগ করার কথা বিবেচনা করুন:
- ব্যবহারকারীদের একই অ্যাপের একাধিক সংস্করণ খোলার অনুমতি দিন। নথি তুলনা করা, বিভিন্ন কথোপকথন পরিচালনা করা বা একই সাথে একাধিক ফাইল দেখার মতো কাজের জন্য এটি অত্যন্ত সহায়ক।
- ড্র্যাগ অ্যান্ড ড্রপের মাধ্যমে ব্যবহারকারীদের আপনার অ্যাপের ভেতরে ও বাইরে বিস্তারিত ডেটা শেয়ার করার সুবিধা দিন।
- একটি শক্তিশালী স্টেট ম্যানেজমেন্ট সিস্টেম বাস্তবায়নের মাধ্যমে কনফিগারেশন পরিবর্তনের পরেও ব্যবহারকারীদের কর্মপ্রবাহ বজায় রাখতে সাহায্য করুন।
এই নির্দেশিকাগুলো অনুসরণ করে এবং প্রদত্ত কোড উদাহরণগুলো ব্যবহার করে, আপনি এমন অ্যাপ তৈরি করতে পারেন যা সংযুক্ত ডিসপ্লেগুলোর সাথে নির্বিঘ্নে খাপ খাইয়ে নেয় এবং ব্যবহারকারীদের আরও সমৃদ্ধ ও ফলপ্রসূ অভিজ্ঞতা প্রদান করে।