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

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

بالنسبة إلى المطورين، يتوفر نظام Android 3.0 الأساسي (HONEYCOMB) كمكون قابل للتنزيل لحزمة Android SDK. ويتضمن النظام الأساسي القابل للتنزيل مكتبة Android وصورة نظام، بالإضافة إلى مجموعة من مظاهر المحاكيات والمزيد. لا يتضمن النظام الأساسي القابل للتنزيل مكتبات خارجية.

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

نظرة عامة على واجهة برمجة التطبيقات

تقدم الأقسام أدناه نظرة عامة فنية على الميزات الجديدة للمطوّرين في Android 3.0، بما في ذلك الميزات والتغييرات الجديدة في واجهة برمجة التطبيقات لإطار العمل منذ الإصدار السابق.

الأجزاء

الجزء هو مكون إطار عمل جديد يسمح لك بفصل العناصر المميزة لنشاط ما إلى وحدات مستقلة تحدد واجهة المستخدم ودورة الحياة الخاصة بها. لإنشاء جزء، يجب تمديد الفئة Fragment وتنفيذ عدة طرق لمعاودة الاتصال في مراحل النشاط، على غرار Activity. يمكنك بعد ذلك دمج عدة أجزاء في نشاط واحد لإنشاء واجهة مستخدم متعددة الأجزاء تدير فيها كل جزء دورة حياتها ومدخلات المستخدم الخاصة بها.

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

علاوةً على ذلك:

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

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

لإجراء معاملة، مثل إضافة جزء أو إزالته، عليك إنشاء FragmentTransaction. يمكنك حينها استدعاء طرق مثل add() remove()، أو replace(). بعد تطبيق كل التغييرات التي تريد إجراءها للمعاملة، عليك استدعاء commit() وسيطبّق النظام العملية المجزّأة على النشاط.

لمزيد من المعلومات حول استخدام الأجزاء، اقرأ مستندات الأجزاء. تتوفر أيضًا عدة نماذج في تطبيق واجهات برمجة التطبيقات التجريبية.

شريط الإجراءات

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

  • أضف عناصر القائمة مباشرة في شريط الإجراءات - كـ "عناصر عمل".

    في بيان XML لعنصر القائمة، أدرِج السمة android:showAsAction مع قيمة "ifRoom". عندما تكون هناك مساحة كافية، يظهر عنصر القائمة مباشرة في شريط الإجراءات. بخلاف ذلك، يتم وضع العنصر في القائمة الكاملة، التي يتم إظهارها من خلال أيقونة القائمة على الجانب الأيمن من شريط الإجراءات.

  • استبدِل بند عمل بأداة (مثل مربّع بحث)، ما يؤدي إلى إنشاء "عرض إجراء".

    في إعلان XML لعنصر القائمة، أضِف السمة android:actionViewLayout مع مورد تنسيق أو السمة android:actionViewClass مع اسم فئة الأداة. (يجب أيضًا الإفصاح عن السمة android:showAsAction كي تظهر السلعة في شريط الإجراءات). إذا لم تكن هناك مساحة كافية في شريط الإجراءات وظهر العنصر في القائمة الكاملة، فإنه يتصرف كعنصر قائمة عادي ولا يعرض التطبيق المصغّر.

  • إضافة إجراء إلى شعار التطبيق واستبداله بشعار مخصّص

    يتم تلقائيًا تعيين رقم تعريف android.R.id.home لشعار التطبيق، ويتم تسليمه من خلال النظام إلى معاودة الاتصال onOptionsItemSelected() الخاصة بنشاطك عند لمسه. ما عليك سوى الرد على رقم التعريف هذا في طريقة رد الاتصال لتنفيذ إجراء مثل الانتقال إلى نشاط "الصفحة الرئيسية" لتطبيقك.

    لاستبدال الرمز بشعار، حدِّد شعار تطبيقك في ملف البيان باستخدام السمة android:logo، ثم استدعِ setDisplayUseLogoEnabled(true) في نشاطك.

  • إضافة أشرطة تنقُّل للتنقل للخلف خلال الحزمة الخلفية للأجزاء
  • إضافة علامات تبويب أو قائمة منسدلة للتنقّل بين الأجزاء
  • تخصيص شريط الإجراءات باستخدام المظاهر والخلفيات

يتوفر شريط الإجراءات بشكل قياسي لجميع التطبيقات التي تستخدم المظهر المجسم الجديد، والذي يعد قياسيًا أيضًا عند ضبط android:minSdkVersion أو android:targetSdkVersion على "11".

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

حافظة النظام

يمكن للتطبيقات الآن نسخ البيانات ولصقها (بخلاف النص) من وإلى الحافظة على مستوى النظام. وقد تكون البيانات التي يتم قطعها عبارة عن نص عادي أو معرّف موارد منتظم (URI) أو غرض.

فمن خلال إتاحة وصول النظام إلى البيانات التي تريد أن ينسخها المستخدم، من خلال موفّر المحتوى، يمكن للمستخدم نسخ المحتوى المعقد (مثل صورة أو بنية بيانات) من التطبيق ولصقه في تطبيق آخر يتوافق مع هذا النوع من المحتوى.

لبدء استخدام الحافظة، احصل على كائن ClipboardManager العام من خلال طلب getSystemService(CLIPBOARD_SERVICE).

