ارسال المستخدم إلى تطبيق آخر

الإعلانات

ارسال المستخدم إلى تطبيق آخر

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

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

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

يبدأ نظام الاندرويد بعد ذلك بتشغيل تطبيق يمكنه عرض العنوان على الخريطة ” قوقل ماب”.

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

أنت تقوم بذلك بشكلٍ عام مع غرض صريح، والذي يحدد اسم الفئة الدقيق، للمكون الذي تريد أن تبدأه.

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

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

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

 

 

 

 

ارسال المستخدم إلى تطبيق آخر

 

إنشاء غرض ضمني


لا تقوم الأغراض الضمنية بالإعلان اسم الفئة المكون لبدأه، بل تقوم بدلاً من ذلك بالإعلان عن إجراء ليتم تنفيذه.

يحدد الإجراء الشيء الذي تريد القيام به، مثل العرض أو التعديل أو الإرسال أو الحصول على شيء ما.

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

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

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

مثال، فيما يلي كيفية إنشاء غرض لبدء مكالمة هاتفية بإستخدام بيانات Uri لتحديد رقم الهاتف: 

KOTLIN

val callIntent: Intent = Uri.parse("tel:5551234").let { number ->
    Intent(Intent.ACTION_DIAL, number)
}

JAVA

Uri number = Uri.parse("tel:5551234");
Intent callIntent = new Intent(Intent.ACTION_DIAL, number);

 

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

في ما يلي غرضان آخران و إجراءاتهما و بيانات Uri:

  • عرض خريطة ” قوقل ماب “: 

KOTLIN

// Map point based on address
val mapIntent: Intent = Uri.parse(
        "geo:0,0?q=1600+Amphitheatre+Parkway,+Mountain+View,+California"
).let { location ->
    // Or map point based on latitude/longitude
    // Uri location = Uri.parse("geo:37.422219,-122.08364?z=14"); // z param is zoom level
    Intent(Intent.ACTION_VIEW, location)
}

JAVA

// Map point based on address
Uri location = Uri.parse("geo:0,0?q=1600+Amphitheatre+Parkway,+Mountain+View,+California");
// Or map point based on latitude/longitude
// Uri location = Uri.parse("geo:37.422219,-122.08364?z=14"); // z param is zoom level
Intent mapIntent = new Intent(Intent.ACTION_VIEW, location);

 

 

  • عرض صفحة ويب: 

KOTLIN

val webIntent: Intent = Uri.parse("http://www.android.com").let { webpage ->
    Intent(Intent.ACTION_VIEW, webpage)
}

JAVA

Uri webpage = Uri.parse("http://www.android.com");
Intent webIntent = new Intent(Intent.ACTION_VIEW, webpage);

 

 

تتطلب الأنواع الأخرى من الأغراض الضمنية بيانات “إضافية” توفر أنواعاً مختلفة من البيانات، مثل سلسلة نصية.

يمكنك إضافة جزء أو أكثر من البيانات الإضافية بإستخدام دوال ()putExtra المختلفة.

بشكلٍ إفتراضي، يحدد النظام نوع MIME المناسب المطلوب بواسطة الغرض بناءً على بيانات Uri المضمنة.

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

تعيين نوع “صيغة” MIME يحدد كذلك أنواع الأنشطة التي يجب أن تتلقى الغرض.

في ما يلي بعض الأغراض التي تقوم بإضافة بيانات إضافية لتحديد الإجراء المطلوب:

ارسال بريد إلكتروني به مرفقات:

KOTLIN

Intent(Intent.ACTION_SEND).apply {
    // The intent does not have a URI, so declare the "text/plain" MIME type
    type = HTTP.PLAIN_TEXT_TYPE
    putExtra(Intent.EXTRA_EMAIL, arrayOf("jon@example.com")) // recipients
    putExtra(Intent.EXTRA_SUBJECT, "Email subject")
    putExtra(Intent.EXTRA_TEXT, "Email message text")
    putExtra(Intent.EXTRA_STREAM, Uri.parse("content://path/to/email/attachment"))
    // You can also attach multiple items by passing an ArrayList of Uris
}

JAVA

Intent emailIntent = new Intent(Intent.ACTION_SEND);
// The intent does not have a URI, so declare the "text/plain" MIME type
emailIntent.setType(HTTP.PLAIN_TEXT_TYPE);
emailIntent.putExtra(Intent.EXTRA_EMAIL, new String[] {"jon@example.com"}); // recipients
emailIntent.putExtra(Intent.EXTRA_SUBJECT, "Email subject");
emailIntent.putExtra(Intent.EXTRA_TEXT, "Email message text");
emailIntent.putExtra(Intent.EXTRA_STREAM, Uri.parse("content://path/to/email/attachment"));
// You can also attach multiple items by passing an ArrayList of Uris

 

إنشاء حدث في التقويم :

KOTLIN

Intent(Intent.ACTION_INSERT, Events.CONTENT_URI).apply {
    val beginTime: Calendar = Calendar.getInstance().apply {
        set(2012, 0, 19, 7, 30)
    }
    val endTime = Calendar.getInstance().apply {
        set(2012, 0, 19, 10, 30)
    }
    putExtra(CalendarContract.EXTRA_EVENT_BEGIN_TIME, beginTime.timeInMillis)
    putExtra(CalendarContract.EXTRA_EVENT_END_TIME, endTime.timeInMillis)
    putExtra(Events.TITLE, "Ninja class")
    putExtra(Events.EVENT_LOCATION, "Secret dojo")
}

JAVA

Intent calendarIntent = new Intent(Intent.ACTION_INSERT, Events.CONTENT_URI);
Calendar beginTime = Calendar.getInstance();
beginTime.set(2012, 0, 19, 7, 30);
Calendar endTime = Calendar.getInstance();
endTime.set(2012, 0, 19, 10, 30);
calendarIntent.putExtra(CalendarContract.EXTRA_EVENT_BEGIN_TIME, beginTime.getTimeInMillis());
calendarIntent.putExtra(CalendarContract.EXTRA_EVENT_END_TIME, endTime.getTimeInMillis());
calendarIntent.putExtra(Events.TITLE, "Ninja class");
calendarIntent.putExtra(Events.EVENT_LOCATION, "Secret dojo");

 

 

ملاحظة: لا يتم دعم هذا الغرض الخاص بحدث التقويم إلا في مستوى واجهة برمجة التطبيقات رقم 14 و أعلى.

 

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

يجب عليك تحديد نوع “صيغة” MIME للصورة */image. يؤدي هذا إلى منع التطبيقات التي يمكنها “عرض”..

أنواع البيانات الأخرى (مثل تطبيق الخريطة \ خرائط ) من أن يتم تشغيلها بواسطة الغرض.

 

 

 

 

 

ارسال المستخدم إلى تطبيق آخر

 

تحقق من وجود تطبيق يتلقى الغرض


على الرغم من أن نظام الاندرويد الأساسي يضمن أن بعض الأغراض ستذهب إلى أحد التطبيقات المضمنة..

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

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

للتحقق من وجود نشاط متاح يمكنه الإستجابة للغرض، قم بإستدعاء ()queryIntentActivities  للحصول على قائمة..

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

KOTLIN

val activities: List<ResolveInfo> = packageManager.queryIntentActivities(
        intent,
        PackageManager.MATCH_DEFAULT_ONLY
)
val isIntentSafe: Boolean = activities.isNotEmpty()

JAVA

PackageManager packageManager = getPackageManager();
List<ResolveInfo> activities = packageManager.queryIntentActivities(intent,
        PackageManager.MATCH_DEFAULT_ONLY);
boolean isIntentSafe = activities.size() > 0;

 

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

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

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

 

 

 

 

بدء نشاط بالغرض


بمجرد إنشاء غرض وتعيين المعلومات الإضافية، قم بإستدعاء ()startActivity لإرساله إلى النظام.

إذا قام النظام بتعريف أكثر من نشاط يمكنه التعامل مع الغرض، فإنه يعرض مربع حوار (يشار إليه أحياناً بأسم “مربع حوار التوضيح”)..

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

KOTLIN

startActivity(intent)

JAVA

startActivity(intent);

 

 

 

           الشكل 1 مثال على مربع حوار الإختيار الذي يظهر عندما يكون

                هناك أكثر من تطبيق يمكنه التعامل مع الغرض.

 

فيما يلي مثال كامل يوضح كيفية إنشاء غرض لعرض الخريطة ” قوقل ماب “، والتحقق من وجود تطبيق للتعامل مع الغرض، ثم بدأه:

KOTLIN

// Build the intent
val location = Uri.parse("geo:0,0?q=1600+Amphitheatre+Parkway,+Mountain+View,+California")
val mapIntent = Intent(Intent.ACTION_VIEW, location)

// Verify it resolves
val activities: List<ResolveInfo> = packageManager.queryIntentActivities(mapIntent, 0)
val isIntentSafe: Boolean = activities.isNotEmpty()

// Start an activity if it's safe
if (isIntentSafe) {
    startActivity(mapIntent)
}

JAVA

// Build the intent
Uri location = Uri.parse("geo:0,0?q=1600+Amphitheatre+Parkway,+Mountain+View,+California");
Intent mapIntent = new Intent(Intent.ACTION_VIEW, location);

// Verify it resolves
PackageManager packageManager = getPackageManager();
List<ResolveInfo> activities = packageManager.queryIntentActivities(mapIntent, 0);
boolean isIntentSafe = activities.size() > 0;

// Start an activity if it's safe
if (isIntentSafe) {
    startActivity(mapIntent);
}

 

 

 

 

 

 

إظهار منتقي التطبيقات


لاحظ أنه عند بدء نشاط عن طريق تمرير غرضك لبدء ()startActivity ، وهناك أكثر من تطبيق يستجيب للغرض..

يمكن للمستخدم تحديد تطبيق ليستخدم بشكلٍ إفتراضي (عن طريق تحديد مربع الإختيار في أسفل مربع الحوار؛ أنظر الشكل 1).

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

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

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

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

يجب عليك عرض مربع حوار محدد بشكلٍ واضح كما هو موضح في الشكل 2.

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

 

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

لإظهار المنتقي، قم بإنشاء غرض بإستخدام ()createChooser وقم بتمريره إلى ()startActivity . مثال:

KOTLIN 

val intent = Intent(Intent.ACTION_SEND)
...

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

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

JAVA

Intent intent = 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 chooser
Intent chooser = Intent.createChooser(intent, title);

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

 

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

 


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

الإعلانات

1 thought on “ارسال المستخدم إلى تطبيق آخر”

اترك رد