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

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
  • AbstrackPreferenceController: 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 में, जैसा कि इसमें बताया गया है सेक्शन में जाएं.

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. इस प्राथमिकता के लिए PreferenceController को यहां से हटाएं मूल पेज का Java का इस्तेमाल करना. आम तौर पर यह 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. PreferenceController को गंतव्य पेज के getPreferenceControllers().

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

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

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

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

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

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

      अगर यह प्राथमिकता पहले से ही अन्य जगहों पर मौजूद है, तो यह मुमकिन है कि पहले से ही 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. इस पेज के लिए ज़रूरी सेटिंग जोड़ने के लिए, यह तरीका अपनाएं. ज़्यादा के लिए लागू करने का तरीका सेक्शन देखें.

पुष्टि करें

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