لنسخ عنصر إلى الحافظة، عليك إنشاء كائن ClipData جديد يحتوي على كائن ClipData.Item واحد أو أكثر، يصف كل عنصر فيه كيانًا واحدًا. لإنشاء عنصر ClipData يحتوي على ClipData.Item واحد فقط، يمكنك استخدام إحدى الطرق المساعدة، مثل newPlainText() وnewUri() وnewIntent()، والتي تعرض كل منها عنصر ClipData تم تحميله مسبقًا مع ClipData.Item التي تقدّمها.

لإضافة "ClipData" إلى الحافظة، عليك تمريره إلى "setPrimaryClip()" لمثيل ClipboardManager.

ويمكنك بعد ذلك قراءة ملف من الحافظة (للصقه) عن طريق استدعاء getPrimaryClip() على ClipboardManager. قد تكون معالجة ClipData التي تتلقاها معقدة وتحتاج إلى التأكد من أنه يمكنك بالفعل التعامل مع نوع البيانات في الحافظة قبل محاولة لصقه.

تحتوي الحافظة على جزء واحد فقط من البيانات التي تم اقتطاعها (كائن ClipData) في المرة الواحدة، ولكن يمكن أن يحتوي ClipData واحد على عدة ClipData.Items.

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

سحب وإفلات

تعمل واجهات برمجة التطبيقات الجديدة على تبسيط عمليات السحب والإفلات في واجهة مستخدم التطبيق. عملية السحب هي نقل نوع من البيانات المحفوظة في كائن ClipData من مكان إلى آخر. نقطتا البداية والنهاية لعملية السحب هي View، وبالتالي تقع واجهات برمجة التطبيقات التي تعالج عمليات السحب والإفلات مباشرةً في الفئة View.

تشمل عملية السحب والإفلات دورة حياة يتم تحديدها من خلال عدة إجراءات سحب، يتم تحديد كل منها بعنصر DragEvent، مثل ACTION_DRAG_STARTED وACTION_DRAG_ENTERED وACTION_DROP. يمكن لكل طريقة عرض تريد المشاركة في عملية السحب الاستماع إلى هذه الإجراءات.

لبدء سحب المحتوى في نشاطك، اطلب الرمز startDrag() على أحد View مع إدراج عنصر ClipData يمثّل البيانات المطلوب سحبها، وسمة View.DragShadowBuilder لتسهيل عرض "الظل" الذي يظهر للمستخدمين تحت أصابعهم أثناء السحب، وسمة Object التي يمكنها مشاركة معلومات حول كائن السحب مع العروض التي قد تتلقّى هذا العنصر.

لقبول عنصر سحب في View (تلقّي "الإفلات")، عليك تسجيل العرض باستخدام OnDragListener من خلال طلب setOnDragListener(). عند وقوع حدث سحب في العرض، يستدعي النظام onDrag() إلى OnDragListener، والذي يتلقّى DragEvent يصف نوع إجراء السحب الذي حدث (مثل ACTION_DRAG_STARTED وACTION_DRAG_ENTERED وACTION_DROP). أثناء عملية السحب، يستدعي النظام onDrag() بشكل متكرر للعرض أسفل السحب لعرض بث لأحداث السحب. يمكن لعرض المستلِم الاستعلام عن نوع الحدث الذي تم إرساله إلى "onDragEvent()" من خلال طلب الرقم getAction() على DragEvent.

ملاحظة: على الرغم من أن حدث السحب قد يتضمن كائن ClipData، فإن ذلك لا يتعلق بحافظة النظام. ينبغي ألا تضع عملية السحب والإفلات البيانات التي تم سحبها في حافظة النظام مطلقًا.

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

أدوات التطبيقات

يتوافق Android 3.0 مع العديد من فئات الأدوات الجديدة لمزيد من التطبيقات المصغّرة التفاعلية على المستخدمين الشاشة الرئيسية، بما في ذلك: GridView وListView وStackView وViewFlipper وAdapterViewFlipper.

والأهم من ذلك، يمكنك استخدام RemoteViewsService الجديدة لإنشاء تطبيقات مصغّرة تحتوي على مجموعات، وذلك باستخدام أدوات مثل GridView وListView وStackView تستند إلى بيانات عن بُعد، مثل أدوات موفّر محتوى.

تتيح الفئة AppWidgetProviderInfo (المحدّدة في XML باستخدام عنصر <appwidget-provider>) أيضًا حقلَين جديدَين، وهما: autoAdvanceViewId وpreviewImage. يتيح لك حقل autoAdvanceViewId تحديد رقم تعريف الملف الشخصي للعرض الفرعي لأداة التطبيق التي يجب أن يتقدّم بها تلقائيًا مضيف التطبيق المصغّر. يحدّد حقل previewImage معاينة لما تبدو عليه أداة التطبيق ويتم عرضه للمستخدم من أداة اختيار التطبيقات المصغّرة. إذا لم يتوفر هذا الحقل، سيتم استخدام رمز التطبيق المصغّر للمعاينة.

للمساعدة في إنشاء صورة معاينة لأداة تطبيقك (لتحديدها في حقل previewImage)، يشتمل محاكي Android على تطبيق يُسمى "معاينة الأداة". لإنشاء صورة معاينة، شغِّل هذا التطبيق واختَر التطبيق المصغّر لتطبيقك واضبطه بالشكل الذي تريد أن تظهر به صورة المعاينة، ثم احفظها وضَعها في موارد تطبيقك القابلة للرسم.

