প্রস্তাবিত অভ্যাস

ভাঁজযোগ্য এবং মাল্টি-স্ক্রিন ডিভাইসের জন্য অ্যাপ

সাধারণত, কিছু ডিসপ্লে আইডির উপর নির্ভর করে এমন স্থির শনাক্তকারী বা যুক্তির উপর অ্যাপগুলির নির্ভর করা উচিত নয়। বেশিরভাগ ক্ষেত্রে, অ্যাপগুলির আকার পরিবর্তন করা উচিত এবং বিভিন্ন ডিসপ্লেতে কাজ করা উচিত এবং অ্যাপগুলি কোথায় সনাক্ত করতে হবে তা সিস্টেমের নিয়ন্ত্রণ করা উচিত। উদাহরণস্বরূপ, ভাঁজ করা যায় এমন ডিভাইসগুলির জন্য একটি নতুন এবং অনন্য অভিজ্ঞতা তৈরি করতে এবং ডিভাইসটি ভাঁজ করার সময় বাহ্যিক স্ক্রিনে একটি বিশেষ অ্যাপ চালু করুন।

এই ক্ষেত্রে, SystemUI (বা অন্য সিস্টেমের উপাদান) ভাঁজ সনাক্ত করা উচিত, এটি একটি ক্রিয়া সম্পাদনের জন্য উপযুক্ত কিনা তা নির্ধারণ করুন এবং তারপর লক্ষ্য কার্যকলাপ চালু করুন এবং লঞ্চ লক্ষ্য হিসাবে একটি বহিরাগত প্রদর্শন আইডি নির্দিষ্ট করুন। অ্যাপ্লিকেশানগুলি এই ক্রিয়াটি সনাক্ত করবে না বা প্রতিক্রিয়া হিসাবে কোনও ক্রিয়া সম্পাদন করবে না এবং তারপর একটি নির্দিষ্ট প্রদর্শনে লঞ্চটি সম্পাদন করবে৷ অন্য কথায়, অনুমান করবেন না যে একটি ডিভাইসে যা কাজ করে তা অন্য ডিভাইসে কাজ করবে। সংক্ষেপে, ডিভাইস-নির্দিষ্ট কোড ফ্র্যাগমেন্টেশন বাড়ায়।

প্রদর্শনগুলিতে অ্যাক্সেস সীমাবদ্ধ করুন

যদি ডিভাইস কনফিগারেশনের জন্য এক বা একাধিক ডিসপ্লেতে অ্যাক্সেসের সীমাবদ্ধতার প্রয়োজন হয়, তাহলে Display#FLAG_PRIVATE পতাকা ব্যবহার করার পরামর্শ হল এই ধরনের ডিসপ্লেগুলিকে ব্যক্তিগত হিসাবে চিহ্নিত করতে৷ এটি করার ফলে মালিক ব্যতীত সকলকে প্রদর্শনে সামগ্রী যোগ করা থেকে সীমাবদ্ধ করে। মালিক ব্যতীত অন্য কারো দ্বারা একটি ক্রিয়াকলাপ চালু করার বা একটি উইন্ডো যুক্ত করার যেকোন প্রচেষ্টা একটি SecurityException হিসাবে পরিণত হয়৷ যদি সিস্টেমটি ডিসপ্লের মালিক হয়, তাহলে সিস্টেম উইন্ডোজ যোগ করতে এবং কার্যক্রম চালু করতে পারে।

উপরন্তু, একটি ডিসপ্লেতে রাখা সত্ত্বা সর্বদা সেই ডিসপ্লে অ্যাক্সেস করতে পারে। যদি মালিক একটি ডিসপ্লেতে একটি অ্যাক্টিভিটি চালু করে, তাহলে অ্যাক্টিভিটি এই ডিসপ্লেতে অন্যান্য অ্যাক্টিভিটি চালু করতে পারে। ফলস্বরূপ, অ্যাক্সেস সীমাবদ্ধ করার এবং বিশ্বস্ত অ্যাপগুলিকে অনুমতি দেওয়ার জন্য মালিক দায়ী৷

এছাড়াও, ভার্চুয়াল ডিসপ্লেতে আরও সীমাবদ্ধতা যুক্ত করা হয়েছে কারণ যে কোনও অ্যাপ ব্যবহারকারীর কাছে দৃশ্যমান না করেই একটি তৈরি করতে পারে। ভার্চুয়াল ডিসপ্লে যদি সিস্টেমের মালিকানাধীন না হয়, তাহলে শুধুমাত্র allowEmbedded অ্যাক্টিভিটিগুলি অনুমোদিত এবং কলারের ACTIVITY_EMBEDDING অনুমতি থাকা উচিত৷

আরও তথ্যের জন্য, দেখুন:

  • ActivityStackSupervisor#isCallerAllowedToLaunchOnDisplay()
  • ActivityDisplay#isUidPresent()
  • DisplayManagerService#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>

বিস্তারিত জানার জন্য, স্ট্যাটিক ডিসপ্লে শনাক্তকারী দেখুন।

আরও তথ্যের জন্য, দেখুন:

,

ভাঁজযোগ্য এবং মাল্টি-স্ক্রিন ডিভাইসের জন্য অ্যাপ

সাধারণত, কিছু ডিসপ্লে আইডির উপর নির্ভর করে এমন স্থির শনাক্তকারী বা যুক্তির উপর অ্যাপগুলির নির্ভর করা উচিত নয়। বেশিরভাগ ক্ষেত্রে, অ্যাপগুলির আকার পরিবর্তন করা উচিত এবং বিভিন্ন ডিসপ্লেতে কাজ করা উচিত এবং অ্যাপগুলি কোথায় সনাক্ত করতে হবে তা সিস্টেমের নিয়ন্ত্রণ করা উচিত। উদাহরণস্বরূপ, ভাঁজ করা যায় এমন ডিভাইসগুলির জন্য একটি নতুন এবং অনন্য অভিজ্ঞতা তৈরি করতে এবং ডিভাইসটি ভাঁজ করার সময় বাহ্যিক স্ক্রিনে একটি বিশেষ অ্যাপ চালু করুন।

এই ক্ষেত্রে, SystemUI (বা অন্য সিস্টেমের উপাদান) ভাঁজ সনাক্ত করা উচিত, এটি একটি ক্রিয়া সম্পাদনের জন্য উপযুক্ত কিনা তা নির্ধারণ করুন এবং তারপর লক্ষ্য কার্যকলাপ চালু করুন এবং লঞ্চ লক্ষ্য হিসাবে একটি বহিরাগত প্রদর্শন আইডি নির্দিষ্ট করুন। অ্যাপ্লিকেশানগুলি এই ক্রিয়াটি সনাক্ত করবে না বা প্রতিক্রিয়া হিসাবে কোনও ক্রিয়া সম্পাদন করবে না এবং তারপর একটি নির্দিষ্ট প্রদর্শনে লঞ্চটি সম্পাদন করবে৷ অন্য কথায়, অনুমান করবেন না যে একটি ডিভাইসে যা কাজ করে তা অন্য ডিভাইসে কাজ করবে। সংক্ষেপে, ডিভাইস-নির্দিষ্ট কোড ফ্র্যাগমেন্টেশন বাড়ায়।

প্রদর্শনগুলিতে অ্যাক্সেস সীমাবদ্ধ করুন

যদি ডিভাইস কনফিগারেশনের জন্য এক বা একাধিক ডিসপ্লেতে অ্যাক্সেসের সীমাবদ্ধতার প্রয়োজন হয়, তাহলে Display#FLAG_PRIVATE পতাকা ব্যবহার করার পরামর্শ হল এই ধরনের ডিসপ্লেগুলিকে ব্যক্তিগত হিসাবে চিহ্নিত করতে৷ এটি করার ফলে মালিক ব্যতীত সকলকে প্রদর্শনে সামগ্রী যোগ করা থেকে সীমাবদ্ধ করে। মালিক ব্যতীত অন্য কারো দ্বারা একটি ক্রিয়াকলাপ চালু করার বা একটি উইন্ডো যুক্ত করার যেকোন প্রচেষ্টা একটি SecurityException হিসাবে পরিণত হয়৷ যদি সিস্টেমটি ডিসপ্লের মালিক হয়, তাহলে সিস্টেম উইন্ডোজ যোগ করতে এবং কার্যক্রম চালু করতে পারে।

উপরন্তু, একটি ডিসপ্লেতে রাখা সত্ত্বা সর্বদা সেই ডিসপ্লে অ্যাক্সেস করতে পারে। যদি মালিক একটি ডিসপ্লেতে একটি অ্যাক্টিভিটি চালু করে, তাহলে অ্যাক্টিভিটি এই ডিসপ্লেতে অন্যান্য অ্যাক্টিভিটি চালু করতে পারে। ফলস্বরূপ, অ্যাক্সেস সীমাবদ্ধ করার এবং বিশ্বস্ত অ্যাপগুলিকে অনুমতি দেওয়ার জন্য মালিক দায়ী৷

এছাড়াও, ভার্চুয়াল ডিসপ্লেতে আরও সীমাবদ্ধতা যুক্ত করা হয়েছে কারণ যে কোনও অ্যাপ ব্যবহারকারীর কাছে দৃশ্যমান না করেই একটি তৈরি করতে পারে। ভার্চুয়াল ডিসপ্লে যদি সিস্টেমের মালিকানাধীন না হয়, তাহলে শুধুমাত্র allowEmbedded অ্যাক্টিভিটিগুলি অনুমোদিত এবং কলারের ACTIVITY_EMBEDDING অনুমতি থাকা উচিত৷

আরও তথ্যের জন্য, দেখুন:

  • ActivityStackSupervisor#isCallerAllowedToLaunchOnDisplay()
  • ActivityDisplay#isUidPresent()
  • DisplayManagerService#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>

বিস্তারিত জানার জন্য, স্ট্যাটিক ডিসপ্লে শনাক্তকারী দেখুন।

আরও তথ্যের জন্য, দেখুন: