أساسيات التطبيق

يمكن كتابة تطبيقات Android باستخدام Kotlin ولغة برمجة Java ولغات C++. تجميع أدوات حزمة تطوير البرامج (SDK) لنظام التشغيل Android الرمز البرمجي بالإضافة إلى أي ملفات بيانات وموارد في حزمة APK أو مجموعة حزمات تطبيق Android.

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

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

عند توزيع تطبيقك من خلال Google على سبيل المثال، تنشئ خوادم Google Play حِزم APK محسّنة تحتوي فقط على الموارد الذي يتطلبه الجهاز المحدد الذي يطلب تثبيت التطبيق.

يتوفّر كل تطبيق Android في وضع الحماية للأمان الخاص به، والمحمي بموجب ميزات الأمان التالية في Android:

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

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

ومع ذلك، هناك طرق يمكن للتطبيق من خلالها مشاركة البيانات مع التطبيقات الأخرى، وكذلك للوصول إلى خدمات النظام:

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

يقدم باقي هذا المستند المفاهيم التالية:

  • مكوّنات إطار العمل الأساسية التي تميِّز تطبيقك.
  • ملف البيان الذي تدرج فيه المكوّنات والجهاز المطلوب الميزات المتوفرة التطبيق.
  • الموارد المنفصلة عن رمز التطبيق والتي تتيح لتطبيقك تحسين سلوكه بسلاسة لمجموعة متنوعة من إعدادات الأجهزة.

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

مكونات التطبيق هي الوحدات الأساسية لإنشاء تطبيق Android. على كل هو نقطة دخول يمكن للنظام أو المستخدم من خلالها الدخول إلى تطبيقك. بعض الإشعارات المكونات تعتمد على الأخرى.

هناك أربعة أنواع من مكونات التطبيق:

  • الأنشطة
  • الخدمات
  • أجهزة استقبال البث
  • موفّرو المحتوى

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

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

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

يسهِّل النشاط التفاعلات الرئيسية التالية بين النظام والتطبيق:

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

لنفترض أنّك تنفّذ نشاطًا كفئة فرعية لفئة Activity. لمزيد من المعلومات، معلومات حول فئة Activity، يمكنك مراجعة مقدمة عن الأنشطة.

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

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

هناك نوعان من الخدمات التي تخبر النظام بكيفية إدارة أحد التطبيقات: الخدمات التي تم تشغيلها والخدمات المرتبطة ببعضها.

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

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

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

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

يتم تنفيذ خدمة باعتبارها فئة فرعية من Service. لمزيد من المعلومات حول فئة Service، يمكنك مراجعة نظرة عامة على الخدمات.

ملاحظة: إذا كان تطبيقك يستهدف الإصدار 5.0 من نظام التشغيل Android (المستوى 21 من واجهة برمجة التطبيقات) أو الإصدارات الأحدث، استخدِم الفئة JobScheduler لجدولة الإجراءات. تضم Jobscheduler الاستفادة من الحفاظ على البطارية عن طريق جدولة المهام على النحو الأمثل لتقليل استهلاك الطاقة ومن خلال استخدام واجهة برمجة تطبيقات Doze لمزيد من المعلومات حول استخدام هذا الصف، يُرجى الاطّلاع على JobScheduler. الوثائق المرجعية.

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

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

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

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

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

يتم تنفيذ مستقبِل البث كفئة فرعية من BroadcastReceiver، ويتم إرسال كل عملية بث على شكل كائن Intent. لمزيد من المعلومات يمكنك الاطّلاع على الفئة BroadcastReceiver.

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

على سبيل المثال، يوفر نظام Android محتوى مقدم الخدمة الذي يدير معلومات الاتصال للمستخدم. يحتوي أي تطبيق على يمكن للأذونات الاستعلام من مزود المحتوى، مثل استخدام ContactsContract.Data: لقراءة وكتابة معلومات عن شخص معين.

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

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

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

موفرو المحتوى مفيدون أيضًا في قراءة وكتابة البيانات الخاصة التطبيق ولم تتم مشاركته.

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

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

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

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

تفعيل المكونات

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

يتم إنشاء هدف باستخدام الكائن Intent، الذي يعرّف الرسالة إلى تفعيل إما مكوّن معيّن (نية صريحة) أو نوع معيّن من المكوّنات (هدف ضمني)

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

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

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

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

وهناك طرق منفصلة لتنشيط كل نوع من أنواع المكوّنات:

  • يمكنك بدء نشاط أو إعطاءه أمرًا جديدًا من خلال تمرير Intent إلى startActivity() أو، عندما تريد أن يعرض النشاط نتيجة، startActivityForResult()
  • في الإصدار Android 5.0 (المستوى 21 من واجهة برمجة التطبيقات) والإصدارات الأحدث، يمكنك استخدام الفئة JobScheduler لجدولة الإجراءات. وبالنسبة إلى الإصدارات السابقة من Android، يمكنك بدء لخدمة ما أو إعطاء تعليمات جديدة لخدمة مستمرة عن طريق تمرير Intent إلى startService(). يمكنك الربط بالخدمة من خلال تمرير Intent إلى bindService()
  • يمكنك بدء البث من خلال إرسال Intent إلى طرق مثل sendBroadcast() أو sendOrderedBroadcast()
  • يمكنك إجراء طلب بحث إلى أحد موفّري المحتوى من خلال استدعاء query() في ContentResolver.

لمزيد من المعلومات حول استخدام الأهداف، اطّلع على أهداف مستند فلاتر الأهداف توفر المستندات التالية مزيدًا من المعلومات حول تفعيل مكونات معينة: مقدّمة حول الأنشطة نظرة عامة على الخدمات، BroadcastReceiver، موفّرو المحتوى:

ملف البيان

قبل أن يتمكن نظام Android من بدء مكون تطبيق، يجب أن يعرف النظام أن من خلال قراءة ملف بيان التطبيق، AndroidManifest.xml. يعرّف تطبيقك عن كل مكوّناته في هذا الملف، وهي في جذر دليل مشروع التطبيق.

يقوم البيان بعدد من الأشياء بالإضافة إلى الإعلان عن مكونات التطبيق، مثل ما يلي:

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

الإفصاح عن المكوّنات

تتمثل المهمة الأساسية للبيان في إبلاغ النظام بمكونات التطبيق. بالنسبة على سبيل المثال، يمكن أن يفصح ملف البيان عن نشاط على النحو التالي:

<?xml version="1.0" encoding="utf-8"?>
<manifest ... >
    <application android:icon="@drawable/app_icon.png" ... >
        <activity android:name="com.example.project.ExampleActivity"
                  android:label="@string/example_label" ... >
        </activity>
        ...
    </application>
</manifest>

في <application> تشير السمة android:icon إلى الموارد للحصول على رمز يحدد التطبيق.

في العنصر <activity>، تحدد السمة android:name اسم الفئة المؤهلة بالكامل الفئة الفرعية Activity تحدد السمة android:label سلسلة استخدامه كتصنيف مرئي للمستخدم للنشاط.

يجب الإفصاح عن جميع مكوّنات التطبيق باستخدام العناصر التالية:

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

للتعرّف على مزيد من المعلومات حول طريقة تنظيم ملف البيان لتطبيقك، يمكنك الاطّلاع على نظرة عامة على بيان التطبيق.

تعريف إمكانيات المكوِّن

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

تنبيه: إذا كنت تنوي بدء Service، يُرجى التأكّد من أنّ تطبيقك آمن من خلال استخدام صريح والنية. يعتبر استخدام نية ضمنية لبدء خدمة ما خطرًا أمنيًا، نظرًا لعدم قدرتك على التأكد من استجابة الخدمة لهدف ولا يمكن للمستخدم معرفة الخدمة التي بدأت. بدءًا من Android 5.0 (مستوى واجهة برمجة التطبيقات 21)، سيركز تطرح استثناء إذا طلبت bindService() بهدف ضمني. لا تُفصح عن فلاتر الأهداف لخدماتك.

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

عند الإفصاح عن نشاط في بيان تطبيقك، يمكنك اختياريًا تضمين فلاتر الأهداف التي توضح إمكانات النشاط حتى يتمكّن من الاستجابة إلى الأهداف من التطبيقات الأخرى. يمكنك إجراء ذلك عن طريق إضافة عنصر <intent-filter> كعنصر ثانوي لعنصر تعريف المكوِّن.

على سبيل المثال، إذا أنشأت تطبيق بريد إلكتروني يحتوي على نشاط لإنشاء رسالة إلكترونية جديدة، يمكنك: تعريف فلتر أهداف للرد على "إرسال" النية في إرسال بريد إلكتروني جديد، كما هو موضح في المثال التالي:

<manifest ... >
    ...
    <application ... >
        <activity android:name="com.example.project.ComposeEmailActivity">
            <intent-filter>
                <action android:name="android.intent.action.SEND" />
                <data android:type="*/*" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </activity>
    </application>
</manifest>

إذا أنشأ تطبيق آخر intent من خلال الإجراء ACTION_SEND وأرسله إلى startActivity(), قد يبدأ النظام نشاطك ليتمكّن المستخدم من صياغة البريد الإلكتروني.

لمزيد من المعلومات حول إنشاء فلاتر الأهداف، اطّلِع على مستند أهداف وفلاتر الأهداف.

الإفصاح عن متطلبات التطبيق

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

