الثلاثاء، 17 أكتوبر 2017

النوايا والنوايا مرشحات Intents and Intent Filters

النوايا والنوايا مرشحات
Intents and Intent Filters


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

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

بدء النشاط
يمثل Activity شاشة واحدة في أحد التطبيقات. يمكنك بدء مثيل جديد من Activity عن طريق تمرير Intent startActivity() . يصف Intent النشاط لبدء ويحمل أي بيانات ضرورية.
إذا كنت ترغب في الحصول على نتيجة من النشاط عند انتهاء، استدعاء startActivityForResult() . يتلقى النشاط الخاص بك النتيجة كائن Intent منفصلة في onActivityResult() استدعاء onActivityResult() . لمزيد من المعلومات، راجع دليل الأنشطة .
بدء الخدمة
Service هي مكون يقوم بعمليات في الخلفية بدون واجهة مستخدم. مع الروبوت 5.0 (مستوى أبي 21) وبعد ذلك، يمكنك بدء خدمة مع JobScheduler . لمزيد من المعلومات حول JobScheduler ، راجع API-reference documentation لها.
للإصدارات السابقة من أندرويد 5.0 (أبي ليفيل 21)، يمكنك بدء تشغيل الخدمة باستخدام أساليب فئة Service . يمكنك بدء تشغيل خدمة لأداء عملية لمرة واحدة (مثل تنزيل ملف) عن طريق تمرير Intent إلى startService() . تصف Intent الخدمة للبدء وتحمل أي بيانات ضرورية.
إذا تم تصميم الخدمة مع واجهة عميل-الخادم، يمكنك ربط الخدمة من مكون آخر عن طريق تمرير Intent إلى bindService() . لمزيد من المعلومات، راجع دليل الخدمات .
تقديم بث
البث عبارة عن رسالة يمكن لأي تطبيق تلقيها. يقدم النظام العديد من البرامج الإذاعية لأحداث النظام، مثل عند تشغيل النظام أو بدء تشغيل الجهاز. يمكنك تقديم بث إلى تطبيقات أخرى عن طريق تمرير Intent ل sendBroadcast() أو sendOrderedBroadcast() .
أنواع النوايا
هناك نوعان من النوايا:

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


الشكل 1. كيف يتم تسليم نية ضمنية من خلال النظام لبدء نشاط آخر: [1] النشاط A يخلق Intent مع وصف العمل ويمر إلى startActivity() . [2] يبحث نظام أندرويد عن جميع التطبيقات لمرشح نوايا يطابق النية. عندما يتم العثور على تطابق، [3] يبدأ النظام نشاط مطابقة (النشاط ب ) من خلال استدعاء أسلوب onCreate() وتمريره Intent .

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

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

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

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

المعلومات الأساسية الواردة في Intent هو ما يلي:

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

ملاحظة: عند بدء تشغيل Service ، حدد دائما اسم المكون . وإلا، لا يمكنك التأكد من الخدمة التي سترد على النية، ولا يمكن للمستخدم معرفة الخدمة التي تبدأ.

هذا المجال Intent هو كائن ComponentName ، والتي يمكنك تحديد باستخدام اسم فئة مؤهل بالكامل المكون الهدف، بما في ذلك اسم حزمة التطبيق، على سبيل المثال، com.example.ExampleActivity . يمكنك تعيين اسم المكون مع setComponent() أو setClass() أو setClassName() أو مع منشئ setClassName() .

عمل
سلسلة تحدد الإجراء العام المطلوب تنفيذه (مثل العرض أو التحديد).
وفي حالة النية الإذاعية، فإن هذا هو الإجراء الذي جرى ويجري الإبلاغ عنه. ويحدد الإجراء إلى حد كبير كيفية تنظيم بنية النية - ولا سيما المعلومات الواردة في البيانات والإضافات.

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

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

يمكنك تحديد الإجراء لنية مع setAction() أو مع منشئ Intent .

إذا حددت الإجراءات الخاصة بك، فتأكد من تضمين اسم الحزمة لتطبيقك كبادئة، كما هو موضح في المثال التالي:

static final String ACTION_TIMETRAVEL = "com.example.action.TIMETRAVEL";


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

لتعيين أوري البيانات فقط، استدعاء setData() . لتعيين نوع مايم فقط، استدعاء setType() . إذا لزم الأمر، يمكنك تعيين كلا صراحة مع setDataAndType() .

