القائمة الرئيسية

الصفحات

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



السلام عليكم .. متابعي مدونة مطيع الجابري .. شرحنا في الدرس السابق شرح مفهوم الـ intent بالتفصيل .
وفي هذا الدرس بشرح آلية عمل  Intent  Filter  وهو احد الامور المرتبطة بمفهوم الـ intent  وسنقوم في هذه الدرس  بشرح الاتي:


1-ماهو Intent Filter وف ماذا يستخدم؟
2-كيفية اضافة Intent Filter .؟
3-شرح آلية عمل الـ Intent Filter بالتفصيل .
4-امثلة تطبيقية على كيفية استخدام Intent Filter  وآلية عمله.

هنا سيكون الناتج من هذا الدرس:



1-ماهو Intent Filter؟


عندما نقوم بانشاء Implicit Intent  وتحديد مكوناته(action/data ..etc ) فانه لابد من التعامل Intent Filter  
 الذي  يقوم بتحديد  الكائن الذي بامكانه  استقبال Implicit Intent  الذ ي قمنا بانشائه .
كمثال :
-عندما نريد إرسال بريد الكتروني فإننا نقوم بإنشاء Implicit Intent  ثم يتم إرسال هذا الـ intent ثم يقوم الـ Intent Filter  باستقبال هذا الـ Intent  وتحديد الكائنات(activity/service/Broadcast Receiver) التي بامكانها استقبال هذا الـ intent  وإرسال البريد الكتروني.

وتوجد لـ intent Filter استخدمات سنذكر بعضها:-
1-تحديد الـ Intent للمكونات(activity/service/BroadcastReceiver ) .
2-تحديد الـ action  للـ intent  الخاص بهذا الكائن.
3-تحديد الـ data  للـ intent  الخاص بهذا الكائن.
4-تحديد الـ category  للـ intent  الخاص بهذا الكائن.


يمكن تلخيص فيما سبق في الاتي:
"Intent Filter  يستخدم في تحديد الـ intent  الذي بمكانها التعامل هذا المكون  (Activity/Service/BroadvastReceiver)"




2-كيفية إضافة وتحديد الـ intent Filter ؟


بعد ان عرفنا الغرض من استخدام intent filter  سنتعرف الان على كيفية اضافة intent filter.

-يتم اضافة intent filter في ملف manifest.xml  من خلال الوسم <intent-filter>.
-يتم اضافة وسوم  خصائص ومكونات الـ intent filter  بداخل الوسم <intent-filter> وهي كمايلي:

    1-الوسم <action> : لتحديد الـ action  الخاص بهذه الـ intent.
    2-الوسم <category>: لتحديد الفئة الخاصة بهذا الـ intent.

والان نقوم باضافة intent-filter  وذلك عبر الخطوات التالية:

1-نذهب إلى ملف manifest.xml.
2-نذهب إلى الوسم الخاص  بالكائن الذي نريد تحديد الـ intent filter  له كمثال:

-الوسم <activity > :وهو الوسم الخاص الواجهات.
-الوسم <service> : وهو الوسم الخاص بالخدمات.
-الوسم <receiver >: وهو الوسم الخاص بالـ BroadcastReceiver .

3-نقوم باضافة  الوسم  <intent-filter> إلى الكائن الذ ي نريد اضافة Intenbt-filter له.
4- نقوم باضافة الوسم <action> و <category> داخل الوسم <intent-filter>.
5- نستخدم  الخاصية ""=android:name  لاعطاء قيمة للـ action  والـ category  كما في الكود ادناه:


1
2
3
4
5
6
7
8
9
<activity 
        android:name="com.example.intentfilter.ActivityC"
        android:label="@string/title_activity_activity_c" >             
       <intent-filter>
              <action android:name="MyAction" />
              <category android:name="android.intent.category.DEFAULT" />
              <category android:name="MY_CATEGORY"/>
       </intent-filter>
</activity>

نلاحظ  من الكود اعلاه الاتي:
1-السطر 4:تمت إضافة Intent filter إلى activity .
2-السطر 5:تمت اضافة action  واعطائه القيمة "MyAction" .
3-السطر 6: تمت اضافة category  واعطائها القيمة android.intent.category.DEFAULT وهي فئة موجودة ضمن النظام.
4-السطر 7: اضافة category  اخرى واعطائها القيمة "MY-CATEGORY".

*ملاحظات:
1-يمكن إن يكون للمكون الواحد أكثر من intent filter .
2-كل مكون يمكن أن يحتوي على أكثر من intent Filter .
3-عند إنشاء Implicit intent يجب تعريف  action واحد على الأقل.
4-عند إضافة الفئة Deafult  إلى intent filter  هذا يعني إنه سيتم الانتقال لهذا المكون بواسطة implicit intent.

5-يفضل تسمية الـ action  أو category  بأسلوب أسماء الحزم كمثال:com.muteealjabr.TEST




3-كيف يعمل Intent Filter


يمكن اختصار شرح آلية عمل Intent Filter  في العبارة  الاتية:
"يستقبل intent  ومن ثم تحديد المكون المستقبل لهذا الـ Intent"

وتوضح الصورة ادناه آلية عمل Intent Filter  بالتفصيل:


والان نقوم بشرح آلية عمل Intent Filter   بالتفصيل كما في الصورة:
1-A:Source Compenet :الكائن المصدر : وهو المكون الذي سيتم إرسال intent  منه ولنفرض  انه activity .

2-تم إرسال intent  من الكائن A .

3-Intent Object : وهالـ intent  الذي قمنا بارساله من المكون A ويحتوي على action  و category  و data.

4- تم إرسال intent  من المكون  A إلى Intent Filter .

5- Intent Filter :يقوم intent Filter  باستقبال هذا الـ Intent  ومن ثم يقوم بمقارنة action,category , data  مع الكائن الذي سيستقبل هذا الـ intent  ففي حالة تتطابق جميع الـ action ,category , data  مع الكائن الهدف سيتم الانتقال إلى هذا الكائن.

6-Target Compenet:  وهو المكون الهدف الذي سيقوم باستقبال هذا الـ intent.



4-امثلة تطبيقية على كيفية استخدام Intent Filter  وآلية عمله.


الان سنزضح بعض الامثله حول آلية عمل Intent Filter.
1-نذهب إلى اندرويد استديو ونقوم بانشاء مشروع جديد نسميه IntentFiltrerTest.
2-نقوم باضافه 3 واجهات activities  إلى المشروع كمايلي:
-ActivityA.
-ActivityB.
-ActivityC.

3-نذهب إلى ملف activity_main.xml  ونضيف زر كما يلي:


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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"
    tools:context="com.blogspot.muteealjabri.intentfiltertest.MainActivity">

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:layout_alignParentLeft="true"
        android:text="testIntentFilter"
        android:onClick="test"
        android:layout_centerVertical="true"/>


</RelativeLayout>

ليظهر تصميم الشاشة كمايلي:



4-نذهب إلى ملف manifest.xml  ونقوم بإضافة intent-filter  إلى الواجهات activities  كمايلي:


 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
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.blogspot.muteealjabri.intentfiltertest">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name=".ActivityA" >
            <intent-filter>
                <action android:name="com.blogspot.muteealjabri.TEST" />

                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>

        </activity>

        <activity android:name=".ActivityB"
            android:label="Activity B">
            <intent-filter>
                <action android:name="com.blogspot.muteealjabri.TEST" />

                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>

        </activity>


        <activity android:name=".ActivityC">
            <intent-filter>
                <action android:name="com.blogspot.muteealjabri.TEST" />

                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>

        </activity>

    </application>

</manifest>


 نلاحظ من اكود أعلاه:
-انه تم إضافة action 
<action android:name="com.muteealjabri.TEST"/>
إلى جميع الواجهات ActivityA , ActivityB , ActivityC .

