इन्फ़ॉर्मेशन आर्किटेक्चर

एंड्रॉइड 8.0 ने सेटिंग्स को व्यवस्थित करने के तरीके को सरल बनाने और उपयोगकर्ताओं के लिए अपने एंड्रॉइड डिवाइस को अनुकूलित करने के लिए सेटिंग्स को तुरंत ढूंढना आसान बनाने के लिए सेटिंग्स ऐप के लिए एक नई सूचना वास्तुकला पेश की। एंड्रॉइड 9 ने अधिक सेटिंग्स कार्यक्षमता और आसान कार्यान्वयन प्रदान करने के लिए कुछ सुधार पेश किए।

उदाहरण और स्रोत

सेटिंग्स में अधिकांश पृष्ठ वर्तमान में नए ढांचे का उपयोग करके कार्यान्वित किए गए हैं। एक अच्छा उदाहरण डिस्प्लेसेटिंग्स है: packages/apps/Settings/src/com/android/settings/DisplaySettings.java

महत्वपूर्ण घटकों के लिए फ़ाइल पथ नीचे सूचीबद्ध हैं:

  • CategoryKey : packages/SettingsLib/src/com/android/settingslib/drawer/CategoryKey.java
  • DashboardFragmentRegistry : packages/apps/Settings/src/com/android/settings/dashboard/DashboardFragmentRegistry.java
  • डैशबोर्डफ़्रैगमेंट : packages/apps/Settings/src/com/android/settings/dashboard/DashboardFragment.java
  • AbstractPreferenceController : frameworks/base/packages/SettingsLib/src/com/android/settingslib/core/AbstractPreferenceController.java
  • BasePreferenceController (एंड्रॉइड 9 में पेश किया गया): packages/apps/Settings/src/com/android/settings/core/BasePreferenceController.java

कार्यान्वयन

डिवाइस निर्माताओं को मौजूदा सेटिंग्स सूचना आर्किटेक्चर को अनुकूलित करने और भागीदार-विशिष्ट सुविधाओं को समायोजित करने के लिए आवश्यकतानुसार अतिरिक्त सेटिंग्स पेज डालने के लिए प्रोत्साहित किया जाता है। प्राथमिकताओं को विरासत पृष्ठ ( SettingsPreferencePage के रूप में कार्यान्वित) से एक नए पृष्ठ ( DashboardFragment उपयोग करके कार्यान्वित) पर ले जाना जटिल हो सकता है। विरासत पृष्ठ से प्राथमिकता संभवतः PreferenceController के साथ लागू नहीं की जाती है।

इसलिए किसी प्राथमिकता को किसी विरासत पृष्ठ से नए पृष्ठ पर ले जाते समय, आपको एक PreferenceController बनाना होगा और कोड को नए DashboardFragment में इंस्टेंट करने से पहले नियंत्रक में ले जाना होगा। PreferenceController जिन API की आवश्यकता होती है, उन्हें उनके नाम से वर्णित किया गया है और Javadoc में प्रलेखित किया गया है।

प्रत्येक PreferenceController के लिए एक यूनिट परीक्षण जोड़ने की अत्यधिक अनुशंसा की जाती है। यदि परिवर्तन एओएसपी को सबमिट किया जाता है, तो एक इकाई परीक्षण की आवश्यकता होती है। रोबोइलेक्ट्रिक आधारित परीक्षण लिखने के तरीके के बारे में अधिक जानकारी प्राप्त करने के लिए, रीडमी फ़ाइल packages/apps/Settings/tests/robotests/README.md देखें।

प्लगइन-शैली सूचना वास्तुकला

प्रत्येक सेटिंग आइटम को प्राथमिकता के रूप में कार्यान्वित किया जाता है। किसी प्राथमिकता को आसानी से एक पृष्ठ से दूसरे पृष्ठ पर ले जाया जा सकता है।