تحذير: إذا كنت تريد تعيين كل من نوع أوري و مايم، لا تستدعي setType() و setType() لأن كل منهما يلغي قيمة الآخر. دائما استخدام setDataAndType() لتعيين كل من أوري ونوع مايم.

الفئة
سلسلة تحتوي على معلومات إضافية حول نوع المكون الذي يجب التعامل مع القصد. أي عدد من أوصاف الفئة يمكن وضعها في نية، ولكن معظم النوايا لا تتطلب فئة. في ما يلي بعض الفئات الشائعة:
CATEGORY_BROWSABLE
النشاط المستهدف يسمح لنفسه أن تبدأ من قبل متصفح ويب لعرض البيانات المشار إليها من قبل رابط، مثل صورة أو رسالة بريد إلكتروني.
CATEGORY_LAUNCHER
النشاط هو النشاط الأولي للمهمة ويتم سردها في قاذفة تطبيق النظام.
راجع وصف الصف Intent لقائمة كاملة من الفئات.

يمكنك تحديد فئة مع addCategory() .

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

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

على سبيل المثال، عند إنشاء نية لإرسال بريد إلكتروني باستخدام ACTION_SEND ، يمكنك تحديد المستلم باستخدام المفتاح EXTRA_EMAIL وتحديد الموضوع باستخدام المفتاح EXTRA_SUBJECT .

تحدد فئة EXTRA_* العديد من EXTRA_* لأنواع البيانات القياسية. إذا كنت بحاجة إلى الإعلان عن المفاتيح الإضافية الخاصة بك (بالنسبة إلى النوايا التي يتلقاها تطبيقك)، فتأكد من تضمين اسم الحزمة لتطبيقك كبادئة، كما هو موضح في المثال التالي:

static final String EXTRA_GIGAWATTS = "com.example.EXTRA_GIGAWATTS";

تحذير : لا تستخدم بيانات Parcelable أو Serializable عند إرسال نية تتوقع التطبيق آخر لتلقي. إذا حاول أحد التطبيقات الوصول إلى البيانات في كائن Bundle ولكن ليس لديه إمكانية الوصول إلى الفئة بارسيلد أو مسلسل، يقوم النظام برفع RuntimeException .

أعلام
يتم تعريف الأعلام في فئة Intent التي تعمل كبيانات تعريفية للنية. قد ترفع الأعلام نظام أندرويد كيفية إطلاق نشاط (على سبيل المثال، المهمة التي يجب أن ينتمي إليها النشاط) وكيفية التعامل معها بعد إطلاقها (على سبيل المثال، ما إذا كانت تنتمي إلى قائمة الأنشطة الحديثة).
لمزيد من المعلومات، راجع طريقة setFlags() .

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

على سبيل المثال، إذا أنشأت خدمة في تطبيقك، اسمه DownloadService ، تم تصميمها لتنزيل ملف من الويب، فيمكنك بدء تشغيله باستخدام الشفرة التالية:



// Executed in an Activity, so 'this' is the Context
// The fileUrl is a string URL, such as "http://www.example.com/image.png"
Intent downloadIntent = new Intent(this, DownloadService.class);
downloadIntent.setData(Uri.parse(fileUrl));
startService(downloadIntent);


Intent(Context, Class) منشئ لوازم Context التطبيق والمكون كائن Class . على هذا النحو، يبدأ هذا القصد صراحة فئة دونلوادسرفيس في التطبيق.

لمزيد من المعلومات حول إنشاء خدمة وبدءها، راجع دليل الخدمات .

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

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

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

// Create the text message with a string
Intent sendIntent = new Intent();
sendIntent.setAction(Intent.ACTION_SEND);
sendIntent.putExtra(Intent.EXTRA_TEXT, textMessage);
sendIntent.setType("text/plain");

// Verify that the intent will resolve to an activity
if (sendIntent.resolveActivity(getPackageManager()) != null) {
    startActivity(sendIntent);
}


عند startActivity() ، يقوم النظام بفحص جميع التطبيقات المثبتة لتحديد أي منها يمكنه التعامل مع هذا النوع من النوايا (القصد من الإجراء ACTION_SEND والذي يحمل بيانات "نص / عادي"). إذا كان هناك التطبيق واحد فقط التي يمكن التعامل معها، أن يفتح التطبيق على الفور ويعطى القصد. إذا قبلت أنشطة متعددة القصد، يعرض النظام حوار مثل واحد هو مبين في الشكل 2، بحيث يمكن للمستخدم اختيار التطبيق الذي للاستخدام.