يمكنك الاطّلاع على تنفيذ الميزات الجديدة للأدوات الجديدة من خلال التطبيقَين StackView App Widget وWeather List Widget.

إشعارات شريط الحالة

تم توسيع واجهات برمجة التطبيقات Notification لإتاحة المزيد من إشعارات شريط الحالات الغنية بالمحتوى، كما أنّ فئة Notification.Builder الجديدة تتيح لك إنشاء كائنات Notification بسهولة.

تشمل الميزات الجديدة ما يلي:

  • دعم رمز كبير في الإشعار، باستخدام setLargeIcon(). ويكون هذا الإجراء مخصصًا للتطبيقات الاجتماعية عادةً لعرض صورة جهة الاتصال للشخص الذي هو مصدر الإشعار، أو عندما تعرض تطبيقات الوسائط صورة مصغّرة للألبوم.
  • إتاحة تنسيقات مخصّصة في شريط الحالة باستخدام setTicker()
  • دعم تنسيقات الإشعارات المخصّصة لتضمين أزرار PendingIntent، والمزيد من التطبيقات المصغّرة التفاعلية للإشعارات على سبيل المثال، يمكن للإشعار التحكم في تشغيل الموسيقى بدون بدء نشاط ما.

أدوات تحميل المحتوى

تعمل واجهات برمجة التطبيقات الجديدة لإطار العمل على تسهيل التحميل غير المتزامن للبيانات باستخدام فئة Loader. يمكنك استخدامها مع مكونات واجهة المستخدم، مثل طرق العرض والأجزاء، لتحميل البيانات ديناميكيًا من سلاسل العاملين. صُممت الفئة CursorLoader الفرعية خصيصًا لمساعدتك في تنفيذ ذلك بالنسبة إلى البيانات المستندة إلى ContentProvider.

ما عليك سوى تنفيذ واجهة LoaderCallbacks لتلقّي استدعاءات عند طلب برنامج تحميل جديد أو عند تغيّر البيانات، ثم استدعاء الرمز initLoader() لإعداد برنامج التحميل لنشاطك أو الجزء الخاص بك.

لمزيد من المعلومات، اطّلِع على مستندات عمليات التحميل. يمكنك أيضًا الاطّلاع على رمز مثالي باستخدام برامج التحميل في النموذجَين LoaderCursor و LoaderThrottle.

واجهات برمجة تطبيقات Bluetooth A2DP وسماعات الرأس

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

يمكنك إعداد BluetoothProfile ذي الصلة من خلال استدعاء getProfileProxy() إما باستخدام ثابت الملف الشخصي A2DP أو HEADSET أو BluetoothProfile.ServiceListener لتلقّي استدعاءات عند اتصال برنامج البلوتوث أو فصله.

إطار عمل الصور المتحركة

يتيح لك إطار العمل الجديد والمرن والرسوم المتحركة إضافة تأثيرات عشوائية لأي كائن (عرض أو قابل للرسم أو جزء أو كائن أو أي شيء آخر). وتسمح لك بتعريف جوانب عديدة من الرسوم المتحركة، مثل:

  • المدة
  • مقدار التكرار والسلوك
  • نوع استيفاء الوقت
  • يعمل تطبيق الرسوم المتحركة على تشغيل الصور المتحركة معًا، بشكل تسلسلي، أو بعد تأخيرات محدّدة.
  • تأخير إعادة تحميل الإطار

يمكنك تحديد جوانب الرسوم المتحركة هذه وغيرها، لقيم عدد صحيح للكائن والعائم واللون السداسي العشري، بشكل افتراضي. أي، عندما يحتوي كائن على حقل خاصية لأحد هذه الأنواع، يمكنك تغيير قيمته بمرور الوقت للتأثير على إحدى الرسوم المتحركة. لتحريك أي نوع آخر من القيم، يمكنك إخبار النظام بكيفية حساب القيم لهذا النوع المعني، من خلال تنفيذ واجهة TypeEvaluator.

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

بالإضافة إلى ذلك، تتيح الفئة LayoutTransition إمكانية نقل صور متحركة تلقائيًا بالنسبة إلى التغييرات التي تجريها على تنسيق نشاطك. لتفعيل عمليات الانتقال لجزء من التنسيق، أنشِئ كائن LayoutTransition وعيِّنه على أي ViewGroup من خلال طلب setLayoutTransition(). يؤدي هذا إلى تشغيل الرسوم المتحركة الافتراضية كلما تمت إضافة عناصر إلى المجموعة أو إزالتها منها. لتحديد صور متحركة مخصّصة، استدعِ setAnimator() في LayoutTransition وقدِّم Animator مخصّصة، مثل ValueAnimator أو ObjectAnimator التي تمت مناقشتها أعلاه.

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