एकाधिक सेटिंग्स को इधर-उधर ले जाना आसान बनाने के लिए, एंड्रॉइड 8.0 ने एक प्लगइन-शैली होस्ट खंड पेश किया जिसमें सेटिंग्स आइटम शामिल हैं। सेटिंग्स आइटम को प्लगइन-शैली नियंत्रकों के रूप में मॉडल किया गया है। इसलिए, एक सेटिंग पृष्ठ का निर्माण एकल होस्ट फ़्रैगमेंट और एकाधिक सेटिंग नियंत्रकों द्वारा किया जाता है।

डैशबोर्डफ्रैगमेंट

DashboardFragment प्लगइन-शैली प्राथमिकता नियंत्रकों का होस्ट है। टुकड़ा PreferenceFragment से विरासत में मिला है और इसमें स्थैतिक वरीयता सूचियों और गतिशील वरीयता सूचियों दोनों का विस्तार और अद्यतन करने के लिए हुक हैं।

स्थैतिक प्राथमिकताएँ

<Preference> टैग का उपयोग करके XML में एक स्थिर प्राथमिकता सूची परिभाषित की जाती है। DashboardFragment कार्यान्वयन getPreferenceScreenResId() विधि का उपयोग यह परिभाषित करने के लिए करता है कि किस XML फ़ाइल में प्रदर्शित करने के लिए प्राथमिकताओं की स्थिर सूची है।

गतिशील प्राथमिकताएँ

एक गतिशील वस्तु इरादे के साथ एक टाइल का प्रतिनिधित्व करती है, जो बाहरी या आंतरिक गतिविधि की ओर ले जाती है। आमतौर पर, इरादा एक अलग सेटिंग पेज पर ले जाता है। उदाहरण के लिए, सेटिंग होमपेज में "Google" सेटिंग आइटम एक गतिशील आइटम है। डायनामिक आइटम को AndroidManifest (नीचे चर्चा की गई) में परिभाषित किया गया है और एक FeatureProvider ( DashboardFeatureProvider के रूप में परिभाषित) के माध्यम से लोड किया गया है।

डायनामिक सेटिंग्स स्थिर रूप से कॉन्फ़िगर की गई सेटिंग्स की तुलना में अधिक भारी होती हैं, इसलिए आम तौर पर डेवलपर्स को सेटिंग को स्थिर के रूप में लागू करना चाहिए। हालाँकि, निम्न में से कोई भी सत्य होने पर डायनामिक सेटिंग उपयोगी हो सकती है:

  • सेटिंग को सीधे सेटिंग ऐप में लागू नहीं किया जाता है (जैसे कि ओईएम/कैरियर ऐप्स द्वारा लागू की गई सेटिंग को इंजेक्ट करना)।
  • सेटिंग सेटिंग मुखपृष्ठ पर दिखाई देनी चाहिए.
  • आपके पास सेटिंग के लिए पहले से ही एक गतिविधि है और आप अतिरिक्त स्थिर कॉन्फ़िगरेशन लागू नहीं करना चाहते हैं।

किसी गतिविधि को डायनामिक सेटिंग के रूप में कॉन्फ़िगर करने के लिए, निम्न कार्य करें:

  • गतिविधि में एक आशय-फ़िल्टर जोड़कर गतिविधि को एक गतिशील सेटिंग के रूप में चिह्नित करें।
  • सेटिंग ऐप को बताएं कि यह किस श्रेणी का है। श्रेणी एक स्थिरांक है, जिसे CategoryKey में परिभाषित किया गया है।
  • वैकल्पिक: सेटिंग प्रदर्शित होने पर सारांश पाठ जोड़ें।

यहां DisplaySettings के लिए सेटिंग ऐप से लिया गया एक उदाहरण दिया गया है।

<activity android:name="Settings$DisplaySettingsActivity"
                   android:label="@string/display_settings"
                   android:icon="@drawable/ic_settings_display">
             <!-- Mark the activity as a dynamic setting -->
              <intent-filter>
                     <action android:name="com.android.settings.action.IA_SETTINGS" />
              </intent-filter>
             <!-- Tell Settings app which category it belongs to -->
              <meta-data android:name="com.android.settings.category"
                     android:value="com.android.settings.category.ia.homepage" />
             <!-- Add a summary text when the setting is displayed -->
              <meta-data android:name="com.android.settings.summary"
                     android:resource="@string/display_dashboard_summary"/>
             </activity>

