30 – ارسال المستخدم إلى تطبيق اخر Sending the User to Another App

ملاحظة : الموضوع عبارة عن حلقة من حلقات سلسلة برمجة وتطوير اندرويد Android Development

اندرويد : ارسال المستخدم إلى تطبيق اخر Sending the User to Another App

السلام عليكم ورحمة الله وبركاته

سوف نتعلم في هذا الدرس مايلي:

  • بناء intent ضمني Build an Implicit Intent
  • التحقق من وجود تطبيق جاهز لتلقي ال intent Verify There is an App to Receive the Intent
  • بدء تشغيل فعالية عبر استخدام Intent
  • اظهار صندوق اختيار التطبيق  Show an App Chooser

يفضل الاطلاع على

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

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

كما شرحنا في الدرس الأول ” بناء تطبيقك الاول باندرويد”, فإنه يتوجب عليك استخدام ال intents للتنقل بين الفعاليات ضمن تطبيقك. عادة ما نقوم بذلك ولكن عبر استخدام ال intent الصريحة explicit, والتي تحدد بشكل دقيق اسم الصف الخاص بالمكون الذي ترغب بتشغيله.

على كل الأحوال, عندما ترغب بأن يقوم تطبيق منفصل بانجاز حدث ما, مثل “استعراض الخريطة”, فعليك عندها استخدام الintent  الضمنية “implicit intent”.

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

بناء intent  ضمنية Build an Implicit Intent

ضمن ال intent  الضمنية لا نقوم بالتصريح عن اسم صف المكون الذي نرغب بتشغيله , ولكن بدلا من ذلك نصرح عن الحدث الذي نرغب بتنفيذه.

يحدد الحدث action الامور التي نرغب بالقيام بها, مثل : استعراض , تحرير , ارسال أو احضار شيء ما.

غالبا ما تقوم ال Intent  بتضمين المعطيات المترافقة مع الحدث, مثل العنوان الذي نرغب باستعراض موقعه على الخريطة (في مثالنا السابق), او الرسالة التي نرغب بإرسالها.

تتحدد المعطيات المرافقة للحدث اعتمادا على ال intent  التي ترغب بإنشائها, وقد لا تحتاج ال Intent إلى معطيات نهائيا.

في حال كانت المعطيات هي عبارة عن Uri, عندها فإنه يوجد باني بسيط لل Intent Intent(), بإمكانك استخدامه لتحديد  الحدث والمعطيات.

على سبيل المثال, فيما يلي مثال على كيفية انشاء intent يهدف إلى تهيئة الاتصال الهاتفي بالرقم المطلوب عبر استخدام معطيات من نمط  Uri  التي تقوم بتحديد رقم الهاتف.

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

عندما يستدعي التطبيقك هذه ال intent عبر استدعاء التابع startActivity(), عندها يقوم تطبيق الهاتف Phone app بالتهيئة للاتصال برقم الهاتف المعطى.

فيما يلي بعض ال intents  الاخرى والاحداث التي تقوم بها وازواج المعطيات التي من نمط Uri  :

  • استعراض الخريطة View a Map

// 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);
  • استعراض صفحة ويب View a web page
Uri webpage = Uri.parse("http://www.android.com");
Intent webIntent = new Intent(Intent.ACTION_VIEW, webpage);

هنالك انواع اخرى من ال intents الضمنية التي تتطلب المزيد من المعطيات التي تزودنا بانماط معطيات مختلفة , مثل السلاسل المحرفية string. بإمكانك اضافة قطعة او اكثر من المعطيات الاضافية extra data  باستخدام توابع putExtra().

بشكل افتراضي, يحدد النظام نمط MIME  المناسب المطلوب من قبل ال intent اعتمادا على معطيات Uri  المضمنه ضمن ال intent.

في حال لم تقم بتضمين Uri ضمن ال intent, فعليك عادة استخدام تابع setType() لتحدد نمط المعطيات المرافق لل intent.

إن التحكم باعدادادت MIME بشكل متقدم يحدد ويخصص انواع الفعاليات التي يتوجب عليها تلقى واستقبال ال intent.

فيما يلي بعض ال intents التي تقوم بإضافة معطيات اضافية extra data  وذلك بهدف تحديد الحدث المطلوب القيام به.

  • ارسال بريد الكتروني مع ملف مرفق:
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
  • إنشاء حدث بتاريخ محدد
Intent calendarIntent = new Intent(Intent.ACTION_INSERT, Events.CONTENT_URI);
Calendar beginTime = Calendar.getInstance().set(2012, 0, 19, 7, 30);
Calendar endTime = Calendar.getInstance().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");

ملاحظة : الحدث السابق (المرتبط بتاريخ محدد) مدعوم فقط ضمن  نظم اندرويد ب API level 14 أو أعلى.

ملاحظة : من المفيد ان تقوم بتعريف  ال intent  الخاصة بك بحيث تكون محددة وواضحة قدر الامكان.على سبيل المثال, في حال رغبت باستعراض صورة عبر استخدام intent من نوع ACTION_VIEWفإنه يتوجب عليك تحديد نوع MIME الخاص بالصورة   image/*. يمنع هذا التخصيص بقية التطبيقات التي تستطيع القيام “باستعراض” الصور من بقية انماط المعطيات (مثل تطبيق الخريطة) من ان يتم قدحها triggered من قبل ال intent.

التحقق من وجود تطبيق ما لتلقي واستقبال ال intent  Verify There is an App to Receive the Intent

بالرغم من ان تطبيق اندرويد يضمن ارتباط بعض ال intents  مع التطبيقات المترافقة مع النظام بشكل اساسي build-in apps ( مثل الهاتف phone, الايميل الالكتروني Email, او تطبيق التقويم Calendar app), ولكن يتوجب عليك دوما تضمن خطوة تحقق قبل استدعاء ال intent.

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

للتحقق من وجود فعالية متاحة تستطيع التعامل والاستجابة لل intent, يجب استدعاء التابع  queryIntentActivities()للحصول على قائمة من الفعاليات المتاحة التي تستطيع التعامل مع ال intent. في حال لم تكن القائمة المعادة فارغة , عندها بإمكانك بامان استخدام ال intent. على سبيل المثال:

 

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

في حال كانت قيمة isIntentSafe  مساوية ل true , فهذا يعني بأنه يوجد على الاقل تطبيق واحد يستطيع الاستجابة لل intent. اما في حال كانت القيمة مساوية ل false, فهذا يعني بأنه لا يوجد أي تطبيق يستطيع التعامل مع ال intent.

ملاحظة : يتوجب عليك القيام بهذا التحقق عندما تعمل فعاليتك لاول مرة وذلك في حال احتجت لازالة تفعيل هذه الميزة التي تستخدم ال intent قبل ان يحاول المستخدم استخدامها. في حال كنت تعرف تطبيق محدد يستطيع التعامل مع هذه ال intent  عندها بإمكانك ان تزود المستخدم برابط  لتحميل هذا التطبيق (بالامكان الاطلاع على كيفية        link to your product on Google Play).

تشغيل فعالية عبر استخدام Intent  Start an Activity with the Intent

 appchooser

الشكل 1 : مثال على صندوق اختيار يظهر في حال كان هنالك اكثر من تطبيق يستطيع التعامل مع ال intent.

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

startActivity(intent);

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

// 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);
}

اظهار مختار التطبيقات Show an App Chooser

 appchooser2

الشكل 2 : مثال على صندوق اختيار يظهر عندما تستخدم التابع createChooser()للتأكد من ان يتم دوما اظهار قائمة للمستخدم بالتطبيقات التي من الممكن ان تستجيب لل Intent التي قمت ببنائها.

لاحظ بانه عندما تقوم بتشغيل فعالية عبر تمرير ال Intent  الخاصة بك إلى التابع startActivity()و كان هنالك اكثر من تطبيق يستطيع الاستجابة لتلك ال intent, عندها بإمكان المستخدم اختيار التطبيق الذي يرغب باستخدامه بشكل افتراضي (عبر تحديد مربع الاختيار checkbox في اسفل الصندوق –الشكل 1).

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

لاظهار امكانية الاختيار , انشأ ال intent باستخدام التابع createChooser()ومن ثم مرره إلى التابع startActivity()على سبيل المثال:

 

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().getText(R.string.chooser_title);
// Create and start the chooser
Intent chooser = Intent.createChooser(intent, title);
startActivity(chooser);

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

إلى لقاء قريب في الحلقة القادمة

وإلى ذلك الحين استودعكم الله والسلام عليكم ورحمة الله وبركاته.

الترجمة

المصطلح

فعالية

Activity

ضمني

Implicit

Advertisements

, , , , , , , , , , , , , , , , , , , , , ,

  1. أضف تعليق

اترك رد

Please log in using one of these methods to post your comment:

WordPress.com Logo

أنت تعلق بإستخدام حساب WordPress.com. تسجيل خروج   / تغيير )

صورة تويتر

أنت تعلق بإستخدام حساب Twitter. تسجيل خروج   / تغيير )

Facebook photo

أنت تعلق بإستخدام حساب Facebook. تسجيل خروج   / تغيير )

Google+ photo

أنت تعلق بإستخدام حساب Google+. تسجيل خروج   / تغيير )

Connecting to %s

%d مدونون معجبون بهذه: