ממשקי API של Android 4.1

רמת API: 16

Android 4.1 (JELLY_BEAN) היא התקדמות של הפלטפורמה שמציעה ביצועים וחוויית משתמש משופרת. נוספו תכונות חדשות למשתמשים ולאפליקציה למפתחים. במסמך הזה מתוארות המבוא ממשקי API חדשים ושימושיים למפתחי אפליקציות.

כמפתח אפליקציות, Android 4.1 זמין עבורך מנהל ה-SDK בתור תמונת מערכת פועלים באמולטור Android ובפלטפורמת SDK שבאמצעותם אפשר לבנות את האפליקציה. אתם צריכים להוריד את תמונת המערכת ואת הפלטפורמה בהקדם האפשרי כדי ליצור ולבדוק ב-Android 4.1.

כדי לבצע אופטימיזציה טובה יותר של האפליקציה למכשירים שבהם פועלת מערכת Android 4.1, צריך להגדיר את targetSdkVersion לערך "16", להתקין אותו בתמונת מערכת של Android 4.1, לבדוק אותו ואז לפרסם עדכון עם השינוי הזה.

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

מידע נוסף על אופן הפעולה של רמות API זמין במאמר מה זה API רמה?

רכיבי האפליקציה

שירותים מבודדים

על ידי ציון android:isolatedProcess="true" תג <service>, הService יפעל במסגרת תהליך מבודד של User-ID, שאין לו הרשאות משל עצמו.

ניהול הזיכרון

קבועים חדשים של ComponentCallbacks2, כמו TRIM_MEMORY_RUNNING_LOW ו-TRIM_MEMORY_RUNNING_CRITICAL, מספקים חזית בעיבוד מידע נוסף על את מצב הזיכרון לפני שהמערכת קוראת ל-onLowMemory().

שיטת getMyMemoryState(ActivityManager.RunningAppProcessInfo) החדשה מאפשרת לך לאחזר את מצב הזיכרון הכללי.

ספקי תוכן

שיטה חדשה, acquireUnstableContentProviderClient(), מאפשרת לך לגשת ל-ContentProviderClient שעשוי להיות 'לא יציב' כך שהאפליקציה לא תקרוס אם שספק התוכן עושה. כדאי להיעזר באפשרות הזו כאשר אתה מנהל אינטראקציה עם ספקי תוכן אפליקציה.

טפטים מונפשים

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

כדי להפעיל את בוחר הטפטים המונפשים, צריך להתקשר למספר startActivity() עם Intent באמצעות ACTION_CHANGE_LIVE_WALLPAPER וחבילה נוספת שמציין את הטפט המונפש ComponentName כמחרוזת ב-EXTRA_LIVE_WALLPAPER_COMPONENT.

ניווט במקבץ האפליקציות

עם Android 4.1 קל יותר ליישם את דפוסי העיצוב המתאימים לניווט למעלה. צריך רק להוסיף את android:parentActivityName לכל רכיב <activity> את קובץ המניפסט. המערכת משתמשת במידע הזה כדי לפתוח את הפעילות המתאימה כשהמשתמש לוחץ על הלחצן למעלה בסרגל הפעולות (תוך סיום הפעילות הנוכחית). אם אתם להצהיר על android:parentActivityName לכל פעילות, אין צורך בשיטה onOptionsItemSelected() כדי לטפל בקליקים אירועים בסמל האפליקציה של סרגל הפעולות — המערכת מטפלת עכשיו באירוע הזה וממשיכה או יוצר את הפעילות המתאימה.

התכונה הזו מועילה במיוחד בתרחישים שבהם המשתמש נכנס לאחת מהפעילויות של האפליקציה. באמצעות "ניתוח מעמיק" כוונה, למשל מתוך התראה או כוונה אפליקציה אחרת (כפי שמתואר במדריך לעיצוב ניווט בין אפליקציות). מתי שהמשתמש נכנס בצורה הזו, יכול להיות שהאפליקציה לא כוללת באופן טבעי פעילויות שאפשר להמשיך כשהמשתמש מנווט למעלה. עם זאת, כשמציינים את המאפיין android:parentActivityName לפעילויות, המערכת מזהה אם האפליקציה כבר מכילה מקבץ אחורי של פעילויות הורה, ואם לא, בונה מקבץ חזרה סינתטי שמכיל את כל הפעילויות של ההורה.

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

כשהמערכת יוצרת מקבץ רקע סינתטי לאפליקציה, היא יוצרת Intent בסיסי כדי ליצור מופע חדש של כל פעילות הורה. אין של פעילויות ההורה, כפי שהיית מצפה שהמשתמש ניווט באופן טבעי עד בכל פעילות. אם אחת מהפעילויות של ההורה בדרך כלל מציגה ממשק משתמש שתלוי ההקשר של המשתמש, מידע זה חסר ועליך לספק אותו כאשר משתמש לחזור במקבץ. למשל, אם המשתמש צופה באלבום באפליקציית מוזיקה, ניווט למעלה עשוי להוביל לפעילות שבה מפורטים כל האלבומים ז'אנר של מוזיקה. במקרה כזה, אם צריך ליצור את המקבץ, צריך לעדכן את ההורה לאיזה ז'אנר האלבום הנוכחי שייך כדי שההורה יוכל להציג את הרשימה המתאימה אם המשתמש באמת הגיע מאותה פעילות. לספק מידע כזה להורה סינתטי פעילות, עליך לשנות את השיטה onPrepareNavigateUpTaskStack(). הזה מספק לך אובייקט TaskStackBuilder שהמערכת יצרה כדי לחבר בין פעילויות ההורה. השדה TaskStackBuilder מכיל אובייקטים של Intent שהמערכת משתמשת בהם כדי ליצור כל פעילות הורה. ב של onPrepareNavigateUpTaskStack(), אפשר לשנות את Intent המתאים להוסיף עוד נתונים שישמשו את הפעילות של ההורה כדי לקבוע את ההקשר המתאים ולהציג אותם ממשק המשתמש המתאים.

כשהמערכת יוצרת את TaskStackBuilder, היא מוסיפה את האובייקטים של Intent שמשמשים ליצירת פעילויות ההורה לפי הלוגיקה הלוגית שלהם. הסדר שמתחיל מראש עץ הפעילות. לכן, ה-Intent האחרון שנוסף למערך הפנימי הוא ההורה הישיר של הפעילות הנוכחית. אם המיקום ברצונך לשנות את Intent עבור הורה של הפעילות, קודם עליך לקבוע אורך המערך עם getIntentCount() ולהעביר אותו לערך editIntentAt().

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

onNavigateUp()
אפשר לשנות את ההגדרה הזו כדי לבצע פעולה מותאמת אישית כשהמשתמש לוחץ על הלחצן 'למעלה'.
navigateUpTo(Intent)
אפשר להתקשר למספר הזה כדי לסיים את הפעילות הנוכחית ולעבור לפעילות שמצוינת על ידי סופקו Intent. אם הפעילות קיימת במקבץ האחורי, אבל הוא לא ההורה הקרוב ביותר, אז כל הפעילויות האחרות בין הפעילות הנוכחית הפעילות שצוינה ב-Intent הסתיימה גם היא.
getParentActivityIntent()
אפשר להתקשר לפונקציה כדי לקבל את ה-Intent שיתחיל את הלוגיקה ההורה של הפעילות הנוכחית.
shouldUpRecreateTask(Intent)
אפשר להפעיל את השאלה הזו כדי לברר אם צריך ליצור מקבץ קודם סינתטי כדי לנווט למעלה. פונקציה זו מחזירה את הערך true אם צריך ליצור מקבץ סינתטי, או FALSE אם המקבץ המתאים כבר קיים.
finishAffinity()
אפשר להתקשר למספר הזה כדי לסיים את הפעילות הנוכחית ואת כל פעילויות ההורה עם אותה הגדרה תחומי עניין משותפים הקשורים לפעילות הנוכחית. אם משנים את התנהגויות ברירת המחדל כמו onNavigateUp(), צריך לקרוא לשיטה הזו כאשר ליצור מקבץ חזרה סינתטי במהלך הניווט למעלה.
onCreateNavigateUpTaskStack
אפשר לשנות את ההגדרה הזו אם אתם צריכים שליטה מלאה באופן שבו נוצרת מקבץ המשימות הסינתטי. אם רוצים פשוט להוסיף עוד כמה נתונים לאובייקטים של Intent במקבץ הקודם, צריך לשנות את הערך של onPrepareNavigateUpTaskStack() במקום זאת.

