ארכיטקטורת מידע

ל-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
  • DashboardFragmentRegistry: packages/apps/Settings/src/com/android/settings/dashboard/DashboardFragmentRegistry.java
  • DashboardFragment: packages/apps/Settings/src/com/android/settings/dashboard/DashboardFragment.java
  • AbstractPreferenceController: 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 החדש. ממשקי ה-API נדרש תיאור בשם PreferenceController וגם מתועד ב-Javadoc.

מומלץ מאוד להוסיף בדיקת יחידה לכל PreferenceController. אם השינוי נשלח אל AOSP, צריך לבצע בדיקת יחידה. כדי לקבל מידע נוסף על כתיבת מבחנים מבוססי-רובולקטריות, אפשר לעיין ב קובץ Readme packages/apps/Settings/tests/robotests/README.md.

ארכיטקטורת מידע בסגנון יישומי פלאגין

כל פריט הגדרות מוטמע כהעדפה. העדפה יכולה להיות בקלות הועברו מדף אחד לדף אחר.

הוספנו את Android 8.0 כדי להקל על שינוי של הגדרות מרובות קטע מארח בסגנון פלאגין שמכיל פריטי הגדרות. פריטי ההגדרות הם שעבר מודלים כבקרים בסגנון יישומי פלאגין. לכן, דף ההגדרות בנוי שבר של מארח יחיד ומספר בקרי הגדרות.

קטע מרכז הבקרה

DashboardFragment הוא המארח של בקרי העדפות בסגנון יישומי פלאגין. המקטע יורש מ-PreferenceFragment ויש לו הוקים (hooks) אל הרחבה ועדכון של רשימות העדפות סטטיות ורשימות העדפות דינמיות.

העדפות סטטיות

רשימת העדפות סטטית מוגדרת ב-XML באמצעות התג <Preference>. א' ההטמעה של DashboardFragment משתמשת ב השיטה getPreferenceScreenResId() כדי להגדיר איזה קובץ XML מכיל הרשימה הסטטית של ההעדפות להצגה.

העדפות דינמיות

פריט דינמי מייצג משבצת עם כוונה, שמובילה לנכס חיצוני או פנימי פעילות. בדרך כלל, הכוונה מובילה לדף הגדרות שונה. לדוגמה, 'Google' פריט ההגדרה בדף הבית של ההגדרות הוא פריט דינמי. דינמיות פריטים מוגדרים ב-AndroidManifest (בהמשך) ונטענים באמצעות FeatureProvider (מוגדר כ- DashboardFeatureProvider).

הגדרות דינמיות כבדות יותר מאשר מוגדרות באופן סטטי ולכן בדרך כלל מפתחים צריכים ליישם את ההגדרה כהגדרה סטטית. עם זאת, ההגדרה הדינמית יכולה להיות שימושית כשמתקיים אחד מהתנאים הבאים:

  • ההגדרה לא מוטמעת ישירות באפליקציית ההגדרות (כמו החדרת הגדרה שהוטמעה על ידי אפליקציות של ספק או יצרן ציוד מקורי).
  • ההגדרה אמורה להופיע בדף הבית של ההגדרות.
  • כבר יש לך פעילות עבור ההגדרה ואינך רוצה ליישם את עוד הגדרה סטטית.

כדי להגדיר פעילות כהגדרה דינמית:

  • לסמן את הפעילות כהגדרה דינמית על ידי הוספת מסנן Intent פעילות.
  • אומרים לאפליקציית ההגדרות לאיזו קטגוריה היא שייכת. הקטגוריה היא קבועה, הוגדרה ב-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 מוגדרים בקוד Java או ב-XML, DashboardFragment מנהל את לוגיקת הטיפול של כל הגדרה עד PreferenceController (כפי שמוסבר בהמשך). ואז הם יופיעו תוצג בממשק המשתמש כרשימה מעורבת.

בקר העדפות

יש הבדלים בין ההטמעה של PreferenceController ב-Android 9 וב-Android 8.x, כפי שמתואר .

PreferenceController בגרסת Android 9