إطار عمل واجهة المستخدم الموسّع

  • الاختيار من متعدد في ListView وGridView

    يتيح وضع "CHOICE_MODE_MULTIPLE_MODAL" الجديد لـ "setChoiceMode()" للمستخدمين اختيار عناصر متعدّدة من "ListView" أو "GridView". وعند استخدامها بالاقتران مع "شريط الإجراءات"، يمكن للمستخدمين تحديد عناصر متعددة ثم تحديد الإجراء المطلوب تنفيذه من قائمة الخيارات في "شريط الإجراءات" (الذي تم تحويله إلى "وضع إجراءات متعددة الخيارات").

    لتفعيل ميزة الاختيار من متعدد، اطلب setChoiceMode(CHOICE_MODE_MULTIPLE_MODAL) وسجِّل MultiChoiceModeListener من خلال setMultiChoiceModeListener().

    عندما يضغط المستخدم مع الاستمرار على عنصر ما، ينتقل شريط الإجراءات إلى وضع الإجراءات المتعددة الخيارات. يرسل النظام إشعارًا إلى MultiChoiceModeListener عند اختيار العناصر من خلال طلب onItemCheckedStateChanged().

    للحصول على مثال للاختيار من متعدد، يُرجى الاطّلاع على الفئة List15. JavaScript في نموذج تطبيق "واجهات برمجة التطبيقات" (API) التجريبية.

  • واجهات برمجة تطبيقات جديدة لتحويل طرق العرض

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

    تشمل الطرق الجديدة لضبط خصائص الملف الشخصي: setAlpha() وsetBottom() وsetLeft() وsetRight() وsetBottom() وsetPivotX() وsetPivotY() وsetRotationX() وsetRotationY() وsetScaleX() وsetScaleY() وsetAlpha() وغير ذلك.

    وتشتمل بعض الطرق أيضًا على سمة XML مقابلة يمكنك تحديدها في ملف التنسيق لتطبيق تحويل افتراضي. تشمل السمات المتاحة: translationX وtranslationY وrotation وrotationX وrotationY وscaleX وscaleY وtransformPivotX transformPivotY وalpha.

    باستخدام بعض خصائص الملفات الشخصية الجديدة هذه مع إطار عمل الرسوم المتحركة الجديد (الذي تمت مناقشته أعلاه)، يمكنك بسهولة تطبيق بعض الرسوم المتحركة الرائعة على طرق العرض الخاصة بك. على سبيل المثال، لتدوير عرض على محوره الصادي، وفِّر ObjectAnimator مع View وخاصية "rotationY" وقيم البداية والنهاية:

    Kotlin

    ObjectAnimator.ofFloat(myView, "rotationY", 0f, 360f).apply {
        duration = 2000
        start()
    }
    

    Java

    ObjectAnimator animator = ObjectAnimator.ofFloat(myView, "rotationY", 0, 360);
    animator.setDuration(2000);
    animator.start();
    
  • مظاهر مجسمّة جديدة

    تمت إعادة تصميم أدوات النظام العادية والمظهر العام ودمج مظهر جديد لواجهة مستخدم "مجسَّم". يطبق النظام المظهر الجديد باستخدام نظام النمط والمظهر القياسي.

    أي تطبيق يستهدف نظام Android 3.0 الأساسي، من خلال ضبط القيمة android:minSdkVersion أو android:targetSdkVersion على "11"، يكتسب المظهر المجسم تلقائيًا. ومع ذلك، إذا كان التطبيق يطبق أيضًا مظهره الخاص، فسيحل المظهر محل المظهر المجسم، ما لم تقم بتحديث الأنماط لترث المظهر المجسم.

    لتطبيق المظهر المجسم على الأنشطة الفردية أو اكتسابها في تعريفات المظاهر الخاصة بك، استخدِم أحد مظاهر Theme.Holo الجديدة المتعددة. إذا كان تطبيقك متوافقًا مع إصدار Android الأدنى من 3.0 ويطبّق مظاهر مخصّصة، عليك اختيار مظهر وفقًا لإصدار النظام الأساسي.

  • التطبيقات المصغّرة الجديدة
    • AdapterViewAnimator

      الفئة الأساسية لجهاز AdapterView تعمل على تنفيذ الصور المتحركة عند التبديل بين طرق العرض المختلفة

    • AdapterViewFlipper

      رمز ViewAnimator بسيط يتحرك بين مشاهدتَين أو أكثر تمت إضافتهما إليه يتم عرض طفل واحد فقط في كل مرة. وإذا لزم الأمر، يمكن أن تتحرّك الميزة تلقائيًا بين كل طفل على فترات زمنية منتظمة.

    • CalendarView

      يتيح للمستخدمين اختيار التواريخ من التقويم عن طريق لمس التاريخ ويمكن تمرير التقويم أو تمريره إلى التاريخ المطلوب. يمكنك ضبط نطاق التواريخ المتاحة في التطبيق المصغّر.

    • ListPopupWindow

      تظهر على الشاشة نفسها في طريقة عرض المضيف وتعرض قائمة خيارات، مثل قائمة من الاقتراحات عند الكتابة في طريقة عرض EditText.

    • NumberPicker

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

    • PopupMenu

      يعرض Menu في نافذة منبثقة نمطية مثبتة على طريقة عرض. تظهر النافذة المنبثقة أسفل عرض علامة الارتساء إذا كانت هناك مساحة، أو فوقها في حال عدم توفّرها. إذا كان IME (لوحة المفاتيح الإلكترونية) مرئيًا، فلن تتداخل النافذة المنبثقة مع IME حتى يلمس المستخدم القائمة.

    • SearchView

      يتم توفير مربع بحث يمكنك تهيئته لعرض طلبات البحث لنشاط محدّد وعرض اقتراحات البحث (بطريقة البحث التقليدية). وهذه الأداة مفيدة بشكل خاص لتقديم أداة بحث في شريط الإجراءات. لمزيد من المعلومات، راجع إنشاء واجهة بحث.

    • StackView

      طريقة عرض تعرض عناصرها الثانوية في حزمة ثلاثية الأبعاد وتتيح للمستخدمين التمرير سريعًا خلال طرق العرض باستخدام أداة Rolodex

