مستوى واجهة برمجة التطبيقات: 16
يُعد Android 4.1 (JELLY_BEAN
)
إصدارًا من نظام التشغيل الأساسي الذي يقدم
أداءً محسنًا وتجربة مستخدم متطورة. وتضيف ميزات جديدة للمستخدمين
ومطوري التطبيقات. يوفر هذا المستند مقدمة لواجهات برمجة التطبيقات
الجديدة الأكثر وضوحًا وفائدة لمطوري التطبيقات.
بصفتك مطور تطبيقات، يتوفر Android 4.1 لك من SDK Manager كصورة نظام يمكنك تشغيله في محاكي Android ومنصة SDK يمكنك من خلالها إنشاء تطبيقك. عليك تنزيل صورة النظام والنظام الأساسي في أقرب وقت ممكن لإنشاء تطبيقك واختباره على الإصدار 4.1 من نظام التشغيل Android.
لتحسين تطبيقك على الأجهزة التي تعمل بالإصدار 4.1 من نظام التشغيل Android بشكل أفضل،
يجب ضبط targetSdkVersion
على
"16"
، وتثبيته على صورة نظام Android 4.1،
واختباره، ثم نشر تحديث يتضمّن هذا التغيير.
يمكنك
استخدام واجهات برمجة التطبيقات في Android 4.1 مع التوافق أيضًا مع الإصدارات القديمة من خلال إضافة
شروط إلى الرمز البرمجي للتحقق من مستوى واجهة برمجة تطبيقات النظام قبل تنفيذ
واجهات برمجة التطبيقات غير المتوافقة مع minSdkVersion
.
لمعرفة المزيد حول الحفاظ على التوافق مع الأنظمة القديمة، يُرجى الاطّلاع على إنشاء واجهات مستخدم متوافقة مع الأنظمة القديمة.
يتوفّر مزيد من المعلومات حول آلية عمل مستويات واجهة برمجة التطبيقات في القسم ما المقصود بمستوى واجهة برمجة التطبيقات؟
مكوّنات التطبيق
الخدمات المعزولة
من خلال تحديد android:isolatedProcess="true"
في العلامة
<service>
، سيتم تشغيل Service
الخاصة بك ضمن عملية خاصة برقم تعريف مستخدم منفصلة لا تملك أذونات خاصة بها.
إدارة الذاكرة
توفّر ثوابت 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()
.
إذا كانت بنية تطبيقك أكثر تعقيدًا، تتوفّر العديد من واجهات برمجة التطبيقات الأخرى المتاحة التي تتيح لك التعامل مع سلوك الانتقال للأعلى وتخصيص الحزمة الخلفية الاصطناعية بالكامل. وتشمل بعض واجهات برمجة التطبيقات التي تمنحك إمكانية تحكُّم إضافية ما يلي:
onNavigateUp()
- يمكنك إلغاء هذا الإجراء لتنفيذ إجراء مخصَّص عندما يضغط المستخدم على الزر للأعلى.
navigateUpTo(Intent)
- يمكنك طلب هذا الرقم لإنهاء النشاط الحالي والانتقال إلى النشاط المُشار إليه في
السمة
Intent
المقدّمة. إذا كان النشاط موجودًا في الحزمة الخلفية، ولكنه ليس أقرب نشاط رئيسي، يتم أيضًا الانتهاء من جميع الأنشطة الأخرى بين النشاط الحالي والنشاط المحدّد بالغرض. getParentActivityIntent()
- يمكنك طلبها للحصول على عنصر
Intent
الذي سيبدأ العنصر الرئيسي المنطقي للنشاط الحالي. shouldUpRecreateTask(Intent)
- يمكنك استدعاء هذا الطلب للاستفسار عما إذا كان يجب إنشاء حزمة خلفية اصطناعية للانتقال إلى الأعلى. تعرض القيمة "true" إذا كان يجب إنشاء تكديس اصطناعي، وتكون "false" إذا كانت متوفرة مسبقًا.
finishAffinity()
- يجب استدعاء هذا الخيار لإنهاء النشاط الحالي وجميع أنشطة الوالدَين التي لها نفس
المهمة ذات الاهتمامات المشتركة والمرتبطة بالنشاط الحالي.
إذا ألغيت السلوكيات التلقائية مثل
onNavigateUp()
، يجب استدعاء هذه الطريقة عند إنشاء حزمة اصطناعية للحزمة الخلفية عند الانتقال إلى الأعلى. onCreateNavigateUpTaskStack
- يمكنك إلغاء هذا الإجراء إذا كنت بحاجة إلى التحكّم بشكل كامل في طريقة إنشاء حزمة المهام الاصطناعية. إذا كنت تريد إضافة بعض البيانات الإضافية إلى أغراض حزمة البيانات السابقة، عليك إلغاء
onPrepareNavigateUpTaskStack()
بدلاً من ذلك.
ومع ذلك، لا تحتاج معظم التطبيقات إلى استخدام واجهات برمجة التطبيقات هذه أو تنفيذ onPrepareNavigateUpTaskStack()
، ولكن يمكنها ببساطة ضبط السلوك الصحيح عن طريق
إضافة android:parentActivityName
إلى كل عنصر من عناصر <activity>
.
وسائط متعددة
برامج ترميز الوسائط
تتيح الفئة MediaCodec
إمكانية الوصول إلى برامج ترميز الوسائط منخفضة المستوى لترميز الوسائط وفك ترميزها. يمكنك إنشاء مثيل لـ MediaCodec
من خلال طلب createEncoderByType()
لترميز الوسائط أو طلب createDecoderByType()
لفك ترميز الوسائط. تتخذ كل طريقة من هذه الطرق نوع MIME لنوع الوسائط التي تريد ترميزها أو فك ترميزها، مثل "video/3gpp"
أو "audio/vorbis"
.
باستخدام مثيل لـ MediaCodec
الذي تم إنشاؤه، يمكنك استدعاء configure()
لتحديد خصائص مثل تنسيق الوسائط أو ما إذا كان المحتوى مشفَّرًا أم لا.
سواء كنت تعمل على ترميز الوسائط أو فك ترميزها، ستبقى العملية نفسها بعد إنشاء MediaCodec
. يمكنك استدعاء getInputBuffers()
أولاً للحصول على مصفوفة من كائنات ByteBuffer
وgetOutputBuffers()
للحصول على صفيف من كائنات ByteBuffer
للمخرجات.
عندما تكون مستعدًا للترميز أو فك الترميز، اطلب dequeueInputBuffer()
للحصول على موضع الفهرس في ByteBuffer
(من مصفوفة المخازن المؤقتة للإدخال) والذي عليك استخدامه لإنشاء البيانات في وسائط المصدر. بعد ملء ByteBuffer
بوسائط المصدر، يجب رفع ملكية
المخزن المؤقت عن طريق استدعاء queueInputBuffer()
.
بالنسبة إلى المخزن المؤقت للمخرجات، عليك استدعاء dequeueOutputBuffer()
للحصول على موضع الفهرس في ByteBuffer
حيث ستتلقّى النتائج. بعد قراءة المخرجات من ByteBuffer
،
عليك سحب الملكية من خلال طلب releaseOutputBuffer()
.
يمكنك التعامل مع بيانات الوسائط المشفرة في برامج الترميز من خلال طلب queueSecureInputBuffer()
بالاقتران مع واجهات برمجة تطبيقات MediaCrypto
، بدلاً من queueInputBuffer()
العادية.
لمزيد من المعلومات حول كيفية استخدام برامج الترميز، يمكنك الاطّلاع على مستندات MediaCodec
.
تسجيل الصوت عند التنبيه
تتيح لك الطريقة الجديدة startRecording()
بدء التسجيل الصوتي بالاستناد إلى تلميح محدّد في MediaSyncEvent
.
تحدّد السمة MediaSyncEvent
جلسة صوتية
(مثل الجلسة المحدّدة في MediaPlayer
)، وعند اكتمالها، يتم تشغيل
مسجّل الصوت لبدء التسجيل. على سبيل المثال، يمكنك استخدام هذه الوظيفة لتشغيل نغمة صوتية تشير إلى بداية جلسة التسجيل، وسيبدأ التسجيل تلقائيًا حتى لا تضطر إلى مزامنة النغمة وبداية التسجيل يدويًا.
مسارات النصوص المحدّدة زمنيًا
تعالج "MediaPlayer
" الآن المقاطع الصوتية داخل النطاق وخارجه.
تأتي المسارات النصية ضمن النطاق كمسار نصي ضمن مصدر وسائط MP4 أو 3GPP. يمكن إضافة المسارات النصية
خارج الإطار كمصدر نص خارجي عبر طريقة addTimedTextSource()
. بعد إضافة جميع مصادر المسارات النصية
الخارجية، يجب استدعاء getTrackInfo()
للحصول على
القائمة المحدّثة لجميع المقاطع الصوتية المتاحة في مصدر بيانات.
لضبط المسار من أجل استخدامه مع MediaPlayer
، يجب استدعاء selectTrack()
، باستخدام موضع الفهرس للمسار الذي تريد استخدامه.
ليتم إشعارك عندما يكون المقطع الصوتي النصي جاهزًا للتشغيل، نفِّذ واجهة
MediaPlayer.OnTimedTextListener
وأرسله
إلى setOnTimedTextListener()
.
تأثيرات الصوت
تتيح الصف AudioEffect
الآن أنواعًا إضافية من المعالجة المسبقة للصوت عند التقاط الصوت:
- تعمل أداة إلغاء صدى الصوت (AEC) مع
AcousticEchoCanceler
على إزالة مساهمة الإشارة المُستلَمة من الطرف البعيد من الإشارة الصوتية التي تم تسجيلها. - يعمل التحكّم التلقائي في الكسب (AGC) من خلال
AutomaticGainControl
على ضبط ناتج الإشارة التي تم التقاطها تلقائيًا. - تتم إزالة الضوضاء في الخلفية من الإشارة التي تم التقاطها باستخدام أداة
NoiseSuppressor
.
يمكنك تطبيق تأثيرات المعالجات التمهيدية هذه على الصوت الذي تم التقاطه باستخدام AudioRecord
باستخدام إحدى
فئات AudioEffect
الفرعية.
ملاحظة: لا يمكن ضمان أنّ جميع الأجهزة تدعم هذه التأثيرات، لذا عليك دائمًا التحقّق أولاً من مدى التوفّر من خلال الاتصال بـ isAvailable()
على فئة التأثيرات الصوتية المقابلة.
تشغيل المحتوى بلا فجوات
يمكنك الآن تشغيل المحتوى بسلاسة بين عنصرَي
MediaPlayer
منفصلَين. في أي وقت قبل انتهاء أول MediaPlayer
،
يمكنك الاتصال بـ setNextMediaPlayer()
ويحاول Android
تشغيل اللاعب الثاني عند توقف أول لعبة.
الكاميرا
التركيز التلقائي على الحركة
تتيح لك الواجهة الجديدة Camera.AutoFocusMoveCallback
الاستماع
إلى التغييرات التي تطرأ على حركة التركيز التلقائي. يمكنك تسجيل واجهتك من خلال setAutoFocusMoveCallback()
. وعندما تكون الكاميرا
في وضع "التركيز التلقائي" المستمر (FOCUS_MODE_CONTINUOUS_VIDEO
أو
FOCUS_MODE_CONTINUOUS_PICTURE
)، ستتلقّى مكالمة إلى
رقم onAutoFocusMoving()
لإعلامك بما إذا كان التركيز التلقائي قد بدأ في التحرك أو توقف عن الحركة.
أصوات الكاميرا
توفّر فئة MediaActionSound
مجموعة بسيطة من واجهات برمجة التطبيقات لإنتاج أصوات عادية تصدرها الكاميرا أو غير ذلك من إجراءات الوسائط. يجب عليك استخدام واجهات برمجة التطبيقات هذه لتشغيل الصوت
المناسب عند إنشاء كاميرا ثابتة أو كاميرا فيديو مخصّصة.
لتشغيل صوت، ما عليك سوى إنشاء مثيل لكائن MediaActionSound
وطلب
من "load()
" تحميل الصوت المطلوب مسبقًا، ثم
استدعاء "play()
" في الوقت المناسب.
إمكانية الاتصال
شعاع Android
يدعم Android BeamTM الآن عمليات نقل الحمولات الكبيرة عبر البلوتوث. عند تحديد البيانات
المطلوب نقلها باستخدام طريقة setBeamPushUris()
الجديدة أو واجهة معاودة الاتصال الجديدة NfcAdapter.CreateBeamUrisCallback
، يتولّى Android
نقل البيانات إلى البلوتوث أو وسيلة نقل بديلة أخرى
لتحقيق سرعات نقل أسرع. ويُعدّ هذا الإجراء مفيدًا بشكل خاص للحمولات الكبيرة مثل ملفات الصور
والصوتية ولا يتطلّب إقرانًا مرئيًا بين الأجهزة. لا يحتاج تطبيقك إلى أي عمل إضافي للاستفادة من عمليات النقل عبر البلوتوث.
تستخدم الطريقة setBeamPushUris()
مصفوفة من كائنات Uri
التي تحدّد البيانات التي تريد نقلها من تطبيقك.
بدلاً من ذلك، يمكنك استخدام واجهة NfcAdapter.CreateBeamUrisCallback
التي يمكنك تحديدها لنشاطك من خلال استدعاء setBeamPushUrisCallback()
.
عند استخدام واجهة معاودة الاتصال، يستدعي النظام طريقة createBeamUris()
للواجهة عندما ينفّذ المستخدم مشاركة باستخدام شعاع Android بحيث يمكنك تحديد معرّفات الموارد المنتظمة (URI) لمشاركتها في وقت المشاركة.
يكون هذا الإجراء مفيدًا إذا كانت معرّفات الموارد المنتظمة (URI) التي ستتم مشاركتها قد تختلف بناءً على سياق المستخدم ضمن النشاط، في حين أنّ استدعاء setBeamPushUris()
يكون مفيدًا عندما لا تتغير عناوين URL المراد مشاركتها ويمكنك تحديدها بشكل مسبق.
اكتشاف خدمة الشبكة
يضيف Android 4.1 الدعم لاكتشاف الخدمات المستندة إلى نظام أسماء النطاقات (DNS) ذات البث المتعدد، والتي تسمح لك بالعثور على الخدمات التي تقدّمها الأجهزة المشابهة عبر Wi-Fi والاتصال بها، مثل الأجهزة الجوّالة والطابعات والكاميرات ومشغّلات الوسائط وغيرها من الخدمات المسجّلة على الشبكة المحلية.
تحتوي الحزمة الجديدة android.net.nsd
على واجهات برمجة التطبيقات الجديدة التي تتيح لك
بث خدماتك على الشبكة المحلية واكتشاف الأجهزة المحلية على الشبكة
والاتصال بالأجهزة.
لتسجيل الخدمة، يجب أولاً إنشاء عنصر NsdServiceInfo
وتحديد السمات المختلفة لخدمتك باستخدام طُرق مثل setServiceName()
وsetServiceType()
وsetPort()
.
بعد ذلك، يجب تنفيذ علامة NsdManager.RegistrationListener
وتمريرها إلى registerService()
باستخدام NsdServiceInfo
.
لاكتشاف الخدمات على الشبكة، يمكنك تطبيق NsdManager.DiscoveryListener
وتمريرها إلى discoverServices()
.
عندما يتلقّى NsdManager.DiscoveryListener
استدعاءات عن الخدمات
التي تم العثور عليها، عليك حلّ المشكلة من خلال استدعاء
resolveService()
، عبر تنفيذ الإجراء NsdManager.ResolveListener
الذي يتلقّى عنصر NsdServiceInfo
يحتوي على معلومات حول
الخدمة التي تم اكتشافها، ما يسمح لك ببدء الاتصال.
اكتشاف خدمة P2P لشبكة Wi-Fi
تم تحسين واجهات برمجة التطبيقات لشبكة Wi-Fi (P2P) في نظام التشغيل Android 4.1 لإتاحة اكتشاف خدمة الربط المسبق
في WifiP2pManager
. ويتيح لك ذلك اكتشاف الأجهزة القريبة وتصفيتها حسب الخدمات باستخدام شبكة Wi-Fi P2P قبل الاتصال بأي منها، في حين تسمح لك ميزة Network Service Discovery باكتشاف خدمة على شبكة متصلة حاليًا (مثل شبكة Wi-Fi محلية).
لبث تطبيقك كخدمة عبر شبكة Wi-Fi حتى تتمكن الأجهزة الأخرى من اكتشاف
تطبيقك والاتصال به، يمكنك استدعاء addLocalService()
مع تضمين
عنصر WifiP2pServiceInfo
يصف خدمات التطبيقات.
لبدء رصد الأجهزة المجاورة عبر Wi-Fi، عليك أولاً تحديد ما إذا كنت تريد التواصل باستخدام Bonjour أو Upnp. لاستخدام Bonjour، يجب أولاً إعداد بعض أدوات معالجة المكالمات من خلال setDnsSdResponseListeners()
، والتي تستخدم في الوقت نفسه WifiP2pManager.DnsSdServiceResponseListener
وWifiP2pManager.DnsSdTxtRecordListener
. لاستخدام Upnp، يمكنك استدعاء setUpnpServiceResponseListener()
، الذي يتطلب WifiP2pManager.UpnpServiceResponseListener
.
قبل البدء باكتشاف الخدمات على الأجهزة المحلية، يجب أيضًا الاتصال برقم addServiceRequest()
. عندما يتلقّى WifiP2pManager.ActionListener
الذي تضبطه إلى هذه الطريقة معاودة اتصال ناجحة، يمكنك البدء باكتشاف الخدمات على الأجهزة المحلية من خلال الاتصال بالرقم discoverServices()
.
عند اكتشاف الخدمات المحلية، ستتلقّى معاودة الاتصال إما إلى WifiP2pManager.DnsSdServiceResponseListener
أو WifiP2pManager.UpnpServiceResponseListener
، بناءً على ما إذا
كنت قد سجّلت لاستخدام Bonjour أو Upnp. يتضمّن رد الاتصال الذي تم استلامه في كلتا الحالتين عنصر WifiP2pDevice
يمثّل الجهاز النظير.
بيانات استخدام الشبكة
تتيح لك الطريقة الجديدة "isActiveNetworkMetered()
" التحقّق
مما إذا كان الجهاز متصلاً حاليًا بشبكة تفرض تكلفة استخدام. ومن خلال التحقق من هذه الحالة قبل إجراء معاملات مكثفة للشبكة، يمكنك المساعدة في إدارة استخدام البيانات الذي قد يكلف المستخدمين أموالاً، واتخاذ قرارات مدروسة بشأن ما إذا كان سيتم إجراء المعاملات الآن أو في وقت لاحق (مثلاً، عندما يصبح الجهاز متصلاً بشبكة Wi-Fi).
تسهيل الاستخدام
واجهات برمجة التطبيقات لخدمات تسهيل الاستخدام
تمت زيادة مدى وصول واجهات برمجة التطبيقات لخدمة إمكانية الوصول بشكل كبير في الإصدار Android 4.1. ويتيح لك ذلك الآن إنشاء خدمات تراقب المزيد من أحداث الإدخال وتستجيب لها، مثل الإيماءات المعقّدة
باستخدام onGesture()
وأحداث الإدخال الأخرى من خلال الإضافات إلى الفئات AccessibilityEvent
وAccessibilityNodeInfo
وAccessibilityRecord
.
يمكن لخدمات تسهيل الاستخدام أيضًا تنفيذ إجراءات نيابةً عن المستخدم، بما في ذلك النقر على النص
والانتقال إليه والتنقل خلاله باستخدام performAction
وsetMovementGranularities
. تسمح طريقة performGlobalAction()
أيضًا للخدمات بتنفيذ إجراءات، مثل "الرجوع" و"الشاشة الرئيسية" وفتح التطبيقات والإشعارات المستخدَمة مؤخرًا.
إمكانية تخصيص التنقل بين التطبيقات
عند إنشاء تطبيق Android، يمكنك الآن تخصيص مخططات التنقّل من خلال العثور على عناصر يمكن التركيز عليها وأدوات الإدخال باستخدام findFocus()
وfocusSearch()
، وضبط التركيز باستخدام setAccessibilityFocused()
.
المزيد من التطبيقات المصغّرة سهلة الاستخدام
تتيح لك فئة android.view.accessibility.AccessibilityNodeProvider
الجديدة عرض طرق العرض المخصّصة المعقدة على خدمات تسهيل الاستخدام التي يمكنها تقديم المعلومات بطريقة أسهل. تسمح android.view.accessibility.AccessibilityNodeProvider
لأداة المستخدم التي تتضمن محتوى متقدمًا، مثل شبكة التقويم، بتقديم بنية دلالية منطقية لخدمات إمكانية الوصول تكون منفصلة تمامًا عن بنية تخطيط الأداة. يسمح هذا الهيكل الدلالي
لخدمات إمكانية الوصول بتقديم نموذج تفاعل أكثر فائدة للمستخدمين
من ضعاف البصر.
النسخ واللصق
النسخ واللصق مع الأغراض
يمكنك الآن ربط عنصر ClipData
بعنصر Intent
باستخدام الطريقة setClipData()
.
يُعدّ ذلك مفيدًا على وجه الخصوص عند استخدام غرض لنقل معرِّفات موارد منتظمة (URI) content:
متعددة إلى تطبيق آخر، كما هو الحال عند مشاركة مستندات متعددة. ستراعي معرّفات الموارد المنتظمة (URI) content:
التي يتم توفيرها بهذه الطريقة أيضًا علامات الغرض لتوفير إذن الوصول للقراءة أو الكتابة، ما يسمح لك بمنح إذن الوصول إلى معرّفات موارد متعددة متعددة في الغرض. عند بدء هدف ACTION_SEND
أو ACTION_SEND_MULTIPLE
، يتم الآن نشر معرّفات الموارد المنتظمة (URI) المقدّمة في الغرض تلقائيًا في ClipData
بحيث يتم منح المستلِم
الوصول إليها.
دعم أنماط HTML والسلاسل
تتيح الفئة ClipData
الآن استخدام النصوص ذات النمط (إما كسلاسل HTML أو
سلاسل بنمط Android). يمكنك إضافة نص بنمط HTML إلى ClipData
باستخدام newHtmlText()
.
عرض النص
تم تحسين وظيفة حساب Renderscript باستخدام الميزات التالية:
- دعم العديد من النواة في نص برمجي واحد
- إتاحة القراءة من التخصيص باستخدام نماذج الحوسبة من نظام الحوسبة في واجهة برمجة تطبيقات جديدة لنص برمجي
rsSample
- دعم مستويات مختلفة من دقة دقة الإطار في
#pragma
. - دعم الاستعلام عن معلومات إضافية من كائنات RS من نص برمجي للحوسبة
- تم إدخال تحسينات متعددة على الأداء.
تتوفر أيضًا نماذج جديدة لتحديد دقة النقطة العائمة المطلوبة من خلال نصوص الحوسبة الخاصة بك. وهذا يتيح لك تمكين NEON، مثل العمليات الحسابية للمتجهات السريعة على مسار وحدة المعالجة المركزية، والتي لن يكون ممكنًا بخلاف ذلك مع معيار IEEE 754-2008 الكامل.
ملاحظة: تم إيقاف محرّك رسومات Renderscript التجريبي الآن.
Animation
الصور المتحركة لإطلاق النشاط
يمكنك الآن تشغيل Activity
باستخدام الرسوم المتحركة للتكبير أو التصغير أو الصور المتحركة المخصّصة التابعة لك. لتحديد الصورة المتحركة التي تريدها، استخدِم واجهات برمجة التطبيقات ActivityOptions
لإنشاء Bundle
يمكنك تمريرها بعد ذلك إلى أي من الطرق التي تبدأ نشاطًا، مثل startActivity()
.
تتضمن فئة ActivityOptions
طريقة مختلفة لكل نوع
من الصور المتحركة التي قد ترغب في عرضها عند فتح نشاطك:
makeScaleUpAnimation()
- ينشئ صورة متحركة تعمل على توسيع نطاق نافذة النشاط من موضع بداية محدّد على الشاشة ومن حجم بداية محدّد. على سبيل المثال، تستخدم الشاشة الرئيسية في Android 4.1 هذا الخيار عند فتح تطبيق.
makeThumbnailScaleUpAnimation()
- يتم إنشاء صورة متحرّكة تعمل على توسيع نطاق نافذة النشاط بدءًا من موضع محدَّد ومن صورة مصغّرة يتم تقديمها. على سبيل المثال، تستخدم نافذة "التطبيقات المستخدَمة مؤخرًا" في Android 4.1 هذا الخيار عند الرجوع إلى أحد التطبيقات.
makeCustomAnimation()
- يؤدي هذا الخيار إلى إنشاء صورة متحركة تحدّدها مواردك الخاصة: صورة تحدّد الصورة المتحركة للنشاط الجاري والأخرى للنشاط الذي يتم إيقافه.
مؤثرات الوقت
يوفّر TimeAnimator
الجديد آلية بسيطة لمعاودة الاتصال باستخدام TimeAnimator.TimeListener
التي ترسل إشعارًا إليك عند كل إطار من الصورة المتحركة. ما مِن مدة أو استقراء داخلي أو ضبط لقيمة العنصر باستخدام أداة إنشاء الصور المتحرّكة هذه. يتلقّى معاودة الاتصال الخاصة بالمستمع معلومات عن كل إطار، بما في ذلك إجمالي الوقت المنقضي والوقت المنقضي منذ الإطار السابق للرسم المتحرك.
واجهة المستخدم
الإشعارات
في نظام التشغيل Android 4.1، يمكنك إنشاء إشعارات تتضمن مناطق محتوى أكبر ومعاينات للصور الكبيرة وأزرار إجراءات متعددة وأولوية قابلة للضبط.
أنماط الإشعارات
تتيح لك الطريقة الجديدة setStyle()
تحديد
نمط واحد من ثلاثة أنماط جديدة للإشعار أنّ كل نمط يوفّر منطقة محتوى أكبر. لتحديد نمط منطقة المحتوى الكبيرة، مرر setStyle()
بأحد الكائنات التالية:
Notification.BigPictureStyle
- بالنسبة إلى الإشعارات التي تتضمن مرفق صورة كبيرًا
Notification.BigTextStyle
- بالنسبة إلى الإشعارات التي تتضمن قدرًا كبيرًا من النصوص، مثل رسالة إلكترونية واحدة
Notification.InboxStyle
- بالنسبة إلى الإشعارات التي تتضمن قائمة من السلاسل، مثل المقتطفات من رسائل إلكترونية متعددة.
إجراءات الإشعارات
يتوفّر الآن زرَّي إجراء كحدّ أقصى في أسفل رسالة الإشعار، سواء كان الإشعار يستخدم النمط العادي أو النمط الأكبر.
لإضافة زر إجراء، اتصل بالرقم addAction()
. تستخدم هذه الطريقة ثلاث وسيطات: مورد قابل للرسم لرمز،
ونص للزر، وPendingIntent
تحدّد الإجراء
المطلوب تنفيذه.
الأولويات
يمكنك الآن أن تشير إلى النظام في مدى أهمية تأثير الإشعار في ترتيب الإشعار في القائمة، وذلك من خلال ضبط مستوى الأولوية باستخدام setPriority()
. يمكنك اجتياز هذا المستوى من المستويات الخمسة المختلفة للأولوية المحددة من خلال ثوابت PRIORITY_*
في فئة Notification
. القيمة التلقائية هي PRIORITY_DEFAULT
، وهناك مستويان أعلى ومستويان أقل.
الإشعارات ذات الأولوية العالية هي إشعارات يرغب المستخدمون عمومًا في الاستجابة لها بسرعة، مثل رسالة فورية جديدة أو رسالة نصية أو تذكير بحدث وشيك. الإشعارات ذات الأولوية المنخفضة هي أمور مثل أحداث التقويم المنتهية الصلاحية أو العروض الترويجية للتطبيقات.
عناصر التحكُّم في واجهة مستخدم النظام
أضاف نظام التشغيل Android 4.0 (Ice كريمساندويتش) علامات جديدة للتحكم في رؤية عناصر واجهة المستخدم الخاصة بالنظام، مثل تعتيم شريط النظام أو جعله يختفي تمامًا على الهواتف المحمولة.
يضيف 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 Condensed
يمكنك بعد ذلك تطبيق التنسيق الغامق و/أو المائل باستخدام قيم textStyle
"bold"
و"italic"
. يمكنك تطبيقهما على النحو التالي: android:textStyle="bold|italic"
.
ويمكنك أيضًا استخدام Typeface.create()
.
مثلاً: Typeface.create("sans-serif-light", Typeface.NORMAL)
إطار عمل الإدخال
أجهزة إدخال متعددة
تتيح لك الفئة InputManager
الجديدة إجراء طلبات بحث عن مجموعة أجهزة الإدخال المتصلة حاليًا والتسجيل ليتم إرسال إشعار إليك عند إضافة جهاز جديد أو تغييره أو إزالته. يكون ذلك مفيدًا بشكل خاص إذا كنت تصمم لعبة
تتوافق مع عدة لاعبين وتريد اكتشاف عدد وحدات التحكم المتصلة
ومتى تطرأ التغييرات على عدد وحدات التحكم.
يمكنك الاستعلام عن جميع أجهزة الإدخال المتصلة من خلال الاتصال بالرقم
getInputDeviceIds()
. يؤدي ذلك إلى عرض صفيف من الأعداد الصحيحة، حيث يكون كل رقم تعريفًا لجهاز إدخال مختلف. يمكنك بعد ذلك استدعاء
getInputDevice()
للحصول على
InputDevice
لرقم تعريف جهاز إدخال محدّد.
إذا كنت تريد تلقّي إشعار عند توصيل أجهزة إدخال جديدة أو تغييرها أو فصلها،
يمكنك تنفيذ واجهة InputManager.InputDeviceListener
وتسجيلها من خلال registerInputDeviceListener()
.
اهتزاز وحدات التحكم في الإدخال
إذا كانت أجهزة الإدخال المتصلة تتضمن إمكانات الاهتزاز الخاصة بها، يمكنك الآن التحكّم
في اهتزاز تلك الأجهزة باستخدام واجهات برمجة تطبيقات 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>
وتُعرّف هذه الميزة "التلفزيون" بأنه تجربة تلفزيونية نموذجية في غرفة المعيشة: يتم عرضه على شاشة كبيرة ويجلس المستخدم بعيدًا، ويكون شكل الإدخال السائد مثلاً لوحة التحكّم، ولا يكون بشكل عام من خلال اللمس أو الماوس أو جهاز التوجيه.