واجهات برمجة التطبيقات لنظام التشغيل Android 4.1

مستوى واجهة برمجة التطبيقات: 16

يمثّل نظام Android 4.1 (JELLY_BEAN) إصدارًا متقدّمًا من النظام الأساسي الذي يقدّم أداءً محسّنًا وتجربة مستخدم محسّنة. وتضيف ميزات جديدة للمستخدمين ومطوّري التطبيقات. يقدّم هذا المستند مقدّمة عن واجهات برمجة التطبيقات الجديدة الأكثر بروزًا ومنفعة لمطوّري التطبيقات.

بصفتك مطوّر تطبيقات، يتوفّر لك نظام التشغيل Android 4.1 من خلال مدير حِزم تطوير البرامج (SDK) كصورة نظام يمكنك تشغيلها في محاكي Android ومنصّة حزمة تطوير البرامج (SDK) التي يمكنك إنشاء تطبيقك استنادًا إليها. عليك تنزيل صورة النظام والمنصة في أقرب وقت ممكن لإنشاء تطبيقك واختباره على Android 4.1.

لتحسين تطبيقك بشكل أفضل على الأجهزة التي تعمل بالإصدار 4.1 من نظام التشغيل Android، يجب ضبط targetSdkVersion على "16"، وتثبيته على نسخة نظام التشغيل Android 4.1، واختباره، ثم نشر تحديث يتضمن هذا التغيير.

يمكنك استخدام واجهات برمجة التطبيقات في الإصدار 4.1 من نظام التشغيل Android مع إتاحة استخدام الإصدارات القديمة أيضًا من خلال إضافة شروط إلى الرمز البرمجي للتحقّق من مستوى واجهة برمجة تطبيقات النظام قبل تنفيذ واجهات برمجة التطبيقات غير المتوافقة مع minSdkVersion. للاطّلاع على مزيد من المعلومات حول الحفاظ على التوافق مع الإصدارات القديمة، يمكنك قراءة مقالة إنشاء واجهة مستخدم متوافقة مع الإصدارات القديمة.

تتوفّر مزيد من المعلومات حول آلية عمل مستويات واجهة برمجة التطبيقات في مقالة ما هو مستوى واجهة برمجة التطبيقات؟

مكونات التطبيق

الخدمات المعزولة

من خلال تحديد android:isolatedProcess="true" في علامة <service>، سيتم تشغيل Service ضمن عملية رقم تعريف المستخدم المعزولة التي لا تملك أذونات خاصة بها.

إدارة الذاكرة

توفّر الثوابت الجديدة ComponentCallbacks2، مثل TRIM_MEMORY_RUNNING_LOW وTRIM_MEMORY_RUNNING_CRITICAL، لعمليات foreground مزيدًا من المعلومات حول حالة الذاكرة قبل أن يستدعي النظام onLowMemory().

تتيح لك طريقة getMyMemoryState(ActivityManager.RunningAppProcessInfo) الجديدة استرداد حالة الذاكرة العامة.

موفّرو المحتوى

تتيح لك الطريقة الجديدة، acquireUnstableContentProviderClient()، الوصول إلى ContentProviderClient قد يكون "غير مستقر" بحيث لا يتعطّل تطبيقك في حال تعطّل موفّر المحتوى. وهي مفيدة عند التفاعل مع مقدّمي المحتوى في تطبيق منفصل.

خلفيات متحركة

بروتوكول النية الجديد لبدء نشاط معاينة الخلفية المتحركة مباشرةً حتى تتمكّن من مساعدة المستخدمين في اختيار الخلفية المتحركة بسهولة بدون إجبارهم على مغادرة تطبيقك والتنقّل في أداة اختيار الخلفية في "الشاشة الرئيسية"

لتشغيل أداة اختيار الخلفية المتحركة، يمكنك استدعاء 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 الأخيرة التي تمت إضافتها إلى الصفيف الداخلي هي العنصر الرئيسي المباشر للنشاط الحالي. إذا أردت تعديل Intent للعنصر الرئيسي للنشاط، حدِّد أولاً طول المصفوفة باستخدام getIntentCount() ومرِّر هذه القيمة إلى editIntentAt().

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

onNavigateUp()
يمكنك إلغاء هذا الإجراء لتنفيذ إجراء مخصّص عندما يضغط المستخدم على الزر Up (أعلى).
navigateUpTo(Intent)
يمكنك الاتصال بهذا الرقم لإنهاء النشاط الحالي والانتقال إلى النشاط المُشار إليه في السمة Intent المقدَّمة. إذا كان النشاط متوفّرًا في الحزمة الخلفية، ولكن ليس هو العنصر الرئيسي الأقرب، يتم أيضًا إنهاء جميع الأنشطة الأخرى بين النشاط الحالي وactivity المحدّد بالنيّة.
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 على تسويت ناتج الإشارة التي تم التقاطها تلقائيًا.
  • تعمل ميزة "تقليل الضوضاء" (NS) مع NoiseSuppressor على إزالة الضوضاء في الخلفية من الإشارة التي تم تسجيلها.