الشكل 2. حوار مختار.


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

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

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

Intent sendIntent = new Intent(Intent.ACTION_SEND);
...

// Always use string resources for UI text.
// This says something like "Share this photo with"
String title = getResources().getString(R.string.chooser_title);
// Create intent to show the chooser dialog
Intent chooser = Intent.createChooser(sendIntent, title);

// Verify the original intent will resolve to at least one activity
if (sendIntent.resolveActivity(getPackageManager()) != null) {
    startActivity(chooser);
}


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

ملاحظة: يتم تسليم نية صريحة دائما إلى هدفها، بغض النظر عن أي نية تصفية يعلن المكون.

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

يتم تعريف عامل تصفية كل نية بعنصر <intent-filter> في ملف البيان الخاص بالتطبيق، المتضمن في مكون التطبيق المقابل (مثل عنصر <activity> ). داخل <intent-filter> ، يمكنك تحديد نوع النوايا لقبول استخدام واحد أو أكثر من هذه العناصر الثلاثة:

<action>
يعلن الإجراء المقبول المقبول، في سمة name . يجب أن تكون القيمة قيمة السلسلة الحرفية لعمل، وليس ثابت الفئة.
<data>
يعلن نوع البيانات المقبولة، باستخدام واحد أو أكثر من السمات التي تحدد جوانب مختلفة من أوري البيانات ( scheme host port path ) ونوع مايم.
<category>
تعلن فئة النوايا المقبولة، في سمة name . يجب أن تكون القيمة قيمة السلسلة الحرفية لعمل، وليس ثابت الفئة.
ملاحظة: لتلقي النوايا الضمنية، يجب تضمين CATEGORY_DEFAULT في عامل التصفية المقصود. أساليب startActivity() و startActivityForResult() معالجة جميع النوايا كما لو أعلنت الفئة CATEGORY_DEFAULT . إذا لم تعلن هذه الفئة في فلتر النية، فلن تحل أية نوايا ضمنية إلى نشاطك.

على سبيل المثال، في ما يلي بيان النشاط ACTION_SEND القصد ACTION_SEND نية ACTION_SEND عندما يكون نوع البيانات نصا:



<activity android:name="ShareActivity">
    <intent-filter>
        <action android:name="android.intent.action.SEND"/>
        <category android:name="android.intent.category.DEFAULT"/>
        <data android:mimeType="text/plain"/>
    </intent-filter>
</activity>



يمكنك إنشاء فلتر يتضمن أكثر من مثيل واحد من <action> أو <category> أو <category> . إذا قمت بذلك، تحتاج إلى التأكد من أن المكون يمكن التعامل مع أي وجميع تركيبات من عناصر التصفية هذه.

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

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

تنبيه: لتجنب تشغيل Service تطبيق مختلف عن غير قصد، استخدم دائما نية صريحة لبدء الخدمة الخاصة بك وعدم الإعلان عن فلاتر القصد لخدمتك.

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

مثال للمرشحات
لإثبات بعض سلوكيات تصفية النية، إليك مثال من ملف البيان لتطبيق مشاركة اجتماعية:

<activity android:name="MainActivity">
    <!-- This activity is the main entry, should appear in app launcher -->
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>

<activity android:name="ShareActivity">
    <!-- This activity handles "SEND" actions with text data -->
    <intent-filter>
        <action android:name="android.intent.action.SEND"/>
        <category android:name="android.intent.category.DEFAULT"/>
        <data android:mimeType="text/plain"/>
    </intent-filter>
    <!-- This activity also handles "SEND" and "SEND_MULTIPLE" with media data -->
    <intent-filter>
        <action android:name="android.intent.action.SEND"/>
        <action android:name="android.intent.action.SEND_MULTIPLE"/>
        <category android:name="android.intent.category.DEFAULT"/>
        <data android:mimeType="application/vnd.google.panorama360+jpg"/>
        <data android:mimeType="image/*"/>
        <data android:mimeType="video/*"/>
    </intent-filter>
</activity>