الرسومات

  • رسومات ثنائية الأبعاد مسرَّعة على الأجهزة

    يمكنك الآن تفعيل عارض OpenGL لتطبيقك من خلال ضبط android:hardwareAccelerated="true" في العنصر <application> ضمن عنصر البيان أو لعناصر <activity> الفردية.

    تساعد هذه العلامة التطبيقات من خلال جعلها ترسم بشكل أسرع. ينتج عن ذلك رسوم متحركة أكثر سلاسة وتمرير أكثر سلاسة وأداء أفضل بشكل عام واستجابة لتفاعل المستخدم.

  • عرض دعم طبقات الأجهزة والبرامج

    بشكل تلقائي، لا يتم تحديد أي طبقة لـ View. يمكنك تحديد أنّ العرض مدعوم إما بطبقة جهاز أو برنامج، ومحددة بالقيمتين LAYER_TYPE_HARDWARE وLAYER_TYPE_SOFTWARE، باستخدام setLayerType() أو السمة layerType.

    وطبقة الجهاز مستندة إلى زخرفة محددة من الأجهزة (عادةً كائنات Frame Buffer Objects أو FBO على أجهزة OpenGL) وتؤدي هذه الطبقة إلى عرض العرض باستخدام مسار عرض أجهزة Android ولكن فقط في حال تفعيل تسريع الأجهزة للتدرّج الهرمي لطريقة العرض. عند إيقاف تشغيل تسريع الأجهزة، تعمل طبقات الأجهزة مثل طبقات البرامج بالضبط.

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

    لمزيد من المعلومات، اطّلِع على مستندات LAYER_TYPE_HARDWARE وLAYER_TYPE_SOFTWARE.

  • محرّك الرسومات الثلاثية الأبعاد Renderscript

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

    للمزيد من المعلومات، يُرجى الاطّلاع على مستندات العرض الثلاثي الأبعاد والحساب باستخدام Renderscript.

الوسائط

  • فيديو في وضع "التسريع الزمني"

    توفّر واجهات برمجة تطبيقات Camcorder الآن إمكانية تسجيل فيديو باستخدام وضع "التسريع الزمني". تحدّد setCaptureRate() معدّل التقاط الإطارات.

  • إتاحة الهيئة لعمليات بث الصور

    تتيح لك علامة SurfaceTexture الجديدة التقاط صورة بث صورة كزخرفة OpenGL ES. من خلال طلب setPreviewTexture() لمثيل Camera، يمكنك تحديد SurfaceTexture التي سيتم من خلالها رسم تشغيل الفيديو أو معاينة الإطارات من الكاميرا.

  • البث المباشر وفق بروتوكول HTTP

    يمكن للتطبيقات الآن تمرير عنوان URL لقائمة تشغيل M3U إلى إطار عمل الوسائط لبدء جلسة بث مباشر عبر HTTP. يتوافق إطار عمل الوسائط مع معظم مواصفات بث HTTP المباشر، بما في ذلك معدل نقل البيانات التكيُّفي. راجِع مستند تنسيقات الوسائط المتوافقة للحصول على مزيد من المعلومات.

  • بيانات EXIF

    تتضمن السمة ExifInterface حقولاً جديدة خاصة بكل من فتحة عدسة الصورة وحساسية الضوء (ISO) ووقت التعريض للضوء.

  • الملفات الشخصية لكاميرات الفيديو

    تتيح لك طريقة hasProfile() الجديدة والعديد من الملفات الشخصية لجودة الفيديو (مثل QUALITY_1080P وQUALITY_720P وQUALITY_CIF وغيرها) تحديد خيارات جودة كاميرا الفيديو.

  • نقل ملفات الوسائط الرقمية

    يشتمل النظام الأساسي على دعم مضمّن لبروتوكول نقل الوسائط/الصور (MTP/PTP) عبر USB، مما يتيح للمستخدمين نقل أي نوع من ملفات الوسائط بسهولة بين الأجهزة وإلى كمبيوتر المضيف. ويمكن للمطوّرين الاستفادة من هذا الدعم وإنشاء تطبيقات تتيح للمستخدمين إنشاء أو إدارة ملفات الوسائط التفاعلية التي قد يريدون نقلها أو مشاركتها على الأجهزة.

  • إدارة الحقوق الرقمية (DRM)

    إطار عمل جديد لإدارة الحقوق الرقمية الموسّعة (DRM) للتحقق من الحقوق الرقمية وتنفيذها. ويتم تنفيذه في طبقتين معماريتين:

    • واجهة برمجة التطبيقات لإطار عمل DRM، والتي يتم عرضها للتطبيقات ويتم تشغيلها من خلال الجهاز الافتراضي (Dalvik VM) للتطبيقات العادية.
    • مدير إدارة الحقوق الرقمية (DRM) لنظام إدارة الحقوق الرقمية الذي ينفِّذ واجهة برمجة التطبيقات لإطار العمل ويعرض واجهة للمكونات الإضافية لإدارة الحقوق الرقمية لمعالجة إدارة الحقوق وفك التشفير لأنظمة إدارة الحقوق الرقمية المتنوعة.

    بالنسبة إلى مطوّري التطبيقات، يقدّم إطار العمل واجهة برمجة تطبيقات مجرّدة وموحّدة تبسّط إدارة المحتوى المحمي. تخفي واجهة برمجة التطبيقات مدى تعقيد عمليات إدارة الحقوق الرقمية وتتيح وضع تشغيل متسق لكل من المحتوى المحمي وغير المحمي عبر مجموعة متنوعة من مخططات إدارة الحقوق الرقمية.

    بالنسبة إلى الشركات المصنّعة للأجهزة ومالكي المحتوى ومزوّدي الوسائط الرقمية على الإنترنت، توفّر واجهة برمجة التطبيقات للمكوّن الإضافي لإطار عمل إدارة الحقوق الرقمية (DRM) وسيلة لإضافة دعم نظام إدارة الحقوق الرقمية من الاختيار إلى نظام Android من أجل فرض حماية المحتوى بشكل آمن.

    ولا يوفر إصدار المعاينة أي مكونات إضافية أصلية لنظام إدارة الحقوق الرقمية للتحقق من الحقوق الرقمية وتنفيذها. ومع ذلك، يمكن للشركات المصنّعة للأجهزة شحن مكونات DRM الإضافية على أجهزتها.

    يمكنك العثور على جميع واجهات برمجة تطبيقات DRM في حزمة android.drm.