PreferenceController כולל את כל הלוגיקה לאינטראקציה עם העדפה, כולל הצגה, עדכון, הוספת חיפוש לאינדקס וכו'.

הממשק של PreferenceController מוגדר כך: BasePreferenceController. לדוגמה, ראו את הקוד packages/apps/Settings/src/com/android/settings/core/ BasePreferenceController.java

יש כמה מחלקות משנה של BasePreferenceController, כל אחת מהן למיפוי לסגנון ספציפי של ממשק משתמש שבו אפליקציית ההגדרות תומכת כברירת מחדל. עבור לדוגמה, ל-TogglePreferenceController יש API שממפה ישירות לאופן שבו המשתמש צריך לקיים אינטראקציה עם ממשק משתמש של העדפות שמבוסס על מתג.

ב-BasePreferenceController יש ממשקי API כמו getAvailabilityStatus(), displayPreference() handlePreferenceTreeClicked(), וכו'. תיעוד מפורט לגבי כל אחד מהם ה-API נמצא במחלקת הממשק.

הגבלה על ההטמעה של BasePreferenceController (ו מחלקות המשנה שלו, כמו TogglePreferenceController) הוא החתימה מסוג constructor חייבת להתאים לאחת מהאפשרויות הבאות:

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

כשמתקינים העדפה למקטע, מרכז הבקרה מספק שיטה צריך לצרף PreferenceController לפני זמן התצוגה. בזמן ההתקנה, הבקר מחובר למקטע כך שכל האירועים הרלוונטיים העתידיים נשלחו לנאמן מידע.

DashboardFragment שומר רשימה של PreferenceController שניות במסך. במקטע onCreate(), כל הבקרים מופעלים עבור getAvailabilityStatus(), ואם מחזירה True, בוצעה הפעלה של displayPreference() כדי לעבד לוגיקת תצוגה. חשוב לציין את getAvailabilityStatus() גם בהגדרות אילו פריטים יהיו זמינים במהלך החיפוש.

PreferenceController בגרסאות Android 8.x

PreferenceController כולל את כל הלוגיקה לאינטראקציה עם העדפות, כולל הצגה, עדכון והוספה לאינדקס של חיפושים. וכו'

בהתאם לאינטראקציות עם ההעדפות, הממשק של PreferenceController כולל ממשקי API isAvailable(), displayPreference(), handlePreferenceTreeClicked() וכו'. תוכלו למצוא תיעוד מפורט על כל API במחלקה של הממשק.

כשמתקינים העדפה למקטע, מרכז הבקרה מספק שיטה צריך לצרף PreferenceController לפני זמן התצוגה. בזמן ההתקנה, הבקר מחובר למקטע כך שכל האירועים הרלוונטיים העתידיים נשלחו לנאמן מידע.

ב-DashboardFragment מופיעה רשימה של PreferenceControllers במסך. בonCreate() של המקטע, הכול בקרים מופעלים ל-method isAvailable(), ואם מחזירה True, הפונקציה displayPreference() מופעלת כדי לעבד את התצוגה בלוגיקה.

שימוש ב-DashboardFragment

העברת העדפה מדף א' לדף ב'

אם ההעדפה רשומה באופן סטטי ב-XML של ההעדפה של הדף המקורי יש לבצע את תהליך ההעברה הסטטי של מכשיר ה-Android גרסה בהמשך. אחרת, מבצעים את תהליך ההעברה הדינמי. לגרסת Android שלך.

העברה סטטית ב-Android 9

  1. חיפוש קובצי ה-XML המועדפים לדף וליעד המקוריים הדף הזה. אפשר למצוא את המידע הזה בדף אמצעי תשלום אחד (getPreferenceScreenResId()).
  2. מסירים את ההעדפה מה-XML של הדף המקורי.
  3. מוסיפים את ההעדפה ל-XML של דף היעד.
  4. צריך להסיר את PreferenceController של ההעדפה הזו מ הטמעת Java של הדף המקורי. בדרך כלל המחיר הוא createPreferenceControllers() ייתכן שהבקר הוצהר ב- ישירות בפורמט XML.

    הערה: יכול להיות שההעדפה לא כוללת PreferenceController.

  5. יצירת מופע של PreferenceController בדף היעד createPreferenceControllers(). אם PreferenceController מוגדר ב-XML בדף הישן, מגדירים אותו ב-XML של הדף החדש גם כן.