النشاط الأول، MainActivity ، هو نقطة الدخول الرئيسية التطبيق - النشاط الذي يفتح عندما يقوم المستخدم في البداية تطلق التطبيق مع رمز قاذفة:

يشير الإجراء ACTION_MAIN إلى أن هذه هي نقطة الدخول الرئيسية ولا تتوقع أي بيانات نية.
تشير الفئة CATEGORY_LAUNCHER إلى أنه يجب وضع رمز هذا النشاط في مشغل تطبيقات النظام. إذا لم يحدد العنصر <activity> رمزا به icon ، فسيستخدم النظام الرمز من عنصر <application> .
يجب إقران هذين معا حتى يظهر النشاط في مشغل التطبيقات.

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

ملاحظة: نوع مايم، application/vnd.google.panorama360+jpg ، هو نوع بيانات خاص يحدد الصور البانورامية، والتي يمكنك التعامل معها باستخدام واجهات برمجة التطبيقات البانورامية من غوغل .

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

وتشمل حالات الاستخدام الرئيسية لنوايا معلقة ما يلي:

إعلان نية ليتم تنفيذها عندما يقوم المستخدم بإجراء مع الإخطار الخاص بك ( نوتيفيكاتيونماناجر نظام أندرويد ينفذ Intent ).
إعلان نية ليتم تنفيذها عندما يقوم المستخدم بإجراء مع التطبيق الخاص بك القطعة (التطبيق الشاشة الرئيسية ينفذ Intent ).
إعلان نية ليتم تنفيذها في وقت محدد في المستقبل ( AlarmManager نظام أندرويد ينفذ Intent ).
تماما كما تم تصميم كائن كل Intent ليتم التعامل معها من قبل نوع معين من مكون التطبيق (إما Activity أو Service أو BroadcastReceiver )، لذلك يجب أيضا إنشاء PendingIntent مع نفس الاعتبار. عند استخدام نية معلقة، التطبيق الخاص بك لا تنفيذ القصد مع مكالمة مثل startActivity() . بدلا من ذلك، يجب أن تعلن نوع المكون المقصود عند إنشاء PendingIntent عن طريق استدعاء الأسلوب المنشئ منها:

PendingIntent.getActivity() يبدأ Activity .
PendingIntent.getService() التي تبدأ Service .
PendingIntent.getBroadcast() التي تبدأ جهاز PendingIntent.getBroadcast() .
ما لم يكن التطبيق الخاص بك هو تلقي نوايا معلقة من تطبيقات أخرى، والأساليب المذكورة أعلاه لإنشاء PendingIntent هي على الارجح الطرق PendingIntent فقط ستحتاج أي وقت مضى.

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

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

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

عمل.
البيانات (كل من عنوان أوري ونوع البيانات).
الفئة.
تصف الأقسام التالية كيفية مطابقة النوايا للمكونات المناسبة وفقا لإعلان تصفية النية في ملف البيان الخاص بالتطبيق.

اختبار العمل
لتحديد إجراءات النوايا المقبولة، يمكن لمرشح النية أن يعلن عن عناصر <action> أو أكثر، كما هو موضح في المثال التالي:




<intent-filter>
    <action android:name="android.intent.action.EDIT" />
    <action android:name="android.intent.action.VIEW" />
    ...
</intent-filter>

لتمرير هذا الفلتر، يجب أن يتطابق الإجراء المحدد في Intent مع أحد الإجراءات المذكورة في الفلتر.

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

اختبار الفئة
لتحديد فئات النوايا المقبولة، يمكن لمرشح النوايا أن يعلن عن عنصر أو أكثر من <category> ، كما هو موضح في المثال التالي:



<intent-filter>
    <category android:name="android.intent.category.DEFAULT" />
    <category android:name="android.intent.category.BROWSABLE" />
    ...
</intent-filter>

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

ملاحظة: يطبق أندرويد الفئة CATEGORY_DEFAULT تلقائيا على كافة startActivity() الضمنية التي تم تمريرها إلى startActivity() و startActivityForResult() . إذا كنت تريد أن يتلقى نشاطك النوايا الضمنية، فيجب أن يتضمن فئة "android.intent.category.DEFAULT" في فلاتر النية، كما هو موضح في المثال السابق <intent-filter> .