دعم لوحة المفاتيح

  • إمكانية استخدام مفاتيح Control وMeta وCaps Lock وNum Lock و Scroll Lock. لمزيد من المعلومات، راجِع META_CTRL_ON والحقول ذات الصلة
  • إتاحة لوحات المفاتيح الكاملة بنمط سطح المكتب، بما في ذلك إتاحة استخدام مفاتيح مثل Escape وHome وEnd وDelete وغيرها. يمكنك تحديد ما إذا كانت الأحداث الرئيسية صادرة عن لوحة مفاتيح كاملة من خلال طلب بحث getKeyboardType() والتحقق من KeyCharacterMap.FULL
  • يتيح TextView الآن القص والنسخ واللصق المستنِد إلى لوحة المفاتيح واختيار الكل باستخدام مجموعات المفاتيح Control+X وControl+C وControl+V وControl+A. كما أنها تدعم PageUp/PageDown، وكذلك الصفحة الرئيسية/النهاية، وتحديد النص استنادًا إلى لوحة المفاتيح.
  • يضيف KeyEvent العديد من الطرق الجديدة لتسهيل التحقّق من حالة معدِّل المفاتيح بشكل صحيح ومتّسق. يمكنك الاطّلاع على hasModifiers(int)، hasNoModifiers()، metaStateHasModifiers()، metaStateHasNoModifiers().
  • يمكن للتطبيقات تنفيذ اختصارات لوحة مفاتيح مخصّصة من خلال التصنيف الفرعي Activity أو Dialog أو View وتنفيذ onKeyShortcut(). يستدعي إطار العمل هذه الطريقة كلما يتم دمج مفتاح مع مفتاح Control. عند إنشاء قائمة الخيارات، يمكنك تسجيل اختصارات لوحة المفاتيح من خلال ضبط السمة android:alphabeticShortcut أو android:numericShortcut لكل عنصر <item> (أو باستخدام setShortcut()).
  • يشتمل الإصدار Android 3.0 على جهاز جديد من نوع "لوحة مفاتيح افتراضية" يحمل المعرّف KeyCharacterMap.VIRTUAL_KEYBOARD. تحتوي لوحة المفاتيح الافتراضية على خريطة مفاتيح الولايات المتحدة بنمط سطح المكتب، وهي مفيدة لتجميع الأحداث الرئيسية لاختبار الإدخال.

أحداث اللمس في تقسيم الشاشة

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

ويتم تمكين أحداث اللمس المنقسمة بشكل افتراضي عندما يستهدف أحد التطبيقات الإصدار Android 3.0. وهذا يعني أنّه عندما يضبط التطبيق قيمة السمة android:minSdkVersion أو السمة android:targetSdkVersion على "11".

ومع ذلك، تتيح لك المواقع التالية إيقاف أحداث اللمس المقسّمة على مستوى طرق العرض داخل مجموعات طرق عرض محدَّدة وعلى جميع النوافذ.

  • تتيح لك السمة android:splitMotionEvents لمجموعات الملفات الشخصية إيقاف أحداث اللمس المنقسمة التي تحدث بين طرق العرض الفرعية في تنسيق. مثلاً:
    <LinearLayout android:splitMotionEvents="false" ... >
        ...
    </LinearLayout>
    

    وبهذه الطريقة، لا يمكن لطرق العرض الفرعية في التنسيق الخطي تقسيم أحداث اللمس، بل يمكن لطريقة عرض واحدة فقط تلقّي أحداث اللمس في كل مرة.

  • تتيح لك خاصية النمط android:windowEnableSplitTouch إيقاف أحداث اللمس المنقسمة بين النوافذ، وذلك من خلال تطبيقها على مظهر للنشاط أو على التطبيق بأكمله. مثلاً:
    <style name="NoSplitMotionEvents" parent="android:Theme.Holo">
        <item name="android:windowEnableSplitTouch">false</item>
        ...
    </style>
    

    عند تطبيق هذا المظهر على <activity> أو <application>، يتم قبول أحداث اللمس فقط ضمن فترة النشاط الحالية. على سبيل المثال، من خلال إيقاف أحداث اللمس المقسَّمة على النوافذ، لا يمكن لشريط النظام تلقّي أحداث اللمس في وقت حدوث النشاط. ولا يؤثر هذا في ما إذا كانت الملفات الشخصية ضمن النشاط يمكنها تقسيم أحداث اللمس، ويمكن أن يستمر النشاط تلقائيًا في تقسيم أحداث اللمس عبر طرق العرض.

    لمزيد من المعلومات حول إنشاء مظهر، اقرأ تطبيق الأنماط والمظاهر.

مجموعة أدوات الويب

  • فئة WebViewFragment جديدة لإنشاء جزء مؤلف من WebView.
  • طرق WebSettings الجديدة:
    • يسمح لك setDisplayZoomControls() بإخفاء عناصر التحكّم في التكبير/التصغير على الشاشة مع السماح للمستخدم بالتكبير أو التصغير باستخدام إيماءات الإصبع (يجب ضبط setBuiltInZoomControls() على true).
    • تتيح لك طريقة WebSettings الجديدة، setEnableSmoothTransition()، تفعيل انتقال سلس عند العرض الشامل والتكبير/التصغير. عند تفعيل هذه الميزة، سيختار WebView حلاً لزيادة الأداء إلى أقصى حد (على سبيل المثال، قد لا يتم تحديث محتوى WebView أثناء عملية النقل).
  • طرق WebView الجديدة:
    • onPause()، لإيقاف أي معالجة مرتبطة بمكوّن WebView مؤقتًا عندما يتم إخفاؤها. يفيد هذا في تقليل حركة البيانات غير الضرورية لوحدة المعالجة المركزية (CPU) أو الشبكة عند عدم عمل WebView في المقدّمة.
    • معاودة الاتصال بـ onResume()، لاستئناف المعالجة المرتبطة بمكوّن WebView، التي تم إيقافها مؤقتًا خلال onPause().
    • يتيح لك "saveWebArchive()" حفظ طريقة العرض الحالية كأرشيف ويب على الجهاز.
    • تبدأ دالة showFindDialog() البحث النصي في طريقة العرض الحالية.

المتصفح

يضيف تطبيق المتصفح الميزات التالية لدعم تطبيقات الويب:

  • التقاط الوسائط

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

    <input type="file" accept="image/*;capture=camera" />
    

    أو من خلال استبعاد المعلَمة capture=camera، يمكن للمستخدم اختيار التقاط صورة جديدة بالكاميرا أو اختيار صورة من الجهاز (مثلاً من تطبيق المعرض).

  • اتجاه الجهاز

    كما هو موضح في مواصفات حدث اتجاه الجهاز، يسمح المتصفّح لتطبيقات الويب بالاستماع إلى أحداث نموذج العناصر في المستند (DOM) التي تقدّم معلومات عن الاتجاه الفعلي للجهاز وحركته.

    يتم التعبير عن اتجاه الجهاز بالمحور س وص وص، بالدرجات، ويتم التعبير عن الحركة من خلال بيانات التسارع ومعدّل الدوران. يمكن لصفحة الويب التسجيل في فعاليات توجيهية من خلال استدعاء window.addEventListener بنوع الفعالية "deviceorientation" والتسجيل في الفعاليات الحيّة من خلال تسجيل نوع الحدث "devicemotion".

  • الإحالات الناجحة الثلاثية الأبعاد لـ CSS

    كما هو موضح في مواصفات وحدة التحويل الثلاثي الأبعاد في CSS، يسمح المتصفح بتحويل العناصر التي تعرضها CSS في ثلاثة أبعاد.

برامج JSON المساعدة

يساعدك الصفّان الجديدان JsonReader وJsonWriter في قراءة وكتابة ساحات المشاركات بتنسيق JSON. تكمّل واجهات برمجة التطبيقات الجديدة فئات org.json التي تعالج أحد المستندات في الذاكرة.

يمكنك إنشاء مثيل لـ JsonReader عن طريق استدعاء طريقة الدالة الإنشائية الخاصة بها وتمرير InputStreamReader التي تغذي سلسلة JSON. بعد ذلك، يمكنك البدء بقراءة كائن من خلال استدعاء beginObject()، وقراءة اسم مفتاح باستخدام nextName()، وقراءة القيمة باستخدام طرق متعلقة بالنوع، مثل nextString() وnextInt()، ومواصلة قراءة البيانات إذا كانت قيمة hasNext() صحيحة.

يمكنك إنشاء مثيل لـ JsonWriter من خلال استدعاء الدالة الإنشائية وتمرير OutputStreamWriter المناسبة. اكتب بعد ذلك بيانات JSON بطريقة تشبه القارئ، وذلك باستخدام name() لإضافة اسم خاصية وطريقة value() مناسبة لإضافة القيمة المعنيّة.