5-نذهب إلى ملف MainActivty.Java ونضيف دالة حدث الضغط على الزر testIntentFilterونكتب الكود بداخلها:


1
2
3
4
public void test(View v){
       Intent i = new Intent("com.blogspot.muteealjabri.TEST");
        startActivity(i);
    }



تأتي الان لشرح الكود:
السطر 2: إنشاء اوبجكت من الكلاس  intent   يحتوي على action  وهو  "com.blogspot.muteealjabri.TEST "
السطر 3:عرض جميع  الشاشات إلى تحتوي على action  من نوع  "com.blogspot.muteealjabri.TEST "

 ويمكن تلخيص عمل الكود أعلاه بالصورة الاتية:



1-إرسال intent   من MainActivity.
2-الـ intent الذي قمن بارساله يحتوي على  action  .
3-تتم مطابقة الـ intent المرسل مع intent Filter  للكائنات .
4-في حالة التطابق يتم عرض جميع المكونات التي بإمكانها استقبال هذا الـ intent كما في الصورة ادناه:




مثال آخر :

سنقوم الان بإضافة  category إلى intent filter الخاص بالواجهتين activityB,ActivityC كما في الكود ادناه:


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
<activity android:name=".ActivityB"
            android:label="Activity B">
            <intent-filter>
                <action android:name="com.blogspot.muteealjabri.TEST" />            
                <category android:name="android.intent.category.DEFAULT" />           
                <category android:name="com.blogspot.muteealjabri.MY_CATEGORY" />
            </intent-filter>

        </activity>


        <activity android:name=".ActivityC">
            <intent-filter>
                <action android:name="com.blogspot.muteealjabri.TEST" />            
                <category android:name="android.intent.category.DEFAULT" />           
                <category android:name="com.blogspot.muteealjabri.MY_CATEGORY" />
            </intent-filter>

</activity>


 من الكود أعلاه تمت إضافة category  لكل من ActivityB,ActivityC.
بعد ذلك نقوم بالاتي:

1-نذهب إلى ملف MainActivty.Java ونضيف دالة حدث الضغط على الزر testIntentFilterونكتب الكود بداخلها:


1
2
3
4
5
public void test(View v){
 Intent i= new Intent("com.blogspot.muteealjabri.TEST");              
        i.addCategory("com.blogspot.muteealjabri.MY_CATEGORY");
        startActivity(i);
    }

ناتي إلى شرح الكود:
السطر 2: إنشاء اوبجكت من الكلاس  intent   يحتوي على action  وهو  "com.blogspot.muteealjabri.TEST "
السطر 3: إضافة category إلى intent  وذلك باستخدام الدالة addCategory   ومن ثم تمرير الـ category  لها بصيغة نصية string.

السطر 4:عرض جميع  الشاشات إلى تحتوي على action  من نوع  "com.muteealjabri.MY_CATEGORY "
 ويمكن تلخيص عمل الكود أعلاه بالصورة الاتية:



1-إرسال intent   من MainActivity.
2-الـ intent الذي قمنا بإرساله  يحتوي على   action  و category.
3-تتم مطابقة الـ intent المرسل مع intent Filter  للكائنات .
4-في حالة التطابق يتم عرض جميع المكونات التي بإمكانها استقبال هذا الـ intent.
5-نلاحظ انه تم التطابق مع activityB و activtyC  ولم يتطابق مع Activity Aلذلك عند الضغط على الزر يتم عرض مربع حوار يحتوي على المكونات التي بإمكانها استقبال هذا الـ Intent كما في الصورة ادناه:


هنا الكود الكامل للدرس:


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
package com.blogspot.muteealjabri.intentfiltertest;

import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
   public void test(View view){

       Intent i = new Intent("com.blogspot.muteealjabri.TEST");
       i.addCategory("com.blogspot.muteealjabri.MY_CATEGORY");
       startActivity(i);
   }
}


وصلنا إلى نهاية الدرس .. يرجى الاشتراك بقناتنا على اليوتيوب. ورأيكم يهمني بالتعليقات