اختبار البيانات
لتحديد بيانات النوايا المقبولة، يمكن لمرشح النية أن يعلن عن عنصر أو أكثر من عناصر <data> ، كما هو موضح في المثال التالي:

<intent-filter>
    <data android:mimeType="video/mpeg" android:scheme="http" ... />
    <data android:mimeType="audio/mpeg" android:scheme="http" ... />
    ...
</intent-filter>


يمكن لكل عنصر <data> تحديد بنية أوري ونوع بيانات (نوع وسائط مايم). كل جزء من عنوان أوري عبارة عن سمة منفصلة: scheme host port path :

<scheme>://<host>:<port>/<path>

يوضح المثال التالي القيم المحتملة لهذه السمات:

content://com.example.project:200/folder/subfolder/etc

في هذا أوري، المخطط هو content ، المضيف هو com.example.project ، المنفذ هو 200 ، والمسار هو folder/subfolder/etc .

كل من هذه السمات اختيارية في عنصر <data> ، ولكن هناك تبعيات خطية:

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

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

يقارن اختبار البيانات كل من عنوان أوري ونوع مايم في القصد من نوع أوري ونوع مايم المحدد في الفلتر. قواعد هي على النحو التالي:

النية التي تحتوي على لا أوري ولا نوع مايم يمر الاختبار فقط إذا لم يحدد عامل التصفية أي أوريس أو أنواع مايم.
النية التي تحتوي على عنوان أوري ولكن لا يوجد نوع مايم (لا صريحة ولا يمكن استنتاجها من أوري) يمر الاختبار فقط إذا كان عنوان أوري يطابق تنسيق أوري للمرشح كما أن الفلتر لا يحدد نوع مايم.
النية التي تحتوي على نوع مايم ولكن ليس أوري يمر الاختبار فقط إذا كان عامل التصفية يسرد نفس نوع مايم ولا يحدد تنسيق أوري.
النية التي تحتوي على كل من أوري ونوع مايم (إما صريحة أو لا يمكن استنتاجها من أوري) يمر جزء نوع مايم للاختبار فقط إذا كان هذا النوع يطابق نوع مدرج في عامل التصفية. ويمرر الجزء أوري من الاختبار إما إذا كان عنوان أوري يطابق عنوان أوري في الفلتر أو إذا كان يحتوي على content: أو file: لا يحدد معرف أوري والفلتر عنوان أوري. وبعبارة أخرى، يفترض مكون لدعم content: file: البيانات إذا كان مرشحها يسرد فقط نوع مايم.
وتعكس هذه القاعدة الأخيرة، القاعدة (د)، التوقعات بأن المكونات قادرة على الحصول على البيانات المحلية من ملف أو مزود محتوى. لذلك، يمكن للمرشحات الخاصة بهم قائمة نوع البيانات فقط ولا تحتاج إلى اسم صريح content: file: المخططات. يعرض المثال التالي حالة نموذجية يخبر فيها عنصر <data> أندرويد أن المكون يمكنه الحصول على بيانات الصورة من موفر المحتوى وعرضه:


<intent-filter>
    <data android:mimeType="image/*" />
    ...
</intent-filter>

قد تكون المرشحات التي تحدد نوع بيانات ولكن ليس معرف موارد منتظم (أوري) الأكثر شيوعا لأن معظم البيانات المتوفرة يتم الاستغناء عنها من قبل موفري المحتوى.

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


<intent-filter>
    <data android:scheme="http" android:type="video/*" />
    ...
</intent-filter>


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

يمكن للتطبيق الخاص بك استخدام نية مطابقة بطريقة مماثلة لما يفعله التطبيق الرئيسية. يحتوي PackageManager على مجموعة من query...() الطرق التي تعيد كافة المكونات التي يمكن أن تقبل نية معينة وسلسلة مماثلة من resolve...() الطرق التي تحدد أفضل مكون للرد على نية.على سبيل المثال، queryIntentActivities()بإرجاع قائمة لجميع الأنشطة التي يمكن أن تؤدي القصد مرت كحجة، و queryIntentServices()إرجاع قائمة مماثلة من الخدمات. لا طريقة ينشط المكونات؛ أنها مجرد سرد تلك التي يمكن أن تستجيب. هناك طريقة مشابهة، queryBroadcastReceivers()لاستقبال البث.

ليست هناك تعليقات:

إرسال تعليق

للوضع الليلي في التطبيق DayNight

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