واجهات برمجة تطبيقات Android 4.1

مستوى واجهة برمجة التطبيقات: 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 تشغيل اللاعب الثاني عند توقف أول لعبة.

موجِّه الوسائط. توفّر واجهات برمجة التطبيقات MediaRouter وMediaRouteActionProvider وMediaRouteButton الجديدة آليات عادية وواجهة مستخدم لاختيار مكان تشغيل الوسائط.

الكاميرا

التركيز التلقائي على الحركة

تتيح لك الواجهة الجديدة 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>

وتُعرّف هذه الميزة "التلفزيون" بأنه تجربة تلفزيونية نموذجية في غرفة المعيشة: يتم عرضه على شاشة كبيرة ويجلس المستخدم بعيدًا، ويكون شكل الإدخال السائد مثلاً لوحة التحكّم، ولا يكون بشكل عام من خلال اللمس أو الماوس أو جهاز التوجيه.