এই পৃষ্ঠায় একাধিক ডিসপ্লেতে কাজ করার সাজেশন দেওয়া হয়েছে।
ফোল্ড করা যায় এমন এবং মাল্টি-স্ক্রিন ডিভাইসের জন্য অ্যাপ
সাধারণত, অ্যাপের স্ট্যাটিক শনাক্তকারী বা এমন কোনও লজিকের উপর নির্ভর করা উচিত নয় যা কিছু ডিসপ্লে আইডির উপর নির্ভর করে। বেশিরভাগ ক্ষেত্রে, অ্যাপের সাইজ পরিবর্তন করা উচিত এবং বিভিন্ন ডিসপ্লেতে কাজ করা উচিত এবং অ্যাপ কোথায় লোকেট করতে হবে তা সিস্টেমের কন্ট্রোল করা উচিত। যেমন, ফোল্ডেবল ডিভাইসের জন্য নতুন ও অনন্য অভিজ্ঞতা তৈরি করা এবং ডিভাইস ফোল্ড করা থাকলে এক্সটার্নাল স্ক্রিনে বিশেষ অ্যাপ লঞ্চ করা।
এই ক্ষেত্রে, সিস্টেম UI বা অন্য কোনও সিস্টেম কম্পোনেন্টকে ফোল্ড শনাক্ত করতে হবে, কোনও অ্যাকশন পারফর্ম করা উপযুক্ত কিনা তা নির্ধারণ করতে হবে এবং তারপরে টার্গেট অ্যাক্টিভিটি লঞ্চ করতে হবে এবং লঞ্চ টার্গেট হিসেবে এক্সটার্নাল ডিসপ্লে আইডি নির্দিষ্ট করতে হবে। অ্যাপের এই অ্যাকশন শনাক্ত করা বা এর উত্তরে কোনও অ্যাকশন পারফর্ম করা উচিত নয় এবং তারপর নির্দিষ্ট ডিসপ্লেতে লঞ্চ পারফর্ম করা উচিত। তাই, একটি ডিভাইসে যা কাজ করে তা অন্য ডিভাইসেও কাজ করবে বলে ধরে নেবেন না। সংক্ষেপে, ডিভাইস-নির্দিষ্ট কোড ফ্র্যাগমেন্টেশন বাড়ায়।
ডিসপ্লেতে অ্যাক্সেস সীমাবদ্ধ করা
ডিভাইস কনফিগারেশনের জন্য এক বা একাধিক
ডিসপ্লেতে অ্যাক্সেস সীমাবদ্ধ করার প্রয়োজন হলে, আমরা ডিসপ্লেকে ব্যক্তিগত হিসেবে চিহ্নিত করতে Display#FLAG_PRIVATE ফ্ল্যাগ
ব্যবহার করার সাজেশন দিই। এই পদমর্যাদা ডিসপ্লেতে কন্টেন্ট যোগ করার ক্ষেত্রে মালিক ছাড়া
সবাইকে সীমাবদ্ধ করে। মালিক ছাড়া অন্য কেউ কোনও
অ্যাক্টিভিটি লঞ্চ করার বা উইন্ডো যোগ করার চেষ্টা করলে, এটি SecurityException ট্রিগার করে।
ডিসপ্লে সিস্টেমের মালিকানাধীন হলে, সিস্টেম উইন্ডো যোগ করতে এবং অ্যাক্টিভিটি লঞ্চ করতে পারে।
এছাড়াও, কোনও ডিসপ্লেতে প্লেস করা এন্টিটি সবসময় সেই ডিসপ্লে অ্যাক্সেস করতে পারে। মালিক কোনও ডিসপ্লেতে অ্যাক্টিভিটি লঞ্চ করলে, সেই অ্যাক্টিভিটি এই ডিসপ্লেতে অন্যান্য অ্যাক্টিভিটি লঞ্চ করতে পারে। এর ফলে, অ্যাক্সেস সীমিত করা এবং শুধুমাত্র বিশ্বস্ত অ্যাপকে অনুমতি দেওয়ার দায়িত্ব মালিকের।
এছাড়াও, ভার্চুয়াল ডিসপ্লেতে আরও বিধিনিষেধ যোগ করা হয়েছে কারণ কোনও অ্যাপই ব্যবহারকারীকে না দেখিয়ে
সেটি তৈরি করতে পারে। ভার্চুয়াল ডিসপ্লে সিস্টেমের
মালিকানাধীন না হলে, শুধুমাত্র allowEmbedded
অ্যাক্টিভিটির অনুমতি দেওয়া হয় এবং কলারের কাছে ACTIVITY_EMBEDDING
অনুমতি থাকতে হবে।
আরও তথ্যের জন্য, দেখুন:
ActivityStackSupervisor#isCallerAllowedToLaunchOnDisplayActivityDisplay#isUidPresentDisplayManagerService#isUidPresentOnDisplay
কন্ডিশনাল অ্যাক্টিভিটি লঞ্চ কন্ট্রোল করতে, LaunchParamsController ব্যবহার করুন,
যা সমস্ত অ্যাক্টিভিটি লঞ্চ ইন্টারসেপ্ট করে এবং লঞ্চের জন্য ব্যবহৃত
প্যারামিটারকে সিস্টেম কম্পোনেন্ট পরিবর্তন করতে দেয়। এটি system_server-এ উপলভ্য।
ডিসপ্লে উইন্ডো সেটিংস ও সিস্টেম সজ্জা কনফিগার করা
DisplayWindowSettings-এ প্রতিটি ডিসপ্লের জন্য
সিস্টেম ডেকোরেশন কনফিগার করা যেতে পারে। ডিভাইস
ইমপ্লিমেন্টেশন
/data/system/display_settings.xml-এ ডিফল্ট কনফিগারেশন প্রদান করতে পারে।
সিস্টেমের সজ্জা (লঞ্চার, ওয়ালপেপার,
নেভিগেশন বার ও অন্যান্য সজ্জার উইন্ডো) এবং IME ডিসপ্লেতে দেখা যাবে কিনা তা এই ভ্যালু নির্ধারণ করে।
আরও বিবরণের জন্য, DisplayWindowSettings#shouldShowSystemDecorsLocked
এবং DisplayWindowSettings#shouldShowImeLocked দেখুন।
ডিসপ্লে শনাক্ত করতে, অনন্য আইডি (এটি ডিফল্ট হিসেবে
DisplayInfo#uniqueId) বা হার্ডওয়্যার
ডিসপ্লের জন্য ফিজিক্যাল পোর্ট আইডি (DisplayInfo#address দেখুন) ব্যবহার করুন।
যেমন, নিম্নলিখিত ডিসপ্লে কনফিগারেশনের উদাহরণে সিমুলেটেড ডিসপ্লেতে সিস্টেম ডেকোরেশন ও IME চালু করা হয়:
<?xml version='1.0' encoding='utf-8' standalone='yes' ?> <display-settings> <config identifier="0" /> <display name="overlay:1" shouldShowSystemDecors="true" shouldShowIme="true" /> </display-settings>
উপরের উদাহরণে, uniqueId ডিসপ্লে শনাক্তকরণের জন্য ব্যবহার করা হয়
নাম অ্যাট্রিবিউটে, যা সিমুলেটেড ডিসপ্লের জন্য overlay:1।
বিল্ট-ইন ডিসপ্লের জন্য, একটি স্যাম্পেল ভ্যালু "local:45354385242535243453" হতে পারে।
অন্য একটি বিকল্প হল হার্ডওয়্যার পোর্ট সংক্রান্ত তথ্য ব্যবহার করা এবং DisplayWindowSettings#IDENTIFIER_PORT-এর সাথে
মিল রেখে identifier="1" সেট করা এবং তারপরে "port:<port_id>" ফর্ম্যাট ব্যবহার করার জন্য
নাম আপডেট করা:
<?xmlversion='1.0' encoding='utf-8' standalone='yes' ?> <display-settings> <config identifier="1" /> <display name="port:12345" shouldShowSystemDecors="true" shouldShowIme="true" /> </display-settings>
আরও বিবরণের জন্য, স্ট্যাটিক ডিসপ্লে শনাক্তকারী দেখুন।
আরও তথ্যের জন্য, দেখুন:
মিররিং ও হোস্টিং টাস্কের মধ্যে ডিসপ্লে পরিবর্তন করা
Android 17 ও তার পরবর্তী যেকোনও ভার্সনে, রান টাইমে ডিসপ্লে মিররিং ও হোস্টিং টাস্কের মধ্যে
সুইচ করবে কিনা তা নিয়ন্ত্রণ করতে DisplayManager
FLAG_ALLOWS_CONTENT_MODE_SWITCH ফ্ল্যাগ ব্যবহার করা হয়। ডিফল্ট হিসেবে, এই ফ্ল্যাগ
এক্সটার্নাল ডিসপ্লের জন্য চালু এবং অন্যান্য সব ডিসপ্লের জন্য বন্ধ করা থাকে।
FLAG_ALLOWS_CONTENT_MODE_SWITCH উপস্থিত থাকলে, DisplayManager, টাস্ক মিরর বা হোস্ট করা হবে কিনা তা নির্ধারণ করতে
android.provider.Settings.Secure.MIRROR_BUILT_IN_DISPLAY সুরক্ষিত সেটিং
মনিটর করে। এটি ডিফল্ট লজিক হলেও,
OEM এই আচরণ কাস্টমাইজ করতে পারে।
টপোলজি ও পয়েন্টার মুভমেন্ট ডিসপ্লে করা
Android 17 ও তার পরবর্তী যেকোনও ভার্সনে, ডিসপ্লে টপোলজি ডিসপ্লেগুলির আপেক্ষিক পজিশন নির্ধারণ করে এবং টপোলজিতে থাকা নির্দিষ্ট সেট ডিসপ্লেতে মাউস পয়েন্টারের মুভমেন্ট সীমাবদ্ধ করে।
WindowManager টপোলজিতে ডিসপ্লে অন্তর্ভুক্ত করার সিদ্ধান্ত নেয় এবং
DisplayManagerInternal.onDisplayBelongToTopologyChanged-কে কল করে। DisplayManager
ডিসপ্লে যোগ করার আগে DisplayTopologyCoordinator.isDisplayAllowedInTopology
চেক করে। ডিফল্ট হিসেবে, লোকাল ডিসপ্লে টাস্ক হোস্ট করতে পারলে, সিস্টেম সেগুলি যোগ করে দেয়।
একাধিক পাবলিক ডিসপ্লে থাকলে যেগুলি টাস্ক হোস্ট করতে পারে, ডিফল্ট ডিসপ্লে অন্তর্ভুক্ত করার সিদ্ধান্ত
shouldIncludeDefaultDisplayInTopology বুলিয়ান প্রোভাইডার দ্বারা পরিচালিত হয় যা
DisplayTopologyCoordinator-এ পাস করা হয়। টাস্ক হোস্ট করতে পারে এমন একমাত্র পাবলিক ডিসপ্লে যদি ডিফল্ট ডিসপ্লে হয়, তাহলে এটি সবসময় টপোলজিতে থাকে। AOSP-তে, ডিফল্ট ডিসপ্লেতে ডেস্কটপ উইন্ডোইং কাজ করলে
অথবা নিরাপদ সেটিং Settings.Secure.INCLUDE_DEFAULT_DISPLAY_IN_TOPOLOGY
true হলে, তবেই boolean
প্রোভাইডার true রিটার্ন করে।
DisplayManager.getDisplayTopology ব্যবহার করে অ্যাপ বর্তমান টপোলজি কোয়েরি করে এবং
DisplayManager.registerTopologyListener-এর সাথে লিসনার রেজিস্টার করে টপোলজিতে হওয়া পরিবর্তন সম্পর্কে
প্রতিক্রিয়া জানায়।