السلام عليكم ..
بما انك مبرمج اندرويد فإنك سنسمع كثيرا عن مايسمى بالـIntent وفي هذا الدرس سنقوم بشرح مفهوم الـ Intent في الاندرويد وهو احد الأمور التي يجب على أي مطور اندرويد فهمها بالتفصيل وسنقوم في هذا الدرس بشرح أربعة أمور:
1-ماهو الـ Intent؟
2-استخدامات الـ Intent.
3-مما يتكون الـ Intent؟
4-أنواع الـ Intent.
5-أمثلة على استخدام الـ Intent وانواعه.
حيث سيكون هذا الـ output من الدرس من خلال هذا الفيديو:
وبعد الانتهاء من هذ الدرس وفهمه ستكون قادرا على الاتي:
1-إرسال بريد الكتروني بواسطة الـ Intent.
2-إرسال رسالة نصية بواسطة الـ Intent.
3-كيفية الانتقال من شاشة إلى أخرى بواسطة الـ Intent.
4-استخدام خرائط جوجل بواسطة الـ Intent.
5-فتح برنامج المتصل بواسطة الـ Intent.
6-كيفية استدعاء برامج النظام Built-in.
1-ما هو مفهوم الـ Intent؟
الـ intent هو أحد الامور الأساسية لأي تطبيق أندرويد ، ولا يكاد يخلو أي تطبيق اندرويد من استخدام الـ Intent ويستخدم لارسال البيانات بين مكونات التطبيق كما يستخد ايضا للانتقال بين مكونات التطبيق ، وكما هو معروف إن أي تطبيق اندرويد يحتوي على مكونات أساسية وهي كمايلي:
1-Activity
وهي عبارة ان أي شاشة تراها في تطبيقك.
2-Services
الخدمات وهي عبارة عن كود يعمل في الخلفية أي لاتوجد له واحهة مرئية كمثال: تشغيل موسيقى،تنزيل ملف من الانتر نت الخ ..
3-Broadcast Receiver
وهو كود يعمل في حالات معينة تقوم بتحديدها انت عندما تقوم ببرمجة تطبيقك كمثال عندما تريد إن يقوم تطبيقك بعمل ما عندما يكون الهاتف في وضع الطيران أو في حالة عدم توفر اتصال الخ..
يقوم الـ Intent بنقل البيانات بين مكونات التطبيق كمثال عندما يكون الهاتف في وضع الطيران فإن الـ Intent هو المسؤول عن نقل بيانات حالة البطارية إلى تطبيقك.
أيضا عندما تريد الانتقال من الواجهة الحالية إلى واجهة أخرى فإن الـIntent هو المسؤول عن ذلك.
2-استخدامات الـ Intent
2-استخدامات الـ Intent
توجد لـ Intent استخدامات عديدة ومنها مايلي:
1-يستخدم في الانتقال بين الواجهات Activities.
2-يستخدم أيضا لتشغيل الخدمات Services للقيام بإعمال في الخلفية.
3-يستخدم لاستقبال الاحداث Events ٍSystem من الـ Broadcast Receiver.
4-تحديد Launcher Activity أي تحديد الواجهة التي ستظهر ايقونتها بقائمة التطبيقات في الهاتف كمثال عندما يكون في تطبيقك اربع واجهات فإن ال intent سيقوم بتحديد إي واجهة ستظهر أولا عند فتح التطبيق.
3-ماهي أنواع ال Intent؟
يوجد نوعين من Intent وهي كمايلي:
1-Explicit
Intent :
وفي هذا النوع يتم معرفة المكون الذي سيقوم باستقبال هذا الـ Intent كمثال: عندما يحتوي التطبيق على شاشتين ونريد الانتقال من الشاشة الاولى الى الشاشة الثانية فإننا نقوم بإعطاء اسم الشاشة الثانية للـ Intent ليقوم الانتقال اليها.
2-Implicit
Intent:
4-مكونات الـ Intent
كما ذكرنا أن في Implicit Intent لا
يتم تحديد أسم المكون الذي نريد الوصول اليه !..
سؤال يضع نفسه .. كيف يتم الوصول اليه أذن؟؟
سؤال يضع نفسه .. كيف يتم الوصول اليه أذن؟؟
يتم الوصول اليه من
خلال تحديد واحد على الاقل من أربعة مكونات لـ Intent ومن تلك المكونات يتم
تحديد الوظيفة التي سيقوم بها الـ Intent.
يتكون الـ Intent
من اربعه مكونات أساسية
وهي كما يلي:
1-Action
وهو العمل المطلوب من
هذا الـ Intent كـمثال :عمل اتصال,إرسال ايميل، عرض صفحة ويب الخ..
2-Data
وهو نوع البيانات
المطلوب التعامل معها كمثال عندما نريد فتح صفحة ويب فإننا نحدد نوع البيانات كـ URL كعنوان صفحة الويب التي
نريد فتحها.
3-Extras
وهي بيانات إضافية يتم إسنادها لهذه الـ Intent كـ (Key/Value) كمثال عندما ننشئ Intent يقوم بفتح صفحة ويب فما هو عنوان الصفحة التي نريد فتحها .. يتم اسناد عنوان تلك
الصفحة في Extras وسيتم توضيح هذه المفاهيم
بالامثلة.
4-Category
وهي الفئات والغرض منها تحديد وتنظيم مكونات كمثال:تحديد الـ Launcher Activity، تصنيف المكونات على حسب الوظيفة الخ ..
5- أمثلة على Intent
سنقوم
الان بذكر عدة امثلة عن الـ Intent
وسنشرح في هذه الامثلة كيفية :
1-الانتقال إلى شاشة اخرى.
2-ارسال بريد الكتروني بواسطة الـ Intent.
3-إرسال رسالة نصية بواسطة الـ Intent.
4-فتح خرائط جوجل بواسطة الـ Intent.
5-اجراء اتصال هاتفي بواسطة الـ Intent..
لنبدأ ونقوم بمايلي:
وسنشرح في هذه الامثلة كيفية :
1-الانتقال إلى شاشة اخرى.
2-ارسال بريد الكتروني بواسطة الـ Intent.
3-إرسال رسالة نصية بواسطة الـ Intent.
4-فتح خرائط جوجل بواسطة الـ Intent.
5-اجراء اتصال هاتفي بواسطة الـ Intent..
لنبدأ ونقوم بمايلي:
1- نفتح اندرويد استديو
ونقوم بإنشاء مشروع جديد نسميه Intent Example.
2- نقوم بإضافة واجهة
جديدة إلى مشروعنا (أي سيحتوي مشروعنا على شاشتين) وذلك عبر الخطوات التالية:
1.2-نضغط بالزر الأيمن على المشروع ثم نختار الاتي:
Empty Activity<Activity<New
حيث يطلب مننا مربع الحوار أعلاه ادخال مايلي:
-اسم ملف الجافا الخاص
بهذه الشاشة كـ ActivityB.
-أسم ملف التصميم
الخاص بهذه الشاشة كـ activity_b.
بعد ذلك نقوم بالضغط على الزر Finish ليقوم بإضافة شاشة أخرى
للمشروع.
مشروعنا
الان يحتوي على شاشتين :
1-MainActivity: وهي الشاشة التي ستظهر
أولا عند تشغيل التطبيق.
2-ActivityB : وهي
الشاشة الثانية في المشروع.
3-نذهب إلى ملف activity_main ونقوم
بإضافة 5 أزار كما في الكود ادناه:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 | <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:orientation="vertical" tools:context="com.blogspot.muteealjabri.intentexamples.MainActivity"> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Open New Activity" android:id="@+id/button" android:onClick="openNewActivity" android:layout_marginTop="15dp" android:textSize="18sp" android:padding="15dp" /> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Send Email" android:id="@+id/button2" android:onClick="sendEmail" android:layout_marginTop="15dp" android:textSize="18sp" android:padding="15dp" /> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:text="sendSms" android:id="@+id/button3" android:onClick="sendSMS" android:layout_marginTop="15dp" android:textSize="18sp" android:padding="15dp" /> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:text="open Google Map" android:id="@+id/button4" android:onClick="openGoogleMap" android:layout_marginTop="15dp" android:textSize="18sp" android:padding="15dp" /> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:text="make Call" android:id="@+id/button5" android:onClick="makeCall" android:layout_marginTop="15dp" android:textSize="18sp" android:padding="15dp" /> </LinearLayout> |
ثم ستظهر الشاشة كما في الصورة ادناه:
4-نذهب إلى الملف MainActivity.java ونضيف دوال حدث الضغط على الزر التالية:
1 2 3 4 5 | Public void openNewActivity(View v){ } Public void sendEmail(View v){ } Public void sendSMS(View v){ } Public void openGoogleMap(View v){ } Public void makeCall(View v){ } |
وقبل البدء بكتابة الكود سنقوم بتوضيح عدد من الداول التي سنقوم باستخدامها في مثالنا وهي كمايلي :
1-(startActivity(Intent i
تستخدم هذه الدالة لفتح Activity أخرى باستخدام الـ Intent الذي يمرر لها.
2-(setData(Uri uri
نستخدم هذه الدالة لتحديد نوع البيانات التي سيتعامل معها هذا الـ Intent.
3-(createChooser(Intent i ,String title
-تستخدم لعرض جميع المكونات التي بامكانها استقبال هذا الـ Intent.
4-(putExtras(String key,String value
-تستخدم لإضافة بيانات اضافية باستخدام(pair/value)
key:مفتاح القيمة الت سنقوم بارسالها ويستخدم لاسترجاع القيمة المراد إرسالها.
value:وهي قيمة البيانات المراد ارسالها.
والان بعد أن شرحنا
الداول سنقوم بالاتي:
1.5:فتح شاشة جديدة باستخدام Implicit Intent:
كما ذكرنا إن Implicit Intent نقوم بتحديد المكون الذي نريد القيام بفتحه وفي مثالنا هنا نقوم بتحديد الـ Activity التي سنقوم بفتحها كما في الكود ادناه:
1 2 3 4 | public void openNewActivity(View v){ Intent i = new Intent(MainActivity.this,ActivityB.class); startActivity(i); } |
نأتي الان لشرح الكود:
السطر2: إنشاء كائن من الكلاس Intent ومن ثم تمرير له الشاشة الحالية وهي MainActivity والبارميتر الثاني الشاشة التي نريد الانتقال له وهي ActivityB.
السطر 3: الانتقال إلى الشاشة نقوم باستدعاء دالة startActivity ونمرر لها الـ intent الذي قمنا بإنشائه.
سنقوم الان بإرسال
بريد الكتروني بواسطة تطبيق البريد الالكتروني الموجود مع النظام.
فقط سنقوم بإرسال Intent وسيقوم نظام التشغيل بعرض جميع التطبيقات التي ستقوم بارسال ايميل
وللقيام بذلك:-نذهب الى دالة حدث الضغط على الزر الخاص بإرسال الايميل ونكتب فيه
الكود ادناه:
1 2 3 4 5 6 7 8 9 10 11 | public void sendEmail(View v){ Intent i = new Intent(Intent.ACTION_SEND); i.setData(Uri.parse("mailto:")); String [] to={"xxxxxxxxxx@gmail.com","xxxxx@gmail.com"}; i.putExtra(Intent.EXTRA_EMAIL,to); i.putExtra(Intent.EXTRA_SUBJECT,"This is subject"); i.putExtra(Intent.EXTRA_TEXT,"This is my mmessage body"); i.setType("message/rfc822"); Intent choose = Intent.createChooser(i,"send Email"); startActivity(choose); } |
ناتي الان لشرح
الكود:
السطر 2:إنشاء كائن
من الكلاس Intent وتحديد الـ Action وهو ACTION_SEND (أي إن هذا الـ Intent سيقوم بارسال بيانات).
السطر 3:تحديد
بروتوكول الايميل وهو Mailto .
السطر 4:مصفوفة نصية
تحتوي على عناوين البريد الالكتروني التي ستقوم باستلام البريد الالكتروني.
السطر 5:إضافة بيانات
إلى هذا الـ Intent هنا نقوم بتحديد العناوين التي ستقوم
باستلام رسالة البريد الالكتروني(المرسل
اليها).
السطر 6: تحديد موضوع
الرسالة.
السطر 7: تحديد نص
الرسالة.
السطر 8: تحديد نوع
البيانات التي سيتعامل معها النظام.
السطر 9 : عرض مربع حوار يحتوي على المكونات التي
بإمكانها فتح هذه الـ Intent.
السطر 10: فتح المكون
التي بإمكانها استقبال هذا الـ intent. *ملاحضة: المرسل سيكون بريدك الخاص الذي قمت بتسجيل الدخول اليه عبر تطبيق البريد الالكتروني على هاتفك كمثال تطبيق Gamil.
3.5:ارسال رسالة نصية بواسطة الـ Implicit Intent
سنقوم الان بإرسال رسالة نصية بواسطة الـ Intent الذي سيتم تمريره إلى برنامج الرسائل الموجود مع النظام.
نقوم بكتابة دالة حدث
الضغط على الزر الخاص بـ SendSMS :
1 2 3 4 5 6 7 | public void sendSMS(View v){ Intent it = new Intent(Intent.ACTION_SENDTO); it.setData(Uri.parse("smsto:12346556")); it.putExtra("sms_body", "Here you can set the SMS text to be sent"); Intent intent=Intent.createChooser(it,"Send Sms USING"); startActivity(intent); } |
نأتي الان لشرح هذا الكود:
السطر 2:إنشاء كائن من
الكلاس Intent ومن
ثم تحديد الـ Action
عبر الثابت ACTION_SENDTO (أي سنقوم إرسال بيانات).
السطر3 :تحديد نوع البيانات وهنا نقوم بتمرير البروتكول "smsto:123344" متبوعا برقم الهاتف الذي نريد ارسال الرسالة
له.
السطر4 :تحديد نص الرسالة
المراد ارسالها.
السطر 5: عرض جميع البرامج
التي بإمكانها استقبال هذه في حالة إذا كان هناك أكثر من برنامج رسائل واحد مثبت
على هاتفك).
السطر 6: فتح برنامج
الرسائل .
4.5:فتح خرائط جوجل بواسطة الـ Implicit Intent
سنقوم الان بفتح
خرائط جوجل ونقوم بكتابة كود دالة حدث
الضغط على الزر openGoogleMaps
كما في الكود ادناه:
1 2 3 4 5 6 7 | public void openGoogleMap(View v){ Intent i = new Intent(android.content.Intent.ACTION_VIEW); i.setData(Uri.parse("geo:18.09,77,776")); Intent choose = Intent.createChooser(i,"open Map"); startActivity(choose); } |
ناتي الان لشرح هذا الكود:
السطر 2:إنشاء كائن من الكلاس Intent ومن ثم تحديد الـ Action عبر الثابت ACTION_VIEW (أي سنقوم بعرض بيانات فقط).
السطر3 :تحديد البيانات وهنا نقوم بتمرير البرتوكول "geo " ومن ثم نتبعه بالاحداثيات التي نريد عرضها
كما في الكود ادنا:
"geo:18.09,77,776"
السطر 4: عرض جميع برامج
الخرائط على هاتفك (هذه في حالة إذا كان هناك أكثر من برنامج خرائط واحد مثبت على
هاتفك).
السطر 5: فتح هذا
البرنامج وعرض الخريطة على حسب الاحداثيات التي قمنا بتمريرها.
5.5:فتح برنامج المتصل بواسطة الـ Implicit Intent
سنقوم الان بفتح برنامج المتصل ونقوم بكتابة كود دالة حدث الضغط على الزر MakeCall كما في الكود ادناه:
1 2 3 4 5 6 | public void makeCall(View v ){ Intent i = new Intent(Intent.ACTION_DIAL); i.setData(Uri.parse("tel:223432144")); Intent intent=Intent.createChooser(i,"make call with"); startActivity(intent); } |
السطر 2:إنشاء كائن
من الكلاس Intent
ومن ثم تحديد الـ Action عبر الثابت ACTION_VIEW (أي سنقوم بعرض بيانات فقط).
السطر3 :تحديد البيانات وهنا نقوم بتمرير البرتوكول "tel: " ومن ثم نتبعه برقم الهاتف التي نريد الاتصال
به كما في الكود ادنا:
السطر 4: عرض جميع
البرامج التي بإمكانها على هاتفك (هذه في حالة إذا كان هناك أكثر من برنامج متصل
واحد مثبت على هاتفك).
السطر 5: فتح هذا
البرنامج وتمرير رقم الهاتف للاتصال به. وهنا وصلنا لنهاية شرح مفهوم الـ Intent ولمزيد من التفاصيل قم بزيارة هذا Intent. ورأيك يهمني بالتعليقات.
الكود الكامل للدرس:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 | package com.blogspot.muteealjabri.intentexamples; import android.net.Uri; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.content.Intent; import android.view.View; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } /** * Start New Activity Using Explicit Intent * @param v */ public void openNewActivity(View v){ Intent i = new Intent(MainActivity.this,ActivityB.class); startActivity(i); } /** * Send Email Using Implicit * @param v */ public void sendEmail(View v){ Intent i = new Intent(Intent.ACTION_SEND); i.setData(Uri.parse("mailto:")); String [] to={"xxxxxxxx@gmail.com","xxxxxx@gmail.com"}; i.putExtra(Intent.EXTRA_EMAIL,to); i.putExtra(Intent.EXTRA_SUBJECT,"This is subject"); i.putExtra(Intent.EXTRA_TEXT,"This is my mmessage body"); i.setType("message/rfc822"); Intent choose = Intent.createChooser(i,"send Email"); startActivity(choose); } /** * SEND SMS using Implicit Intent * * @param v */ public void sendSMS(View v){ //Uri uri = Uri.parse("smsto:12346556"); Intent it = new Intent(Intent.ACTION_SENDTO); it.setData(Uri.parse("smsto:12346556")); it.putExtra("sms_body", "Here you can set the SMS text to be sent"); Intent intent=Intent.createChooser(it,"Send Sms USING"); startActivity(intent); } /** * Open Google Map Using Implicit Intent * @param v */ public void openGoogleMap(View v){ Intent i = new Intent(android.content.Intent.ACTION_VIEW); i.setData(Uri.parse("geo:18.09,77,776")); Intent choose = Intent.createChooser(i,"open Map"); startActivity(choose); } /** * Mke Call Using Implicit Intent * @param v */ public void makeCall(View v ){ Intent i = new Intent(Intent.ACTION_DIAL); i.setData(Uri.parse("tel:223432144")); Intent intent=Intent.createChooser(i,"make call with"); startActivity(intent); } } |