السماح لتطبيقات أخرى ببدء نشاطك

الإعلانات

السماح لتطبيقات أخرى ببدء نشاطك

 

 

السماح لتطبيقات أخرى ببدء نشاطك

إذا كان بإمكان تطبيقك تنفيذ إجراء قد يكون مفيداً للعمل من تطبيق آخر، فيجب إعداد تطبيقك للإستجابة..

لطلبات الإجراء من خلال تحديد مرشح الغرض المناسب في نشاطك.

مثال، إذا كنت تنشئ تطبيق تواصل إجتماعي يمكنه مشاركة الرسائل أو الصور مع أصدقاء المستخدم، فيجب عليك دعم غرض “الإرسال” ACTION_SEND.

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

(يُعرف أيضاً باسم “مربع حوار التوضيح”) ، كما هو موضح في الشكل 1.

            الشكل 1. مربع حوار المنتقي

 

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

<intent-filter> في ملف الإيضاح الخاص بك لعنصر <activity> المقابل.

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

عندما يقوم تطبيق بإجراء ()startActivity أو ()startActivityForResult ، بإستخدام غرض ضمني..

يعثر النظام على النشاط (أو الأنشطة) التي يمكنها أن تستجيب للغرض.

 

 

 

 

السماح لتطبيقات أخرى ببدء نشاطك

 

إضافة مرشح غرض


لتحديد الأغراض التي يمكن أن يعالجها نشاطك بشكلٍ صحيح، يجب أن يكون كل مرشح تريد إضافته محدداً قدر الإمكان من حيث نوع الإجراء والبيانات التي يقبلها النشاط.

قد يرسل النظام غرض معين إلى نشاط إذا كان لهذا النشاط مرشح غرض يحقق المعايير التالية لكائن الغرض:

 

Action إجراء

سلسلة تقوم بتسمية الإجراء المراد تنفيذه. عادة ما تكون واحدة من القيم المحددة للنظام الأساسي مثل ACTION_SEND أو ACTION_VIEW.

قم بتحديد هذا في مرشح الغرض الخاص بك بإستخدام عنصر <action>.

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

 

Data البيانات

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

يمكنك تحديد فقط نوع “صيغة” MIME، فقط بادئة URI ، أو فقط مخطط URI ، أو مزيج من هذه وغيرها، والتي تشير إلى نوع البيانات المقبولة.

ملاحظة: إذا لم تكن بحاجة إلى الإعلان عن تفاصيل حول بيانات Uri (مثل عندما يتعامل نشاطك مع نوع آخر من البيانات “الإضافية”..

بدلاً من معرف الموارد المنتظم Uri) ، يجب عليك تحديد سمة android:mimeType فقط لتوضيح نوع البيانات التي يعالجها نشاطك، مثل text/plain أو image/jpeg.

 

Category التصنيف

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

هناك العديد من التصنيفات المختلفة التي يدعمها النظام، ولكن معظمها نادرة الإستخدام.

ومع ذلك، يتم تعريف كافة الأغراض الضمنية بإستخدام CATEGORY_DEFAULT بشكلٍ افتراضي.

حدد هذا في مرشح غرضك بإستخدام عنصر <category>.

 

في مرشح غرضك، يمكنك تحديد المعايير التي يقبلها نشاطك عن طريق التصريح عن كل منها بعناصر XML المقابلة والموجودة في عنصر <intent-filter>.

مثال، إليك نشاطاً بمرشح غرض والذي يتعامل مع غرض “الإرسال” 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"/>
        <data android:mimeType="image/*"/>
    </intent-filter>
</activity>

 

نصيحة: إذا كنت تريد أن تكون الأيقونة في مربع حوارالمنتقي مختلفة عن الأيقونة الإفتراضية لنشاطك، قم بإضافة android:icon في عنصر <intent-filter>.

 

 

كل غرض وارد يحدد نوع واحد فقط من الإجراءات ونوع واحد من البيانات، ولكن لا بأس من الإعلان عن..

مثيلات متعددة لعناصر <action> و <category> و <data> في كل عنصر من <intent-filter>.

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

مثال، لنفترض أن نشاطك يتعامل مع النصوص والصور لكل من أغراض “الإرسال” ACTION_SEND و “الإرسال إلى” ACTION_SENDTO.

في هذه الحالة، يجب عليك تحديد مرشحي غرض منفصلين للإجراءين لأن الغرض “الإرسال إلى” ACTION_SENDTO ..

يجب أن يستخدم بيانات Uri لتحديد عنوان المستلم بإستخدام نظام الإرسال أو الإرسال إلى الخاص بـ URI. مثال:

<activity android:name="ShareActivity">
    <!-- filter for sending text; accepts SENDTO action with sms URI schemes -->
    <intent-filter>
        <action android:name="android.intent.action.SENDTO"/>
        <category android:name="android.intent.category.DEFAULT"/>
        <data android:scheme="sms" />
        <data android:scheme="smsto" />
    </intent-filter>
    <!-- filter for sending text or images; accepts SEND action and text or image data -->
    <intent-filter>
        <action android:name="android.intent.action.SEND"/>
        <category android:name="android.intent.category.DEFAULT"/>
        <data android:mimeType="image/*"/>
        <data android:mimeType="text/plain"/>
    </intent-filter>
</activity>

 

ملاحظة: لتلقي الأغراض الضمنية، يجب عليك تضمين تصنيف CATEGORY_DEFAULT في مرشح الغرض.

تقوم دوال ()startActivity و ()startActivityForResult بمعالجة كافة الأغراض كما لو أنها أعلنت عن التصنيف CATEGORY_DEFAULT.

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

 

لمزيد من المعلومات حول إرسال وإستقبال أغراض “الإرسال” ACTION_SEND التي تؤدي سلوكيات المشاركة الإجتماعية..

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

 

 

 

 

 

 

السماح لتطبيقات أخرى ببدء نشاطك

 

تعامل مع الأغراض في نشاطك


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

عندما يبدأ نشاطك، قم بإستدعاء “الحصول على الغرض” ()getIntent لإسترداد الغرض الذي بدأ النشاط.

يمكنك القيام بذلك في أي وقت خلال دورة حياة النشاط، ولكن يجب عليك القيام بذلك بشكلٍ عام أثناء الإستدعاءات الأولى مثل ()onCreate أو ()onStart .

مثال:

KOTLIN

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)

    setContentView(R.layout.main)

    val data: Uri? = intent?.data

    // Figure out what to do based on the intent type
    if (intent?.type?.startsWith("image/") == true) {
        // Handle intents with image data ...
    } else if (intent?.type == "text/plain") {
        // Handle intents with text ...
    }
}

 

JAVA

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.main);

    // Get the intent that started this activity
    Intent intent = getIntent();
    Uri data = intent.getData();

    // Figure out what to do based on the intent type
    if (intent.getType().indexOf("image/") != -1) {
        // Handle intents with image data ...
    } else if (intent.getType().equals("text/plain")) {
        // Handle intents with text ...
    }
}

 

 

 

 

 

 

السماح لتطبيقات أخرى ببدء نشاطك

إرجاع النتيجة


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

عند الإنتهاء من العملية و يجب أن يعود المستخدم إلى النشاط الأصلي، قم بإستدعاء دالة “الإنهاء” ()finish لإغلاق (تدمير) نشاطك. مثال: 

KOTLIN

// Create intent to deliver some kind of result data
Intent("com.example.RESULT_ACTION", Uri.parse("content://result_uri")).also { result ->
    setResult(Activity.RESULT_OK, result)
}
finish()

 

JAVA

// Create intent to deliver some kind of result data
Intent result = new Intent("com.example.RESULT_ACTION", Uri.parse("content://result_uri"));
setResult(Activity.RESULT_OK, result);
finish();

 

 

يجب عليك دائماً تحديد كود النتيجة بالنتيجة. بشكلٍ عام، فإنها إما RESULT_OK أو RESULT_CANCELED.

يمكنك بعد ذلك تقديم بيانات إضافية بإستخدام غرض، حسب الضرورة.

ملاحظة: يتم تعيين النتيجة إلى RESULT_CANCELED إفتراضياً. لذا، إذا قام المستخدم بالضغط على الزر “رجوع”..

قبل إكمال الإجراء وقبل تعيين النتيجة، سوف يتلقى النشاط الأصلي النتيجة “ملغي”.

إذا كنت تحتاج ببساطة إلى إرجاع عدد صحيح يشير إلى أحد خيارات النتائج المتعددة، يمكنك تعيين كود النتيجة إلى أي قيمة أعلى من الصفر “0”.

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

KOTLIN

setResult(RESULT_COLOR_RED)
finish()

 

JAVA

setResult(RESULT_COLOR_RED);
finish();

 

 

في هذه الحالة، قد لا يكون هناك سوى عدد قليل من النتائج المحتملة، وبالتالي فإن كود النتيجة هو عدد صحيح محدد محلياً (أكبر من 0).

يعمل هذا بشكلٍ جيد عندما تقوم بإرجاع نتيجة إلى نشاط في تطبيقك..

لأن النشاط الذي يتلقى النتيجة يمكن أن يشير إلى الثابت العام لتحديد قيمة كود النتيجة.

ملاحظة: ليست هناك حاجة للتحقق مما إذا كان نشاطك قد بدأ مع ()startActivity أو ()startActivityForResult .

ما عليك سوى إستدعاء ()setResult إذا كان الغرض الذي بدأ نشاطك يتوقع نتيجة. إذا كان النشاط الأصلي قد قام بإستدعاء ()startActivityForResult ..

يقوم النظام بتسليمه النتيجة التي قمت بتقديمها إلى ()setResult ؛ خلاف ذلك، يتم تجاهل النتيجة.

 


للإطلاع على المقال باللغة الإنجليزية أضغط هنا.

الإعلانات

1 thought on “السماح لتطبيقات أخرى ببدء نشاطك”

اترك رد