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

Android 8.0 में, सेटिंग ऐप्लिकेशन के लिए एक नया जानकारी आर्किटेक्चर जोड़ा गया है. इससे, सेटिंग को व्यवस्थित करने का तरीका आसान हो गया है. साथ ही, उपयोगकर्ताओं को अपने Android डिवाइसों को पसंद के मुताबिक बनाने के लिए, सेटिंग को तुरंत ढूंढने में आसानी हुई है. Android 9 में कुछ सुधार किए गए हैं, ताकि ज़्यादा सुविधाएं दी जा सकें सेटिंग की फ़ंक्शन और उन्हें आसानी से लागू करने की सुविधा.

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

फ़िलहाल, सेटिंग के ज़्यादातर पेजों को नए फ़्रेमवर्क का इस्तेमाल करके लागू किया गया है. DisplaySettings एक अच्छा उदाहरण है:packages/apps/Settings/src/com/android/settings/DisplaySettings.java

अहम कॉम्पोनेंट के लिए फ़ाइल पाथ यहां दिए गए हैं:

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

लागू करना

डिवाइस बनाने वाली कंपनियों को सलाह दी जाती है कि वे सेटिंग की मौजूदा जानकारी में बदलाव करें आर्किटेक्चर और ज़रूरत के मुताबिक अतिरिक्त सेटिंग पेज शामिल करें पार्टनर के लिए खास सुविधाएं. प्राथमिकताओं को लेगसी पेज (SettingsPreferencePage के तौर पर लागू किया गया) से नए पेज (DashboardFragment का इस्तेमाल करके लागू किया गया) पर ले जाना मुश्किल हो सकता है. लेगसी पेज को शायद PreferenceController के साथ लागू न किया गया हो.

इसलिए, प्राथमिकताओं को किसी लेगसी पेज से नए पेज पर ले जाते समय, आपको एक PreferenceController और कोड को इससे पहले कंट्रोलर में ले जाएं नए DashboardFragment में इंस्टैंशिएट हो जाएगा. ऐसे एपीआई जो PreferenceController की शर्तों के बारे में उनके नाम में बताया गया है और जावाडॉक में दर्ज किया गया है.

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

प्लग इन-स्टाइल इन्फ़ॉर्मेशन आर्किटेक्चर

हर सेटिंग आइटम को प्राथमिकता के तौर पर लागू किया जाता है. किसी प्राथमिकता को एक पेज से दूसरे पेज पर आसानी से ले जाया जा सकता है.

एक से ज़्यादा सेटिंग को आसानी से एक से दूसरी जगह ले जाने के लिए, Android 8.0 में प्लग इन स्टाइल का होस्ट फ़्रैगमेंट जोड़ा गया है. इसमें सेटिंग आइटम होते हैं. सेटिंग आइटम को प्लग इन स्टाइल वाले कंट्रोलर के तौर पर मॉडल किया जाता है. इसलिए, सेटिंग पेज को एक होस्ट फ़्रैगमेंट और कई सेटिंग कंट्रोलर से बनाया जाता है.

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

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

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

स्टैटिक प्राथमिकता सूची को एक्सएमएल में <Preference> टैग का इस्तेमाल करके तय किया जाता है. ऐप्लिकेशन DashboardFragment लागू करने का तरीका किस एक्सएमएल फ़ाइल में है, यह तय करने के लिए getPreferenceScreenResId() तरीका दिखाने के लिए प्राथमिकताओं की स्टैटिक सूची.

डाइनैमिक प्राथमिकताएं

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

डाइनैमिक सेटिंग, स्टैटिक तरीके से कॉन्फ़िगर की गई सेटिंग की तुलना में ज़्यादा भारी होती हैं सेटिंग की ज़रूरी शर्तें पूरी की गई हैं, ताकि आम तौर पर डेवलपर को इस सेटिंग को स्टैटिक के तौर पर लागू करना चाहिए. हालांकि, डाइनैमिक सेटिंग तब काम की हो सकती है, जब इनमें से कोई भी बात सही हो:

  • सेटिंग को सीधे तौर पर Settings ऐप्लिकेशन में लागू नहीं किया गया है. जैसे, OEM/कैरियर ऐप्लिकेशन की लागू की गई सेटिंग को इंजेक्ट करना.
  • सेटिंग, 'सेटिंग' के होम पेज पर दिखनी चाहिए.
  • आपके पास सेटिंग के लिए पहले से ही कोई गतिविधि है और आपको अतिरिक्त स्टैटिक कॉन्फ़िगरेशन लागू नहीं करना है.

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

  • गतिविधि में इंटेंट-फ़िल्टर जोड़कर, गतिविधि को डाइनैमिक सेटिंग के तौर पर मार्क करें.
  • सेटिंग ऐप्लिकेशन को बताएं कि यह किस कैटगरी से जुड़ा है. कैटगरी एक कॉन्स्टेंट है, जिसे 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>

