الخميس، 23 يونيو 2016

13-شرح مفهوم الـ Intent في الاندرويد بالتفصيل





السلام عليكم ..
بما انك مبرمج  اندرويد فإنك سنسمع كثيرا عن مايسمى بالـ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

توجد لـ Intent استخدامات عديدة ومنها مايلي:

1-يستخدم في الانتقال بين الواجهات Activities.
2-يستخدم أيضا لتشغيل الخدمات Services للقيام بإعمال في الخلفية.
3-يستخدم لاستقبال الاحداث Events ٍSystem من الـ Broadcast Receiver.
4-تحديد Launcher Activity أي تحديد الواجهة التي ستظهر ايقونتها بقائمة التطبيقات في الهاتف كمثال عندما يكون في تطبيقك اربع واجهات فإن ال intent  سيقوم بتحديد إي واجهة ستظهر أولا عند فتح التطبيق.
5-تمرير البيانات بين الواجهات ،والمكونات الاخرى للتطبيق.




3-ماهي أنواع ال Intent؟

يوجد نوعين من Intent   وهي كمايلي:

1-Explicit Intent  :

وفي هذا النوع  يتم معرفة المكون الذي سيقوم باستقبال هذا الـ Intent  كمثال: عندما يحتوي التطبيق على شاشتين ونريد الانتقال من الشاشة الاولى الى الشاشة الثانية  فإننا نقوم بإعطاء اسم  الشاشة الثانية للـ Intent  ليقوم الانتقال اليها.

2-Implicit Intent: 

وفي هذا النوع لا يتم تحديد المكون الذي سيستقبل هذا الـ Intent  كمثال عندما نريد أن نرسل ايميل باستخدام الـ Intent  فإننا سنقوم بإضافة بيانات اضافية ويقوم نظام التشغيل بتحديد المكونات التي بإمكانها استقبال هذا الـ 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-  نفتح اندرويد استديو ونقوم بإنشاء مشروع جديد نسميه  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 الذي قمنا بإنشائه.






2.5:إرسال ايميل بواسطة الـ Implicit 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);
    }
    
}

جميع الحقوق محفوضة لدى مدونة مطيع الجابري |

تصميم : مدونة علوم و تقنيات