الأربعاء، 19 ديسمبر 2012

الكائن Intent و التعامل مع التطبيقات الأخرى


الكائن Intent و التعامل مع التطبيقات الأخرى
Interacting with Other Apps
تطبيقات الاندرويد  لديها عادة العديد من الأنشطة ( Activity ). كل نشاط يعرض واجهة مستخدم التي تسمح للمستخدم بأداء مهمة محددة (مثل عرض خريطة أو التقاط صورة).
و لنقل  المستخدم من نشاط إلى آخر، يجب أن يستخدم التطبيق الخاص بك الكائن Intent   لتوجيه الـ Intent الخاص بك ليقوم بأداء مهمة معين


عندما تقوم بتمرير الـ  Intent  للنظام بوسيلة startActivity( )     النظام يستخدم هذا الكائن لتحديد التطبيق اللازم لبدء النشاط الآخر 
و باستخدام الـ Intent يمكن تشغيل نشاط في تطبيق آخر منفصل عن تطبيقك الخاص
أي أن  Intent   يحتوي بوضوح علي المكونات اللازمة لبدء تشغيل أي نشاط آخر ( مثل التقاط صورة )


توجيه المستخدم إلي تطبيق آخر

-->

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

بناء كائن implicit  Intent  :
اذا كانت البيانات التي سترسلها مع الكائن من النوع مرجع  URI  ( Uniform Resource Identifier  )

مثال : اجراء اتصال من خلال الـ Intent

Uri number = Uri.parse("tel:01114021");
Intent callIntent = new Intent(Intent.ACTION_DIAL, number);
startActivity(callIntent);
عند استدعاء هذا الـ Intent من خلال الوسيلة startActivity( )  سيقوم نظام التشغيل باجراء اتصال بالرقم المحدد

مثال 2 : عرض الخرائط بإستخدام الـ Intent :

// 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);
startActivity(mapIntent);
-->

مثال 3 : لفتح صفحة انترنت:
Uri webpage = Uri.parse("http://arabic-android.blogspot.com/");
Intent webIntent = new Intent(Intent.ACTION_VIEW, webpage);
startActivity(webIntent);
أنواع أخرى من الـ Intent الضمنية تتطلب بيانات "إضافية"  من  أنواع مختلفة من البيانات، مثل سلسلة حرفية String. يمكنك إضافة  عدة  بيانات مختلفة مع الـ Intent  باستخدام  الوسيلة putExtra()

مثال 4 : ارسال بريد الكتروني باستخدام الـ Intent


mailIntent = 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[] {"ahmed@yahoo.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
startActivity(mailIntent);


مثال 5 : إنشاء حدث في الأجندة  Create a calendar event:
( هذا المثال متاح فقط للـ Api 14 )

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");


تحدد ما إذا كان يوجد علي الجهاز تطبيق مناسب لتنفيذ أوامر الـ Intent:
عند تشغيل الـ Intent باستخدام الوسيلة startActivity() و لم يكن متوفرا علي الجهاز تطبيق مناسب ( مثل طلب تحميل صفحة انترنت و لا يوجد برنامج متصفح علي الجوال ) فإن تطبيقك سيتوقف عن العمل

لمعرفة ما اذا كان تطبيق ما متوفرا علي الجوال قبل تشغيل الـ Intent نستدعي الدالة  queryIntentActivities()   و لو كان نتيجة هذه الدالة قائمة غيرة فارغة فهذا يعني ان الجوال يحتوي علي تطبيق مناسب لتنفيذ الـ Intent

مثال :
PackageManager packageManager = getPackageManager();
List<ResolveInfo> activities = packageManager.queryIntentActivities(intent, 0);
boolean isIntentSafe = activities.size() > 0;
لو كانت نتيجة isIntentSafe تساوي True عندها يمكنك تنفيذ الـ 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);
}
انتهي بحمد الله

هناك تعليق واحد:

  1. شكرا على المعلومه بس عندي سؤال هل يمكن فتح activity من داخل activity تاني قد تم فتحه بواسطه activity تالت
    يعني اصبح عنا 3 activity
    activity1---> activity2----> activity3

    ردحذف