مستوى واجهة برمجة التطبيقات: 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()
ومحاولة تشغيل المشغّل الثاني فور توقّف المشغّل الأول.
الكاميرا
حركة التركيز التلقائي
تتيح لك الواجهة الجديدة 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>
تُعرّف هذه الميزة "التلفزيون" على أنه تجربة تلفزيون عادية في غرفة المعيشة: يُعرض على شاشة كبيرة، حيث يجلس المستخدم بعيدًا، والشكل السائد من طرق الإدخال مثل لوحة التحكّم، وليس من خلال اللمس أو الماوس أو المؤشر.