עם זאת, רוב האפליקציות לא צריכות להשתמש בממשקי ה-API האלה או להטמיע את onPrepareNavigateUpTaskStack(), אבל הן יכולות להשיג את ההתנהגות הנכונה פשוט על ידי להוסיף את הפרמטר android:parentActivityName לכל רכיב של <activity>.

מולטימדיה

קודק מדיה

המחלקה MediaCodec מספקת גישה לקודקי מדיה ברמה נמוכה לקידוד ומקודדים את המדיה. אפשר ליצור מופע של MediaCodec על ידי קריאה ל-createEncoderByType() כדי לקודד מדיה, או להפעיל createDecoderByType() כדי לפענח מדיה. כל אחד מאלה ב-methods נעשה שימוש בסוג MIME לסוג המדיה שרוצים לקודד או לפענח, למשל "video/3gpp" או "audio/vorbis".

כשנוצר מופע של MediaCodec, אפשר לקרוא ל-configure() כדי לציין מאפיינים כמו פורמט המדיה או האם התוכן מוצפן או לא.

לא משנה אם אתם מקודדים או מפענחים את המדיה שלכם, שאר התהליך זהה אחרי יוצרים את MediaCodec. קריאה ראשונה אל getInputBuffers() כדי לקבל מערך של הקלט ByteBuffer ו-getOutputBuffers() כדי לקבל מערך של פלט ByteBuffer אובייקטים.

כשהכול מוכן לקודד או לפענח, צריך להפעיל את הפקודה dequeueInputBuffer() כדי לקבל את מיקום האינדקס של ByteBuffer (ממערך אגירת הנתונים) שבו צריך להשתמש כדי להזין את המקור מדיה. אחרי שממלאים את השדה ByteBuffer במדיה של המקור, יש לשחרר את הבעלות עליו של מאגר הנתונים הזמני באמצעות queueInputBuffer().

בדומה למאגר הנתונים הזמני של הפלט, קוראים לפונקציה dequeueOutputBuffer() כדי לקבל את מיקום האינדקס של ByteBuffer שבו תקבלו את התוצאות. אחרי קריאת הפלט של ByteBuffer, שחרר את הבעלות באמצעות שליחת קריאה אל releaseOutputBuffer().

אפשר לטפל בנתוני מדיה מוצפנים ברכיבי ה-Codec על ידי קריאה ל-queueSecureInputBuffer() יחד עם ממשקי ה-API של MediaCrypto, במקום ממשקי ה-API הרגילים queueInputBuffer().

מידע נוסף על השימוש ברכיבי קודק זמין במסמכי התיעוד של MediaCodec.

הקלטת אודיו בסימון

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

רצועות טקסט מתוזמנות

MediaPlayer מטפל עכשיו בטראקים של טקסט בפורמט In-band וגם בטראקים של טקסט מחוץ למסגרת. טראקים של טקסט מסוג In-band מגיעים כטראק טקסט בתוך מקור מדיה MP4 או 3GPP. טקסט מחוץ למסגרת ניתן להוסיף טראקים כמקור טקסט חיצוני באמצעות method addTimedTextSource(). אחרי כל הטקסט החיצוני נוספו מקורות טראקים, צריך להפעיל את getTrackInfo() כדי לקבל את הרשימה המעודכנת של כל המסלולים הזמינים במקור נתונים.

כדי להגדיר את המסלול לשימוש עם MediaPlayer, צריך קוראים לפונקציה selectTrack() באמצעות האינדקס של הטראק הרצוי.

כדי לקבל התראה כשטראק הטקסט מוכן להשמעה, מטמיעים את ממשק וכרטיס MediaPlayer.OnTimedTextListener אותה אל setOnTimedTextListener().

אפקטי אודיו

בכיתה AudioEffect יש עכשיו תמיכה באודיו נוסף סוגי עיבוד מראש בעת צילום אודיו:

  • ביטול הד אקוסטי (AEC) עם AcousticEchoCanceler מסירה את התרומה של האות שהתקבל מהצד המרוחק מהאות האודיו שנקלט.
  • בקרת בהירות אוטומטית (AGC) עם AutomaticGainControl מנרמל אוטומטית את הפלט של האות שנקלט.
  • סינון רעשים (NS) עם NoiseSuppressor מסירה את רעשי הרקע מהאות שנקלט.