रेंडर समय पर, फ़्रैगमेंट स्थिर XML और AndroidManifest में परिभाषित डायनामिक सेटिंग्स दोनों से प्राथमिकताओं की एक सूची मांगेगा। चाहे PreferenceController को जावा कोड में या XML में परिभाषित किया गया हो, DashboardFragment PreferenceController (नीचे चर्चा की गई) के माध्यम से प्रत्येक सेटिंग के हैंडलिंग तर्क को प्रबंधित करता है। फिर उन्हें यूआई में मिश्रित सूची के रूप में प्रदर्शित किया जाता है।

वरीयता नियंत्रक

एंड्रॉइड 9 और एंड्रॉइड 8.x में PreferenceController लागू करने के बीच अंतर हैं, जैसा कि इस अनुभाग में बताया गया है।

Android 9 रिलीज़ में PreferenceController

एक PreferenceController में प्राथमिकता के साथ इंटरैक्ट करने के लिए सभी तर्क शामिल होते हैं, जिसमें प्रदर्शित करना, अद्यतन करना, खोज अनुक्रमणिका इत्यादि शामिल हैं।

PreferenceController के इंटरफ़ेस को BasePreferenceController के रूप में परिभाषित किया गया है। उदाहरण के लिए, packages/apps/Settings/src/com/android/settings/core/ BasePreferenceController.java में कोड देखें

BasePreferenceController के कई उपवर्ग हैं, प्रत्येक एक विशिष्ट यूआई शैली पर मैप होता है जिसे सेटिंग्स ऐप डिफ़ॉल्ट रूप से समर्थन करता है। उदाहरण के लिए, TogglePreferenceController में एक API है जो सीधे मैप करता है कि उपयोगकर्ता को टॉगल-आधारित प्राथमिकता UI के साथ कैसे इंटरैक्ट करना चाहिए।

BasePreferenceController में getAvailabilityStatus() , displayPreference() , handlePreferenceTreeClicked(), आदि जैसे API हैं। प्रत्येक API के लिए विस्तृत दस्तावेज़ इंटरफ़ेस क्लास में है।

BasePreferenceController (और इसके उपवर्ग जैसे TogglePreferenceController ) को लागू करने पर एक प्रतिबंध यह है कि कंस्ट्रक्टर के हस्ताक्षर निम्नलिखित में से किसी एक से मेल खाने चाहिए:

  • public MyController(Context context, String key) {}
  • public MyController(Context context) {}

टुकड़े के लिए प्राथमिकता स्थापित करते समय, डैशबोर्ड प्रदर्शन समय से पहले एक PreferenceController संलग्न करने की एक विधि प्रदान करता है। इंस्टॉल के समय, नियंत्रक को टुकड़े से जोड़ दिया जाता है ताकि भविष्य की सभी प्रासंगिक घटनाएं नियंत्रक को भेज दी जाएं।

DashboardFragment स्क्रीन में PreferenceController s की एक सूची रखता है। फ़्रैगमेंट के onCreate() पर, सभी नियंत्रकों को getAvailabilityStatus() विधि के लिए लागू किया जाता है, और यदि यह सत्य लौटता है, तो डिस्प्ले लॉजिक को संसाधित करने के लिए displayPreference() को लागू किया जाता है। getAvailabilityStatus() सेटिंग फ्रेमवर्क को यह बताने के लिए भी महत्वपूर्ण है कि खोज के दौरान कौन से आइटम उपलब्ध हैं।

Android 8.x में PreferenceController रिलीज़

एक PreferenceController वरीयता के साथ इंटरैक्ट करने के लिए सभी तर्क शामिल होते हैं, जिसमें प्रदर्शित करना, अद्यतन करना, खोज अनुक्रमणिका शामिल है। वगैरह।

प्राथमिकता इंटरैक्शन के अनुरूप, PreferenceController के इंटरफ़ेस में API isAvailable() , displayPreference() , handlePreferenceTreeClicked() आदि हैं। प्रत्येक API पर विस्तृत दस्तावेज़ इंटरफ़ेस क्लास में पाया जा सकता है।