रेंडर करने के समय, फ़्रैगमेंट AndroidManifest में बताई गई स्टैटिक एक्सएमएल और डाइनैमिक सेटिंग, दोनों से प्राथमिकताओं की सूची मांगेगा. क्या PreferenceController को Java कोड या एक्सएमएल में, DashboardFragment हर सेटिंग का हैंडलिंग लॉजिक मैनेज करता है PreferenceController तक (नीचे चर्चा की गई है). इसके बाद, वे यूज़र इंटरफ़ेस (यूआई) में एक मिश्रित सूची के रूप में दिखाया जाता है.

PreferenceController

इस सेक्शन में बताया गया है कि Android 9 और Android 8.x में PreferenceController को लागू करने के तरीके अलग-अलग हैं.

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

PreferenceController में, इंटरैक्ट करने के लिए सभी लॉजिक मौजूद होते हैं आपकी प्राथमिकता के आधार पर, आपके विज्ञापनों को प्राथमिकता देते हैं. इनमें, डिसप्ले, अपडेट, खोज इंडेक्स करना वगैरह शामिल है.

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

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

BasePreferenceController में इस तरह के एपीआई हैं getAvailabilityStatus(), displayPreference(), handlePreferenceTreeClicked(), वगैरह. हर एक दस्तावेज़ के बारे में ज़्यादा जानकारी एपीआई, इंटरफ़ेस क्लास में है.

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

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

फ़्रैगमेंट के लिए प्राथमिकता इंस्टॉल करते समय, डैशबोर्ड डिसप्ले समय से पहले PreferenceController अटैच करें. इंस्टॉल के समय, कंट्रोलर को फ़्रैगमेंट से कनेक्ट किया जाता है, ताकि आने वाले समय में काम के सभी इवेंट कंट्रोलर को भेजे जा सकें.

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

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

PreferenceController में, इंटरैक्ट करने के लिए सभी लॉजिक मौजूद होते हैं जिसमें आपकी साइट को प्राथमिकता दी जाएगी. इसमें, Search को इंडेक्स करना, दिखाना, अपडेट करना, और उसे अपडेट करना शामिल है. वगैरह

प्राथमिकता वाले इंटरैक्शन के मुताबिक, PreferenceController के इंटरफ़ेस में एपीआई isAvailable(), displayPreference(), handlePreferenceTreeClicked() वगैरह हैं. इंटरफ़ेस क्लास में, हर एपीआई से जुड़ी ज़्यादा जानकारी वाले दस्तावेज़ मिल सकते हैं.

फ़्रैगमेंट में प्राथमिकता इंस्टॉल करते समय, डैशबोर्ड में डिसप्ले के समय से पहले PreferenceController अटैच करने का तरीका दिया जाता है. इंस्टॉल के समय, कंट्रोलर को फ़्रैगमेंट से कनेक्ट किया जाता है, ताकि आने वाले समय में काम के सभी इवेंट कंट्रोलर को भेजे जा सकें.

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

डैशबोर्ड फ़्रैगमेंट का इस्तेमाल करें

प्राथमिकता को पेज A से B पर ले जाएं

अगर प्राथमिकता स्थिर रूप से मूल पेज की प्राथमिकता एक्सएमएल में मौजूद है फ़ाइल में, अपने Android के लिए स्टैटिक मूविंग प्रोसेस का पालन करें रिलीज़ नीचे दी गई है. इसके अलावा, डाइनैमिक मूव या प्रोसेस को अपनाएं Android रिलीज़ के लिए.