يمكنك تطبيق تأثيرات المعالجة المسبقة هذه على الصوت الذي تم تسجيله باستخدام AudioRecord باستخدام إحدى الفئات الفرعية AudioEffect.

ملاحظة: لا يمكن ضمان توفّر هذه التأثيرات على جميع الأجهزة، لذا عليك دائمًا التحقّق أولاً من مدى التوفّر من خلال استدعاء isAvailable() في فئة أثر الصوت المعنيّ.

التشغيل بدون انقطاع

يمكنك الآن تشغيل المحتوى بدون أي أجزاء بين عنصرَين منفصلَين من عناصر MediaPlayer. في أي وقت قبل انتهاء أول MediaPlayer، يمكنك الاتصال بـ setNextMediaPlayer() ومحاولة تشغيل المشغّل الثاني فور توقّف المشغّل الأول.

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

الكاميرا

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

تتيح لك الواجهة الجديدة Camera.AutoFocusMoveCallback الاستماع للبحث عن تغييرات في حركة التركيز التلقائي. يمكنك تسجيل واجهتك في setAutoFocusMoveCallback(). وبعد ذلك، عندما تكون الكاميرا في وضع "التركيز التلقائي" المستمر (FOCUS_MODE_CONTINUOUS_VIDEO أو FOCUS_MODE_CONTINUOUS_PICTURE)، ستتلقّى مكالمة على الرقم onAutoFocusMoving() لتُعلمك بما إذا كانت ميزة "التركيز التلقائي" قد بدأت في الحركة أو توقفت عن الحركة.

أصوات الكاميرا

توفّر فئة MediaActionSound مجموعة بسيطة من واجهات برمجة التطبيقات لإنشاء الأصوات العادية التي تصدرها الكاميرا أو إجراءات الوسائط الأخرى. يجب استخدام واجهات برمجة التطبيقات هذه لتشغيل الصوت المناسب عند إنشاء كاميرا ثابتة أو كاميرا فيديو مخصصة.

لتشغيل صوت، ما عليك سوى إنشاء مثيل لكائن MediaActionSound، ثم استدعاء load() لتحميل الصوت المطلوب مسبقًا، ثم استدعاء play() في الوقت المناسب.

إمكانية الاتصال

شعاع Android

تتيح تقنية Android Beam™ الآن نقل حمولات كبيرة عبر البلوتوث. عند تحديد البيانات المراد نقلها باستخدام الطريقة الجديدة setBeamPushUris() أو واجهة طلب معاودة الاتصال الجديدة NfcAdapter.CreateBeamUrisCallback، يُفوِّض Android نقل البيانات إلى البلوتوث أو وسيط نقل بديل آخر لمحاولة تحقيق سرعات نقل أسرع. ويُعدّ هذا الإجراء مفيدًا بشكل خاص للحمولات الكبيرة، مثل الصور والملفات الصوتية، ولا يتطلّب إجراء إقران مرئي بين الأجهزة. ولن يحتاج تطبيقك إلى أي إجراء إضافي للاستفادة من عمليات النقل عبر البلوتوث.

تأخذ طريقة setBeamPushUris() صفيفًا من عناصر Uri التي تحدّد البيانات التي تريد نقلها من تطبيقك. وبدلاً من ذلك، يمكنك تنفيذ واجهة NfcAdapter.CreateBeamUrisCallback التي يمكنك تحديدها لنشاطك من خلال استدعاء setBeamPushUrisCallback().

عند استخدام واجهة callback، يستدعي النظام طريقة createBeamUris() للواجهة عندما ينفِّذ المستخدم عملية مشاركة باستخدام تقنية Android Beam حتى تتمكّن من تحديد عناوين URL المطلوب مشاركتها في وقت المشاركة. يكون ذلك مفيدًا إذا كانت معرّفات الموارد المنتظمة المراد مشاركتها قد تختلف حسب سياق المستخدِم ضمن النشاط، في حين يكون استدعاء setBeamPushUris() مفيدًا عندما تكون معرّفات الموارد المنتظمة المراد مشاركتها ثابتة ويمكنك تحديدها بأمان مسبقًا.

اكتشاف خدمة الشبكة

يتيح نظام التشغيل Android 4.1 إمكانية اكتشاف الخدمات المستندة إلى نظام أسماء النطاقات للبث المتعدد، ما يسمح لك بالعثور على الخدمات التي تقدّمها الأجهزة المشابهة عبر شبكة Wi-Fi والاتصال بها، مثل الأجهزة الجوّالة والطابعات والكاميرات ومشغّلات الوسائط وغيرها من الخدمات المسجّلة في الشبكة المحلية.

تحتوي الحزمة الجديدة android.net.nsd على واجهات برمجة التطبيقات الجديدة التي تتيح لك بث خدماتك على الشبكة المحلية، واكتشاف الأجهزة المحلية على الشبكة، و الاتصال بالأجهزة.

لتسجيل خدمتك، عليك أولاً إنشاء عنصر NsdServiceInfo وتحديد الخصائص المختلفة لخدمتك باستخدام طرق مثل setServiceName() و setServiceType() و setPort().