تكون هذه الفئات صارمة بشكل تلقائي. تسمح الطريقة setLenient() في كل فئة لها بأن تكون أكثر تحررًا في ما يقبلها. يتوافق وضع التحليل التساهل هذا أيضًا مع المحلِّل اللغوي التلقائي لـ org.json.

ثوابت الميزات الجديدة

يجب استخدام عنصر <uses-feature> لإعلام الكيانات الخارجية (مثل Google Play) بمجموعة ميزات الأجهزة والبرامج التي يعتمد عليها تطبيقك. في هذا الإصدار، يضيف Android الثوابت الجديدة التالية التي يمكن للتطبيقات تعريفها باستخدام هذا العنصر:

  • "android.hardware.faketouch"

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

    إذا كان تطبيقك لا يتطلّب إيماءات معقدة ولا تريد فلترة تطبيقك من الأجهزة المزوّدة بشاشة تعمل باللمس في وضع المحاكاة، عليك تعريف "android.hardware.faketouch" باستخدام عنصر <uses-feature>. بهذه الطريقة، سيكون تطبيقك متاحًا لأكبر عدد من أنواع الأجهزة، بما في ذلك الأجهزة التي لا توفِّر سوى إدخال في الشاشة التي تعمل باللمس في وضع المحاكاة.

    إنّ جميع الأجهزة المزوّدة بشاشة تعمل باللمس تتوافق أيضًا مع "android.hardware.faketouch"، لأنّ إمكانيات الشاشة التي تعمل باللمس تمثّل مجموعة كبيرة من إمكانيات الأجهزة التي تعمل باللمس. وبالتالي، ما لم تكن بحاجة إلى شاشة تعمل باللمس، يجب إضافة عنصر <uses-feature> لتطبيق التصمي المزيّف.

الأذونات الجديدة

  • "android.permission.BIND_REMOTEVIEWS"

    يجب الإعلان عن هذا الإذن كإذن مطلوب في عنصر البيان <service> لتنفيذ RemoteViewsService. على سبيل المثال، عند إنشاء تطبيق مصغّر يستخدم RemoteViewsService لتعبئة عرض المجموعة، قد يبدو إدخال البيان على النحو التالي:

    <service android:name=".widget.WidgetService"
        android:exported="false"
        android:permission="android.permission.BIND_REMOTEVIEWS" />
    

تقنيات الأنظمة الأساسية الجديدة

  • مساحة التخزين
    • إمكانية استخدام نظام الملفات في ext4 لتفعيل مساحة تخزين eMMC على الجهاز.
    • نظام ملفات FUSE لدعم أجهزة MTP.
    • إتاحة وضع مضيف USB لدعم لوحات المفاتيح ولوحات وصل USB.
    • دعم بروتوكول MTP/PTP
  • نواة نظام التشغيل Linux
    • تمت الترقية إلى 2.6.36
  • Dalvik VM
    • رمز جديد لإتاحة SMP وتحسينه
    • تحسينات عديدة على البنية الأساسية للنقل الجماعي (JIT)
    • تحسينات في مجمّع القمامة:
      • تم الضبط للتوافق مع SMP
      • إمكانية استخدام أحجام أكبر لعناصر متعددة
      • معالجة موحّدة للصور النقطية والمخازن المؤقتة بالبايت
  • مكتبات Davik الأساسية
    • تنفيذ جديد وأسرع بكثير لـ NIO (مكتبة I/O الحديثة)
    • رسائل الاستثناء المحسّنة
    • إصلاح الأخطاء والأداء

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

للحصول على عرض تفصيلي لجميع التغييرات في واجهة برمجة التطبيقات في Android 3.0 (المستوى 11 من واجهة برمجة التطبيقات)، يمكنك الاطّلاع على تقرير الاختلافات في واجهة برمجة التطبيقات.

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

يقدم نظام Android 3.0 إصدارًا محدثًا من واجهة برمجة التطبيقات لإطار العمل. يتم تعيين معرّف عدد صحيح لواجهة برمجة التطبيقات لنظام التشغيل Android 3.0 هو 11، ويتم تخزينه في النظام نفسه. هذا المعرف، الذي يُطلق عليه "مستوى واجهة برمجة التطبيقات"، يسمح للنظام بتحديد ما إذا كان التطبيق متوافقًا مع النظام أم لا، وذلك قبل تثبيته.

لاستخدام واجهات برمجة التطبيقات التي تم تقديمها في Android 3.0 ضمن تطبيقك، عليك تجميع التطبيق مقابل مكتبة Android المتوفرة في النظام الأساسي Android 3.0 SDK. بناءً على احتياجاتك، قد تحتاج أيضًا إلى إضافة السمة android:minSdkVersion="11" إلى العنصر <uses-sdk> في بيان التطبيق. إذا كان تطبيقك مصمّمًا للتشغيل على Android 2.3 والإصدارات الأحدث فقط، فإن الإعلان عن السمة يمنع تثبيت التطبيق على الإصدارات السابقة من النظام الأساسي.

للمزيد من المعلومات، يُرجى قراءة المقالة ما هو مستوى واجهة برمجة التطبيقات؟