Android 9 में स्टैटिक मूव

  1. ओरिजनल पेज और डेस्टिनेशन पेज के लिए, प्राथमिकता वाली एक्सएमएल फ़ाइलें ढूंढें. आपको यह जानकारी पेज के getPreferenceScreenResId() तरीका.
  2. ओरिजनल पेज के एक्सएमएल से प्राथमिकता हटाएं.
  3. प्राथमिकता को डेस्टिनेशन पेज के एक्सएमएल में जोड़ें.
  4. ओरिजनल पेज के Java लागू करने से, इस प्राथमिकता के लिए PreferenceController हटाएं. आम तौर पर यह createPreferenceControllers(). कंट्रोलर का एलान एक्सएमएल फ़ॉर्मैट को सीधे तौर पर इस्तेमाल किया जा सकता है.

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

  5. PreferenceController को गंतव्य पेज के createPreferenceControllers(). अगर PreferenceController को एक्सएमएल में पुराने पेज में तय किया गया है, इसे तय करें एक्सएमएल में भी इस फ़ॉर्मैट का इस्तेमाल किया जा सकता है.

Android 9 में डाइनैमिक मूव

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

Android 8.x रिलीज़ में स्टैटिक मूव

  1. मूल पेज और डेस्टिनेशन पेज के लिए प्राथमिकता एक्सएमएल फ़ाइलें ढूंढें.
  2. आपको यह जानकारी, पेज के getPreferenceScreenResId() तरीके से मिल सकती है.
  3. ओरिजनल पेज के एक्सएमएल में से प्राथमिकता हटाएं.
  4. डेस्टिनेशन पेज के एक्सएमएल में प्राथमिकता जोड़ें.
  5. इस प्राथमिकता के लिए PreferenceController को इसमें से हटाएं: मूल पेज का Java का इस्तेमाल करना. आम तौर पर, यह getPreferenceControllers() में होता है.
  6. ध्यान दें: यह मुमकिन है कि प्राथमिकता में PreferenceController.

  7. डेस्टिनेशन पेज के getPreferenceControllers() में PreferenceController को इंस्टैंशिएट करें.

Android 8.x रिलीज़ में डाइनैमिक मूव करना

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

किसी पेज में नई प्राथमिकता बनाना

अगर प्राथमिकता, ओरिजनल पेज की प्राथमिकता एक्सएमएल फ़ाइल में स्टैटिक तौर पर दी गई है, तो नीचे दिया गया स्टैटिक तरीका अपनाएं. अगर ऐसा नहीं है, तो डाइनैमिक प्रोसेस का पालन करें.

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

  1. पेज के लिए प्राथमिकता एक्सएमएल फ़ाइलें ढूंढें. आपको यह जानकारी, पेज के getPreferenceScreenResId() तरीके से मिल सकती है.
  2. एक्सएमएल में एक नया प्राथमिकता आइटम जोड़ें. पक्का करें कि उसका android:key यूनीक हो.
  3. पेज केPreferenceController getPreferenceControllers() तरीका.
    • Android 8.x और Android 9 में, पेज के createPreferenceControllers() तरीके में इस प्राथमिकता के लिए PreferenceController को इंस्टैंशिएट करें. हालांकि, ऐसा करना ज़रूरी नहीं है.

      अगर यह प्राथमिकता पहले से ही दूसरी जगहों पर मौजूद थी, तो हो सकता है कि उसके लिए पहले से ही कोई PreferenceController मौजूद हो. Google Analytics 4 प्रॉपर्टी में, नया टैग बनाए बिना PreferenceController.

    • Android 9 से, ऐप्लिकेशन का इस्तेमाल करके एक्सएमएल में प्राथमिकता के बगल में मौजूद 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. DashboardFragment से लिया गया नया फ़्रैगमेंट बनाएं.
  2. DashboardFragmentRegistry में इसकी कैटगरी तय करें.

    ध्यान दें: यह चरण ज़रूरी नहीं है. अगर आपको इसकी ज़रूरत नहीं है कोई भी डाइनैमिक प्राथमिकता शामिल है, तो आपको कैटगरी कुंजी देने की ज़रूरत नहीं है.

  3. इस पेज के लिए ज़रूरी सेटिंग जोड़ने के लिए, यह तरीका अपनाएं. ज़्यादा के लिए लागू करने का तरीका सेक्शन देखें.

पुष्टि करें

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