אפשר להחיל את האפקטים האלה של מעבד מידע על אודיו שצולם באמצעות AudioRecord באמצעות אחד מהAudioEffect תת-מחלקות.

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

הפעלה ללא הפסקות

עכשיו אפשר להפעיל השמעה ללא הפסקות בין מכשירים MediaPlayer אובייקטים. בכל שלב לפני הסיום של MediaPlayer הראשונים, התקשרות אל setNextMediaPlayer() ול-Android מנסה להפעיל את השחקן השני ברגע שהמשחק הראשון מפסיק.

נתב מדיה. ממשקי ה-API MediaRouter, MediaRouteActionProvider ו-MediaRouteButton מספקים מנגנונים סטנדרטיים וממשק משתמש כדי לבחור איפה להפעיל מדיה.

מצלמה

תנועת מיקוד אוטומטי

הממשק החדש Camera.AutoFocusMoveCallback מאפשר לכם להאזין לשינויים בתנועת המיקוד האוטומטי. אפשר לרשום את הממשק דרך setAutoFocusMoveCallback(). ואז כשהמצלמה נמצא במצב מיקוד אוטומטי רציף (FOCUS_MODE_CONTINUOUS_VIDEO או FOCUS_MODE_CONTINUOUS_PICTURE), תתקבל שיחה אל onAutoFocusMoving(), מציין אם המיקוד האוטומטי התחיל לנוע או הפסיק לנוע.

צלילי מצלמה

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

כדי להשמיע צליל, פשוט יוצרים אובייקט MediaActionSound, load() כדי לטעון מראש את הצליל הרצוי, ואז מתאים, התקשר אל play().

קישוריות

Android Beam

Android BeamTM תומך עכשיו בהעברות מטענים גדולים באמצעות Bluetooth. כשמגדירים את הנתונים כדי לעבור באמצעות הגרסה החדשה של setBeamPushUris() או ממשק הקריאה החוזרת החדש NfcAdapter.CreateBeamUrisCallback, Android את העברת הנתונים ל-Bluetooth או לאמצעי תחבורה חלופי אחר להשיג מהירויות העברה גבוהות יותר. הוא שימושי במיוחד למטענים ייעודיים (payloads) גדולים כמו קובצי אודיו ואין צורך בהתאמה גלויה בין המכשירים. לא נדרשת כל עבודה נוספת עד באפליקציה שלך כדי לנצל העברות באמצעות Bluetooth.

השיטה setBeamPushUris() לוקחת מערך של אובייקטים מסוג Uri שמציינים את הנתונים שרוצים להעביר מהאפליקציה. לחלופין, אפשר להטמיע את NfcAdapter.CreateBeamUrisCallback ממשק שניתן להגדיר לפעילות שלך על ידי קריאה ל-setBeamPushUrisCallback().

כשמשתמשים באופרטור של קריאה חוזרת, המערכת קוראת ל-method של createBeamUris() של הממשק כאשר משתמש מבצע שיתוף באמצעות Android Beam כדי שתוכלו להגדיר את מזהי ה-URI לשיתוף בזמן השיתוף. האפשרות הזו שימושית אם מזהי ה-URI לשיתוף עשויים להשתנות בהתאם להקשר של המשתמש פעילות, ואילו התקשרות אל setBeamPushUris() היא שימושי כאשר מזהי ה-URI לשיתוף אינם משתנים, וניתן להגדיר אותם מראש בבטחה.

גילוי שירותי רשת

ב-Android 4.1 נוספה תמיכה בגילוי שירות מבוסס-DNS עם שידורים מרובים, וכך ניתן: למצוא שירותים שמוצעים על ידי מכשירים להשוואה באמצעות רשת Wi-Fi ולהתחבר אליהם, כמו מכשירים ניידים, מדפסות, מצלמות, נגני מדיה ומכשירים אחרים שרשומים ברשת המקומית.

החבילה החדשה android.net.nsd כוללת את ממשקי ה-API החדשים, שמאפשרים לך לשדר את השירותים שלכם ברשת המקומית, לגלות מכשירים מקומיים ברשת להתחבר למכשירים.

כדי לרשום את השירות, קודם עליך ליצור NsdServiceInfo ולהגדיר את המאפיינים השונים של השירות באמצעות שיטות כמו setServiceName(), setServiceType(), וגם setPort()