टुकड़े के लिए प्राथमिकता स्थापित करते समय, डैशबोर्ड प्रदर्शन समय से पहले एक PreferenceController संलग्न करने की एक विधि प्रदान करता है। इंस्टॉल के समय, नियंत्रक को टुकड़े से जोड़ दिया जाता है ताकि भविष्य की सभी प्रासंगिक घटनाएं नियंत्रक को भेज दी जाएं।

DashboardFragment स्क्रीन में PreferenceControllers की एक सूची रखता है। फ़्रैगमेंट के onCreate() पर, सभी नियंत्रकों को isAvailable() विधि के लिए लागू किया जाता है, और यदि यह सत्य लौटाता है, तो डिस्प्ले लॉजिक को संसाधित करने के लिए displayPreference() को लागू किया जाता है।

डैशबोर्डफ्रैगमेंट का उपयोग करना

किसी प्राथमिकता को पृष्ठ A से B पर ले जाना

यदि प्राथमिकता मूल पृष्ठ की प्राथमिकता XML फ़ाइल में स्थिर रूप से सूचीबद्ध है, तो नीचे अपने एंड्रॉइड रिलीज़ के लिए स्टेटिक मूव प्रक्रिया का पालन करें। अन्यथा, अपने एंड्रॉइड रिलीज़ के लिए डायनामिक मूव प्रक्रिया का पालन करें।

एंड्रॉइड 9 में स्थिर चाल

  1. मूल पृष्ठ और गंतव्य पृष्ठ के लिए प्राथमिकता XML फ़ाइलें ढूंढें। आप यह जानकारी पृष्ठ की getPreferenceScreenResId() विधि से पा सकते हैं।
  2. मूल पृष्ठ के XML से प्राथमिकता हटाएँ.
  3. गंतव्य पृष्ठ के XML में प्राथमिकता जोड़ें.
  4. मूल पृष्ठ के जावा कार्यान्वयन से इस प्राथमिकता के लिए PreferenceController हटा दें। आमतौर पर यह createPreferenceControllers() में होता है। नियंत्रक को सीधे XML में घोषित किया जा सकता है।

    ध्यान दें : प्राथमिकता में PreferenceController नहीं हो सकता है।

  5. गंतव्य पृष्ठ के createPreferenceControllers() में PreferenceController इंस्टेंट करें। यदि PreferenceController पुराने पृष्ठ में XML में परिभाषित किया गया है, तो इसे नए पृष्ठ के लिए XML में भी परिभाषित करें।

एंड्रॉइड 9 में गतिशील चाल

  1. पता लगाएं कि मूल और गंतव्य पृष्ठ किस श्रेणी को होस्ट करता है। आप यह जानकारी DashboardFragmentRegistry में पा सकते हैं।
  2. AndroidManifest.xml फ़ाइल खोलें जिसमें वह सेटिंग है जिसे आपको स्थानांतरित करने की आवश्यकता है और इस सेटिंग का प्रतिनिधित्व करने वाली गतिविधि प्रविष्टि ढूंढें।
  3. com.android.settings.category के लिए गतिविधि के मेटाडेटा मान को नए पृष्ठ की श्रेणी कुंजी पर सेट करें।

Android 8.x रिलीज़ में स्थिर चाल

  1. मूल पृष्ठ और गंतव्य पृष्ठ के लिए प्राथमिकता XML फ़ाइलें ढूंढें।
  2. आप यह जानकारी पृष्ठ की getPreferenceScreenResId() विधि से पा सकते हैं।
  3. मूल पृष्ठ के XML में प्राथमिकता हटाएँ.
  4. गंतव्य पृष्ठ के XML में प्राथमिकता जोड़ें.
  5. मूल पृष्ठ के जावा कार्यान्वयन में इस प्राथमिकता के लिए PreferenceController हटाएँ। आमतौर पर यह getPreferenceControllers() में होता है।
  6. ध्यान दें : यह संभव है कि प्राथमिकता में PreferenceController न हो।

  7. गंतव्य पृष्ठ के getPreferenceControllers() में PreferenceController इंस्टेंट करें।