بعد ذلك، عليك تنفيذ NsdManager.RegistrationListener وإرسالها إلى registerService() مع NsdServiceInfo.

لاكتشاف الخدمات على الشبكة، نفِّذ NsdManager.DiscoveryListener ومرِّره إلى discoverServices().

عندما يتلقّى NsdManager.DiscoveryListener مكالمات للرجوع إلى الخدمات التي تم العثور عليها، عليك حلّ الخدمة من خلال الاتصال resolveService()، مع تمريرها بتطبيق NsdManager.ResolveListener الذي يتلقّى عنصر NsdServiceInfo يحتوي على معلومات عن الخدمة التي تم اكتشافها، ما يتيح لك بدء الاتصال.

اكتشاف خدمة Wi-Fi P2P

تم تحسين واجهات برمجة التطبيقات لبروتوكول Wi-Fi P2P في Android 4.1 لإتاحة اكتشاف خدمة الربط المُسبَق في WifiP2pManager. يتيح لك ذلك اكتشاف الأجهزة المجاورة وفلترتها حسب الخدمات التي تستخدم اتصال Wi-Fi من الند للند قبل الاتصال بجهاز منها، بينما تسمح لك ميزة "اكتشاف خدمة الشبكة" باكتشاف خدمة على شبكة متصلة حالية (مثل شبكة 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).

تسهيل الاستخدام

واجهات برمجة التطبيقات لخدمات تسهيل الاستخدام

تمّت زيادة مدى وصول واجهات برمجة التطبيقات لخدمة تسهيل الاستخدام بشكل كبير في 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: التي يتم تقديمها بهذه الطريقة أيضًا علامات intent التي تتيح إمكانية الوصول للقراءة أو الكتابة، ما يسمح لك بمنح إمكانية الوصول إلى معرّفات موارد منتظمة (URI) متعدّدة لغرض محدّد. عند بدء هدف ACTION_SEND أو ACTION_SEND_MULTIPLE، يتم الآن نشر معرّفات الموارد المنتظمة (URI) المقدّمة في intent في ClipData تلقائيًا لكي يتمكّن المُستلِم من الوصول إليها.

دعم أنماط HTML وأنماط السلاسل

أصبحت الفئة ClipData متوافقة الآن مع النصوص ذات النمط (إما كـ HTML أو سلاسل نمط Android). يمكنك إضافة نص نمط HTML إلى ClipData باستخدام newHtmlText().

Renderscript

تم تحسين وظيفة الحساب في Renderscript من خلال الميزات التالية:

  • إتاحة استخدام نوى متعددة في نص برمجي واحد
  • إتاحة القراءة من عملية التوزيع باستخدام أدوات تحليل ترشيح من Compute في واجهة برمجة تطبيقات جديدة للنصوص البرمجية rsSample
  • إتاحة مستويات مختلفة من دقة FP في #pragma
  • إتاحة طلب معلومات إضافية من عناصر RS من نص برمجي للحساب
  • تحسينات عديدة على الأداء

تتوفّر أيضًا طرق براغا جديدة لتحديد دقة النقطة العائمة التي تتطلّبها نصوص عمليات الحوسبة. يتيح لك ذلك تفعيل العمليات المشابهة لمكتبة NEON، مثل عمليات حسابية المتّجهات السريعة على مسار وحدة المعالجة المركزية (CPU)، ما لم يكن ذلك ممكنًا وفقًا لمعايير IEEE 754-2008 الكاملة.

ملاحظة: تم الآن إيقاف استخدام محرك الرسومات التجريبي Renderscript نهائيًا.

Animation

الصور المتحركة لبدء النشاط

يمكنك الآن إطلاق Activity باستخدام الرسوم المتحرّكة للتكبير/التصغير أو الرسوم المتحرّكة المخصّصة. لتحديد الصورة المتحركة التي تريدها، استخدِم واجهات برمجة تطبيقات ActivityOptions لإنشاء Bundle يمكنك بعد ذلك تمريرها إلى أي من methods التي تبدأ نشاطًا، مثل 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 المكثف

يمكنك بعد ذلك تطبيق الخط الغامق و/أو المائل باستخدام قيم 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
يوفر وصولًا آمنًا للقراءة إلى وحدة التخزين الخارجية. في الإصدار 4.1 من Android، تظل جميع التطبيقات مزوّدة تلقائيًا بإذن قراءة ملفاتك. سيتم تغيير ذلك في إصدار مستقبلي لطلب التطبيقات صراحةً إذن الوصول للقراءة باستخدام هذا الإذن. إذا كان تطبيقك يطلب إذن الكتابة، سيحصل تلقائيًا على إذن القراءة أيضًا. يتوفّر خيار جديد للمطوّرين لتفعيل تقييد الوصول للقراءة، ما يتيح لهم اختبار تطبيقاتهم وفقًا لسلوك Android في المستقبل.
android.Manifest.permission.READ_USER_DICTIONARY
للسماح للتطبيق بقراءة قاموس المستخدم ولا يُفترض أن يطلب ذلك سوى محرِّر واجهة برمجة التطبيقات للكتابة أو محرِّر قاموس مثل تطبيق "الإعدادات".
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>

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