לאחר מכן צריך להטמיע את NsdManager.RegistrationListener ולהעביר אותו אל registerService() עם NsdServiceInfo.

כדי לחפש שירותים ברשת, צריך להטמיע את NsdManager.DiscoveryListener ולהעביר אותו אל discoverServices().

כשמקבלים התקשרות חזרה אל NsdManager.DiscoveryListener לגבי שירותים נמצא, צריך לפתור את השירות באמצעות התקשרות resolveService(), מעבירים אותה של NsdManager.ResolveListener שמקבל אובייקט NsdServiceInfo שמכיל מידע על התגלתה, באופן שמאפשר לך להתחיל את החיבור.

זיהוי שירות P2P של Wi-Fi

ממשקי ה-API של P2P של Wi-Fi משופרים ב-Android 4.1 כדי לתמוך בגילוי שירותים לפני השיוך WifiP2pManager. כך אפשר לחפש מקומות בסביבה ולסנן אותם מכשירים באמצעות שירותים שמשתמשים ב-Wi-Fi P2P לפני ההתחברות למכשיר אחד, בזמן שירות רשת Discovery מאפשר לאתר שירות ברשת מחוברת קיימת (כמו Wi-Fi מקומי עמוק).

לשדר את האפליקציה כשירות באמצעות רשת Wi-Fi כדי שמכשירים אחרים יוכלו לגלות את האפליקציה ולהתחבר אליה, אפשר להתקשר אל addLocalService() אובייקט WifiP2pServiceInfo שמתאר את השירותים של האפליקציות שלך.

כדי להתחיל חיפוש של מכשירים בקרבת מקום באמצעות Wi-Fi, עליך להחליט תחילה אם לתקשר באמצעות Bonjour או Upnp. כדי להשתמש ב-Bonjour, קודם צריך להגדיר כמה מאזינים להתקשרות חזרה עם setDnsSdResponseListeners(), שלוקחת גם WifiP2pManager.DnsSdServiceResponseListener וגם WifiP2pManager.DnsSdTxtRecordListener. כדי להשתמש ב-Upnp, צריך להתקשר setUpnpServiceResponseListener(), עם WifiP2pManager.UpnpServiceResponseListener.

לפני שיתאפשר לך להתחיל לגלות שירותים במכשירים מקומיים, צריך גם להתקשר אל addServiceRequest(). כשהWifiP2pManager.ActionListener שמעבירים לשיטה הזו מקבל קריאה חוזרת (callback) מוצלחת, לאחר מכן ניתן יהיה להתחיל לגלות שירותים במכשירים מקומיים על ידי חיוג אל discoverServices().

כשיאותרו שירותים מקומיים, תתקבל שיחה חוזרת אל WifiP2pManager.DnsSdServiceResponseListener או אל WifiP2pManager.UpnpServiceResponseListener, תלוי אם רשומים לשימוש ב-Bonjour או ב-Upnp. הקריאה החוזרת שהתקבלה בכל אחד מהמקרים מכילה אובייקט WifiP2pDevice שמייצג את המכשיר התואם.

השימוש ברשת

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

נגישות

ממשקי API של שירותי נגישות

פוטנציאל החשיפה של ממשקי ה-API של שירות הנגישות גדל באופן משמעותי ב-Android 4.1. זה עכשיו מאפשר לפתח שירותים שעוקבים אחרי אירועי קלט רבים יותר ומגיבים אליהם, כמו תנועות מורכבות באמצעות onGesture() ועוד אירועי קלט באמצעות תוספות למחלקות AccessibilityEvent, AccessibilityNodeInfo ו-AccessibilityRecord.

שירותי הנגישות יכולים גם לבצע פעולות בשם המשתמש, כולל לחיצה, לגלול ולעבור בין הטקסט באמצעות performAction ו-setMovementGranularities. השיטה performGlobalAction() מאפשר לשירותים גם לבצע פעולות כמו 'חזרה', 'דף הבית' ו'פתיחת 'לאחרונה' אפליקציות והתראות.

ניווט מותאם אישית באפליקציות

כשמפתחים אפליקציה ל-Android, עכשיו אפשר להתאים אישית את סכימות הניווט על ידי התמקדות רכיבים וווידג'טים של קלט באמצעות findFocus() ו-focusSearch(), ולהגדיר מיקוד באמצעות setAccessibilityFocused().

ווידג'טים נגישים יותר

הכיתה החדשה ב-android.view.accessibility.AccessibilityNodeProvider מאפשרת לך להציג תצוגות מורכבות ומותאמות אישית לשירותי הנגישות, כדי שיוכלו להציג את המידע בדרך נגישה יותר. android.view.accessibility.AccessibilityNodeProvider מאפשר למשתמש ווידג'ט עם תוכן מתקדם, כמו רשת לוח שנה, כדי להציג מבנה סמנטי לוגי שירותי נגישות הנפרדים לחלוטין ממבנה הפריסה של הווידג'ט. הסמנטי הזה שמאפשר לשירותי נגישות להציג מודל אינטראקציה שימושי יותר למשתמשים ליקויי ראייה.

העתקה והדבקה

העתקה והדבקה באמצעות Intent

עכשיו אפשר לשייך אובייקט ClipData ל-Intent באמצעות ה-method setClipData(). האפשרות הזו שימושית במיוחד כשמשתמשים בכוונה להעביר מספר מזהי URI של content: למשתמש אחר למשל כאשר משתפים מספר מסמכים. content: מזהי ה-URI שצוינו כך גם תכבד את הדגלים של הכוונה להציע גישת קריאה או כתיבה, וכך תוכל להעניק גישה לכמה מזהי URI מתוך Intent. כשמפעילים Intent מסוג ACTION_SEND או ACTION_SEND_MULTIPLE, מזהי ה-URI שצוינו ב-Intent מופץ באופן אוטומטי אל ClipData כדי שהמקבל יוכל שהוענקה לו.

תמיכה בסגנונות HTML ומחרוזות

המחלקה ClipData תומכת עכשיו בטקסט מסוגנן (כ-HTML או Android מעוצב מחרוזות). אפשר להוסיף טקסט בסגנון HTML לClipData באמצעות newHtmlText().

רינדור

פונקציונליות המחשוב של Renderscript שופרה וכוללת את התכונות הבאות:

  • תמיכה במספר ליבה (kernel) בתוך סקריפט אחד.
  • תמיכה בקריאה מהקצאה באמצעות דוגם מודלים מסוננים ממחשוב בממשק API חדש של סקריפט rsSample
  • תמיכה ברמות דיוק שונות של FP ב-#pragma.
  • תמיכה בהרצת שאילתות על מידע נוסף מאובייקטים של RS מסקריפט מחשוב.
  • שיפורים רבים בביצועים.

פרגמות חדשות זמינות גם כדי להגדיר את דיוק הנקודה הצפה שנדרשת compute Renderscripts. כך ניתן להפעיל פעולות כמו NEON, כמו פעולות מתמטיות וקטוריות מהירות בנתיב המעבד (CPU), שלא ניתן היה לבצע בתקן IEEE 754-2008 המלא.

הערה: המנוע הניסיוני של Renderscript הוא עכשיו הוצא משימוש.

אנימציה

אנימציות להפעלת הפעילות

עכשיו אפשר להפעיל Activity באמצעות אנימציות של זום או אנימציות משלכם בהתאמה אישית. כדי לציין את האנימציה הרצויה, משתמשים בממשקי ה-API של ActivityOptions כדי ליצור Bundle, מעבירים אותו לאחד שיטות שמתחילות פעילות, כמו startActivity().

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

makeScaleUpAnimation()
יצירת אנימציה שמרחיבה את חלון הפעילות בהתאם לנקודת ההתחלה שצוינה במסך וגודל התחלה שצוין. לדוגמה, מסך הבית מערכת Android 4.1 משתמשת באפשרות הזו כשפותחים אפליקציה.
makeThumbnailScaleUpAnimation()
יצירת אנימציה שמגדילת את חלון הפעילות החל מערך שצוין מיקום בתמונה הממוזערת שסופקה. לדוגמה, החלון 'אפליקציות אחרונות' ב- מערכת Android 4.1 משתמשת באפשרות הזו כשחוזרים לאפליקציה.
makeCustomAnimation()
יצירת אנימציה שמוגדרת על ידי המשאבים שלכם: אנימציה שמגדירה את האנימציה פתיחת הפעילות וקריאה נוספת לפעילות שנעצרה.

אנימטור זמן

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

ממשק משתמש

התראות

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

סגנונות של התראות

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