ومعظم هذه البيانات معلومات فقط. لا يقرأ النظام ولكن الخدمات الخارجية مثل Google Play تقرأها لتوفير ميزة للمستخدمين عند بحثهم عن التطبيقات من أجهزتهم.

على سبيل المثال، لنفترض أنّ تطبيقك يتطلب كاميرا ويستخدم واجهات برمجة التطبيقات التي تم توفيرها في Android 8.0 (مستوى واجهة برمجة التطبيقات 26). يجب الإفصاح عن هذه المتطلبات. تم ضبط قيمتَي minSdkVersion وtargetSdkVersion في الملف build.gradle لوحدة تطبيقك:

android {
  ...
  defaultConfig {
    ...
    minSdkVersion 26
    targetSdkVersion 29
  }
}

ملاحظة: لا تُعِدّ minSdkVersion targetSdkVersion مباشرةً في ملف البيان، نظرًا أن يتم استبدالها من خلال Gradle أثناء عملية التصميم. لمزيد من المعلومات، يُرجى مراجعة حدد متطلبات مستوى واجهة برمجة التطبيقات.

أنت تشير إلى ميزة الكاميرا في ملف البيان الخاص بتطبيقك:

<manifest ... >
    <uses-feature android:name="android.hardware.camera.any"
                  android:required="true" />
    ...
</manifest>

باستخدام البيانات الموضّحة في هذه الأمثلة، فإن الأجهزة التي ليس لها للكاميرا أو يتعذّر على إصدار Android الأقدم من 8.0 تثبيت تطبيقك من Google Play. ومع ذلك، يمكنك توضيح أنّ تطبيقك يستخدم الكاميرا، ولكنه لا يستخدم الكاميرا. تتطلبه. لإجراء ذلك، عليك ضبط required. إلى false، فتحقق في وقت التشغيل ما إذا تضمين كاميرا في الجهاز، وإيقاف أي ميزات للكاميرا حسب الحاجة.

مزيد من المعلومات حول كيفية إدارة توافق تطبيقك مع أجهزة مختلفة في مقالة نظرة عامة على التوافق مع الأجهزة.

موارد التطبيقات

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

يُسهِّل استخدام موارد التطبيقات تحديث الخصائص المختلفة لتطبيقك دون تعديل الرموز. توفير من مجموعات الموارد البديلة إمكانية تحسين التطبيق للاستفادة من مجموعة متنوعة من إعدادات الجهاز، مثل اللغات وأحجام الشاشات المختلفة.

بالنسبة إلى كل مورد تُدرجه في مشروع Android، تحدد أدوات إنشاء حزمة تطوير البرامج (SDK) سمة معرّف عدد صحيح، يمكنك استخدامه للإشارة إلى المورد من رمز تطبيقك أو من الموارد الأخرى المحددة في XML. على سبيل المثال، إذا كان تطبيقك يحتوي على ملف صورة باسم logo.png (المحفوظة في الدليل res/drawable/)، تُنشئ أدوات حزمة تطوير البرامج (SDK) معرِّف مورد اسمه R.drawable.logo. يرتبط رقم التعريف هذا بعدد صحيح خاص بالتطبيق، يمكنك استخدامه للإشارة إلى الصورة وإدراجها في واجهة المستخدم

أحد أهم جوانب توفير الموارد بشكل منفصل عن رمز المصدر هي القدرة على توفير موارد بديلة للأجهزة المختلفة الإعدادات.

على سبيل المثال، من خلال تحديد سلاسل واجهة المستخدم في XML، يمكنك ترجمة السلاسل إلى غير ذلك اللغات وحفظ هذه السلاسل في ملفات منفصلة. ثم يطبق Android سلاسل اللغة المناسبة إلى واجهة المستخدم استنادًا إلى مؤهِّل لغة تلحقه باسم دليل الموارد، مثل res/values-fr/ للسلسلة الفرنسية والقيم وإعداد اللغة لدى المستخدم.

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

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

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

مصادر إضافية

للتعرُّف على كيفية تطوير Android باستخدام الفيديوهات والبرامج التعليمية المتعلقة بالرموز، يُرجى الاطّلاع على تطوير تطبيقات Android باستخدام لغة Kotlin دورة Udacity.

متابعة القراءة حول:

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

مواضيع أخرى تهمّ:

نظرة عامة على التوافق مع الأجهزة
يمكنك التعرّف على آلية عمل Android على مختلف أنواع الأجهزة. كيفية تحسين تطبيقك لكل جهاز أو تقييد توفُّره لأجهزة مختلفة.
الأذونات على Android
تعرَّف على الطريقة التي يحظر بها Android وصول التطبيقات إلى واجهات برمجة تطبيقات معيّنة بعد الحصول على إذن. نظامًا يتطلب موافقة المستخدم لكي يستخدم تطبيقك واجهات برمجة التطبيقات هذه.