העברה דינמית ב-Android 9

  1. בודקים איזו קטגוריה מתארחת בדף המקורי ובדף היעד. אפשר אפשר למצוא את המידע הזה ב-DashboardFragmentRegistry.
  2. יש לפתוח את הקובץ AndroidManifest.xml שמכיל את ההגדרה שבחרת תצטרכו לזוז ולמצוא את הרשומה 'פעילות' שמייצגת את ההגדרה הזו.
  3. הגדרת ערך המטא-נתונים של הפעילות עבור com.android.settings.category למפתח הקטגוריה של הדף החדש.

מעבר סטטי בגרסאות Android 8.x

  1. מוצאים את קובצי ה-XML של ההעדפה לדף המקורי ולדף היעד.
  2. המידע הזה מופיע בשיטה getPreferenceScreenResId() של הדף.
  3. מסירים את ההעדפה בקובץ ה-XML של הדף המקורי.
  4. מוסיפים את ההעדפה ל-XML של דף היעד.
  5. צריך להסיר את PreferenceController של ההעדפה הזו דרך הטמעת Java של הדף המקורי. בדרך כלל הקוד הוא getPreferenceControllers()
  6. הערה: ייתכן שלהעדפה אין PreferenceController.

  7. יצירת מופע של PreferenceController בדף היעד getPreferenceControllers().

מעבר דינמי בגרסאות Android 8.x

  1. בודקים איזו קטגוריה מתארחת בדף המקורי ובדף היעד. טיפים נוספים לאופטימיזציה מפורטים המידע הזה ב-DashboardFragmentRegistry.
  2. יש לפתוח את הקובץ AndroidManifest.xml שמכיל את ההגדרה שבחרת תצטרכו לזוז ולמצוא את הרשומה 'פעילות' שמייצגת את ההגדרה הזו.
  3. משנים את ערך המטא-נתונים של הפעילות עבור com.android.settings.category, הגדרת הערך של מפתח הקטגוריה של הדף החדש.

יצירת העדפה חדשה בדף

אם ההעדפה רשומה באופן סטטי ב-XML של ההעדפה של הדף המקורי מבצעים את התהליך הסטטי שבהמשך. אחרת, צריך לעקוב אחר דינמי.

יצירת העדפה סטטית

  1. מוצאים את קובצי ה-XML המועדפים לדף. אפשר למצוא את המידע הזה. מהשיטה getPreferenceScreenResId() בדף.
  2. מוסיפים פריט העדפה חדש ב-XML. חשוב לוודא שיש לו android:key ייחודי.
  3. אפשר להגדיר PreferenceController להעדפה הזו בדף getPreferenceControllers().
    • ב-Android מגרסה 8.x עם מערכת הפעלה Android 9. ליצור PreferenceController להעדפה הזו createPreferenceControllers() של הדף.

      אם ההעדפה הזו כבר הייתה קיימת במקומות אחרים, ייתכן כבר PreferenceController עבורו. אפשר להשתמש שוב PreferenceController בלי ליצור פרויקט חדש.

    • החל מ-Android 9, אפשר להצהיר על PreferenceController ב-XML ליד ההעדפה. מוצרים לדוגמה:
      <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. פועלים לפי השלבים להוספת ההגדרות הנדרשות לדף הזה. לקבלת מידע נוסף מידע נוסף זמין בקטע הטמעה.

אימות

  • מריצים את הבדיקות הרובולקטריות בהגדרות. כל הבדיקות הקיימות והחדשות עובר.
  • יוצרים ומתקינים את ההגדרות, ואז פותחים באופן ידני את הדף שמשנים. הדף אמור להתעדכן באופן מיידי.