Notification.BigPictureStyle
להתראות שכוללות קובץ תמונה גדול.
Notification.BigTextStyle
להתראות שכוללות הרבה טקסט, כמו הודעת אימייל אחת.
Notification.InboxStyle
להתראות שכוללות רשימת מחרוזות, כמו קטעי טקסט מכמה הודעות אימייל.
פעולות בעת התראה

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

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

עדיפויות

עכשיו אפשר לרמוז למערכת כמה חשובה ההתראה שלך משפיעה על לפי הסדר של ההתראות ברשימה, לפי ההגדרה את העדיפות עם setPriority(). שלך יכול לעבור את אחת מחמש רמות העדיפות השונות האלה, שמוגדרות על ידי קבועי PRIORITY_* בכיתה Notification. ערך ברירת המחדל הוא PRIORITY_DEFAULT, יש שתי רמות גבוהות יותר ושתי רמות נמוכות יותר.

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

אמצעי בקרה לממשק המשתמש של המערכת

מערכת Android 4.0 (Icecream סנדוויץ') הוסיף דגלים חדשים כדי לקבוע את הרשאות הגישה לממשק המשתמש של המערכת. למשל, כדי לעמעם את המראה של סרגל המערכת או להעלים אותו לגמרי בטלפונים ניידים. Android 4.1 מוסיף עוד כמה סימונים שמאפשרים לך לשלוט טוב יותר במראה של המערכת רכיבי ממשק המשתמש ופריסת הפעילות שלך ביחס אליהם באמצעות קריאה ל-setSystemUiVisibility() ונעביר את הדגלים הבאים:

SYSTEM_UI_FLAG_FULLSCREEN
הסתרת ממשק משתמש לא קריטי של המערכת (כמו שורת הסטטוס). אם סרגל הפעולות משמש בפעילות שלך במצב שכבת-על (על ידי מפעיל את android:windowActionBarOverlay), אז הסימון הזה גם מסתיר את סרגל הפעולות באמצעות אנימציה מתואמת כשמסתירים ומראים את שניהם.
SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
הגדרת פריסת הפעילות כך שייעשה שימוש באותו אזור מסך שזמין לאחר SYSTEM_UI_FLAG_FULLSCREEN מופעל גם אם רכיבי ממשק המשתמש של המערכת עדיין גלויים. למרות שחלקים מהפריסה שלך יופיעו בשכבת-על של ממשק המשתמש של המערכת, האפשרות הזו שימושית אם האפליקציה מוסתרת לעיתים קרובות ומציגה את ממשק המשתמש של המערכת עם SYSTEM_UI_FLAG_FULLSCREEN, כי הוא מונע את הפריסה של התאמה לגבולות הפריסה החדשים בכל פעם שממשק המשתמש של המערכת מוסתר או מופיע.
SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
הגדרת פריסת הפעילות כך שייעשה שימוש באותו אזור מסך שזמין לאחר SYSTEM_UI_FLAG_HIDE_NAVIGATION הופעל (נוסף ב-Android 4.0) גם אם רכיבי ממשק המשתמש של המערכת עדיין גלויים. למרות שחלקים מהפריסה שלך מעל סרגל הניווט. האפשרות הזו שימושית אם סרגל הניווט של האפליקציה מוסתר ומציג לעיתים קרובות עם SYSTEM_UI_FLAG_HIDE_NAVIGATION, כי זה מונע מהפריסה שלך התאמה לגבולות הפריסה החדשים בכל פעם שסרגל הניווט מוסתר או מופיע.
SYSTEM_UI_FLAG_LAYOUT_STABLE
מומלץ להוסיף את הסימון הזה אם משתמשים ב-SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN ו/או ב-SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION, כדי לוודא שכשמתקשרים fitSystemWindows() בצפייה הגבולות המוגדרים נשארים עקביים ביחס לשטח המסך הזמין. כלומר, כשהדגל הזה מוגדר, fitSystemWindows() יפעל כאילו החשיפה של רכיבי ממשק המשתמש של המערכת לא השתנתה גם אחרי שהסתרת את כל ממשק המשתמש של המערכת.

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

תצוגות מרחוק

GridLayout ו-ViewStub הן עובדות שניתנות לעדכון כדי שתוכלו להשתמש בהן בפריסות ווידג'טים של אפליקציות ופריסות בהתאמה אישית של התראות.

משפחות גופנים

ב-Android 4.1 נוספו עוד כמה גרסאות של סגנון הגופן Roboto לצורך 10 וריאנטים סה"כ, אפשר להשתמש בהם באפליקציות. לאפליקציות שלך יש עכשיו גישה למערך המלא של גופי תאורה וריאציות מרוכזות.

הקבוצה המלאה של וריאציות הגופן Roboto זמינות:

  • רגיל
  • נטוי
  • מודגש
  • מודגש נטוי
  • חלש
  • נטוי בהיר
  • דחוסה רגילה
  • נטוי מודגש
  • מודגש מודגש
  • מודגש מודגש ונטוי

אפשר ליישם כל אחת מהאפשרויות האלה עם הגרסה החדשה של fontFamily בשילוב עם המאפיין textStyle.

הערכים הנתמכים של הפרמטר fontFamily הם:

  • "sans-serif" ל-Roboto רגיל
  • "sans-serif-light" ל-Roboto Light
  • "sans-serif-condensed" ל-Roboto דחוס

לאחר מכן אפשר להשתמש בטקסט מודגש ו/או נטוי עם ערכים של textStyle "bold" וגם "italic" אפשר להחיל את שני הסוגים, למשל: android:textStyle="bold|italic".

אפשר גם להשתמש ב-Typeface.create(). לדוגמה: Typeface.create("sans-serif-light", Typeface.NORMAL).

מסגרת קלט

מכשירים מרובים לקליטת נתונים

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

אפשר לשלוח שאילתות לכל המכשירים לקליטת נתונים שמחוברים על ידי התקשרות getInputDeviceIds() הפונקציה מחזירה מערך של מספרים שלמים, שכל אחד מהם הוא מזהה של התקן קלט אחר. לאחר מכן תוכלו להתקשר getInputDevice() לצירוף InputDevice למזהה מכשיר הקלט שצוין.

כדי לקבל הודעה כשמכשירי קלט חדשים מחוברים, משתנים או מנותקים, להטמיע את הממשק של InputManager.InputDeviceListener עליך לרשום אותו ב-registerInputDeviceListener().

רטט לבקרי קלט

אם למכשירי קלט מחוברים יש יכולות רטט משלהם, עכשיו אפשר לשלוט הרטט של המכשירים האלה באמצעות ממשקי ה-API הקיימים של Vibrator על ידי חיוג אל getVibrator() בInputDevice.

הרשאות

אלו ההרשאות החדשות:

READ_EXTERNAL_STORAGE
מספק גישת קריאה מוגנת לאחסון חיצוני. ב-Android 4.1 על ידי ברירת מחדל, כל האפליקציות עדיין עם הרשאת קריאה גישה. השם ישתנה בגרסה עתידית כך שיחייבו אפליקציות באופן מפורש גישת קריאה באמצעות ההרשאה הזו. אם האפליקציה כבר מבקשת גישת כתיבה, היא יקבלו באופן אוטומטי גם גישת קריאה. יש אפשרות חדשה למפתחים להפעיל את גישת הקריאה כדי שמפתחים יבדקו את האפליקציות שלהם ביחס להתנהגות של Android העתידי.
android.Manifest.permission.READ_USER_DICTIONARY
מאפשרת לאפליקציה לקרוא את מילון המשתמש. צריך לעשות זאת רק על ידי IME או עורך מילונים כמו אפליקציית ההגדרות.
READ_CALL_LOG
מאפשרת לאפליקציה לקרוא את יומן השיחות של המערכת שמכיל מידע על שיחות נכנסות ויוצאות.
WRITE_CALL_LOG
מאפשרת לאפליקציה לשנות את יומן השיחות של המערכת המאוחסן בטלפון
android.Manifest.permission.WRITE_USER_DICTIONARY
מאפשר לאפליקציה לכתוב למילון המילים של המשתמש.

תכונות המכשיר

ב-Android 4.1 יש הצהרה חדשה על תכונות במכשירים ייעודיים להצגת ממשק המשתמש במסך טלוויזיה: FEATURE_TELEVISION. כדי להצהיר שהאפליקציה שלך דורשת ממשק טלוויזיה, צריך להצהיר על התכונה הזו בקובץ המניפסט עם הרכיב <uses-feature>:

<manifest ... >
    <uses-feature android:name="android.hardware.type.television"
                  android:required="true" />
    ...
</manifest>

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