Android 8.x रिलीज़ में गतिशील चाल

  1. पता लगाएं कि मूल और गंतव्य पृष्ठ किस श्रेणी को होस्ट करता है। आप यह जानकारी DashboardFragmentRegistry में पा सकते हैं।
  2. AndroidManifest.xml फ़ाइल खोलें जिसमें वह सेटिंग है जिसे आपको स्थानांतरित करने की आवश्यकता है और इस सेटिंग का प्रतिनिधित्व करने वाली गतिविधि प्रविष्टि ढूंढें।
  3. com.android.settings.category के लिए गतिविधि के मेटाडेटा मान को बदलें, मान बिंदु को नए पृष्ठ की श्रेणी कुंजी पर सेट करें।

किसी पृष्ठ में एक नई प्राथमिकता बनाना

यदि प्राथमिकता मूल पृष्ठ की प्राथमिकता XML फ़ाइल में स्थिर रूप से सूचीबद्ध है, तो नीचे दी गई स्थिर प्रक्रिया का पालन करें। अन्यथा गतिशील प्रक्रिया का पालन करें.

एक स्थिर प्राथमिकता बनाना

  1. पृष्ठ के लिए प्राथमिकता XML फ़ाइलें ढूंढें. आप यह जानकारी पृष्ठ की getPreferenceScreenResId() विधि से पा सकते हैं।
  2. XML में एक नया प्राथमिकता आइटम जोड़ें. सुनिश्चित करें कि इसमें एक अद्वितीय android:key है।
  3. पृष्ठ की getPreferenceControllers() विधि में इस प्राथमिकता के लिए एक PreferenceController परिभाषित करें।
    • एंड्रॉइड 8.x में और वैकल्पिक रूप से एंड्रॉइड 9 में, पेज की createPreferenceControllers() विधि में इस प्राथमिकता के लिए एक PreferenceController तुरंत चालू करें।

      यदि यह प्राथमिकता पहले से ही अन्य स्थानों पर मौजूद है, तो संभव है कि इसके लिए पहले से ही एक PreferenceController मौजूद हो। आप नया बनाए बिना PreferenceController का पुन: उपयोग कर सकते हैं।

    • एंड्रॉइड 9 में शुरू करके, आप प्राथमिकता के आगे XML में PreferenceController घोषित करना चुन सकते हैं। उदाहरण के लिए:
      <Preference
              android:key="reset_dashboard"
              android:title="@string/reset_dashboard_title"
              settings:controller="com.android.settings.system.ResetPreferenceController"/>
      

एक गतिशील प्राथमिकता बनाना

  1. पता लगाएं कि मूल और गंतव्य पृष्ठ किस श्रेणी को होस्ट करता है। आप यह जानकारी DashboardFragmentRegistry में पा सकते हैं।
  2. AndroidManifest में एक नई गतिविधि बनाएं
  3. सेटिंग को परिभाषित करने के लिए नई गतिविधि में आवश्यक मेटाडेटा जोड़ें। com.android.settings.category के लिए मेटाडेटा मान को चरण 1 में परिभाषित समान मान पर सेट करें।

एक नया पेज बनाएं

  1. DashboardFragment से विरासत में मिला एक नया टुकड़ा बनाएं।
  2. DashboardFragmentRegistry में इसकी श्रेणी परिभाषित करें।

    नोट: यह चरण वैकल्पिक है. यदि आपको इस पृष्ठ में किसी गतिशील प्राथमिकता की आवश्यकता नहीं है, तो आपको श्रेणी कुंजी प्रदान करने की आवश्यकता नहीं है।

  3. इस पृष्ठ के लिए आवश्यक सेटिंग्स जोड़ने के लिए चरणों का पालन करें। अधिक जानकारी के लिए कार्यान्वयन अनुभाग देखें।

मान्यकरण

  • सेटिंग्स में रोबोइलेक्ट्रिक परीक्षण चलाएँ। सभी मौजूदा और नए परीक्षण उत्तीर्ण होने चाहिए।
  • सेटिंग्स बनाएं और इंस्टॉल करें, फिर संशोधित किए जा रहे पेज को मैन्युअल रूप से खोलें। पेज तुरंत अपडेट होना चाहिए.