Android Component
คือส่วนประกอบรวมกันเพื่อสร้าง Android Application มีด้วยกัน 4 ประเภทดังนี้
- Activity หรือที่เราเรียกว่า User Interface ที่ติดต่อกับผู้ใช้งาน ซึ่งในหนึ่ง Application สามารถมีได้หลาย ๆ หน้า ในแต่ละ Activity อาจประกอบไปด้วย View หรือ Controls ต่าง ๆ เช่น button, check box หรือ textbox โดยเราสามารถเปิดหน้า Activity หรือส่งข้อมูลที่จำเป็นผ่าน Intent
- Service Provider ไม่มีส่วน User Interface ที่ติดต่อกับผู้ใช้งาน แต่สามารถประมวลได้อย่าง Activity หรือประมวลผลลักษณะของ background process หรือสร้างเป็น Job schedule โดยเราสามารถ Start Service หรือส่งข้อมูลที่จำเป็นผ่าน Intent
- Broadcast receiver ไม่มีส่วน User Interface เช่นเดียวกับ Service แต่มีคุณลักษณะพิเศษที่คอยรับและตอบสนองกับเหตุการณ์ต่าง ๆ กับ ระบบ Android ได้ทันที เช่น แบตเตอรี่ใกล้หมด หรือมีข้อความเข้า เครื่องกำลัง Boots โดยทุก Application สามารถรับ Message ฺBoardcast ได้ผ่าน Intent
- Content provider คือส่วนติดต่อเกี่ยวกับฐานข้อมูลภายในเครื่อง Android เพื่อให้แอปพลิเคชันอื่นๆ ได้นำไปใช้ได้
โดยถ้าเราจะใช้ Android Component ใดจะต้องประกาศไว้ใน Android Manifest สามารถติดตามบบทความสำหรับการตรวจสอบ Android Manifest จาก
- How to access “AndroidMenifest.xml”
- How to access “AndroidMenifest.xml” via Drozer
- How to access “AndroidMenifest.xml” via APKTOOL
Intent
คือส่วนที่ช่วยให้ Android Component สามารถส่งผ่านข้อมูลระหว่างกัน ทั้ง Application เดียวกันหรือต่าง Application กันในเครื่อง Android เดียวกัน ได้ดังนี้
- Activity A เปิดใช้งานหรือส่งข้อมูลไปหา Activity B จาก Application เดียวกัน
- Activity A เปิดใช้งานหรือส่งข้อมูลไปหา Activity B จาก Application ต่างกัน
- Activity A เปิดใช้งานเชื่อมต่อหรือส่งข้อมูลไปหา Service A จาก Application ต่างกัน
- Activity A ส่งข้อมูลไปหา Receiver A จาก Application ต่างกัน
- เราจะไม่สามารถส่ง Intent ตรงไปยัง Content provider แต่สามารถทำได้ผ่าน Activity, Receiver และ Service
จากคำอธิบายข้างต้นจึงสามารถสรุปได้ว่า Intent มี 2 แบบ คือ
- Explicit Intent คือการใช้งาน Intent ที่มีการระบุ Android Component หรือ Class ปลายทางได้อย่างตรง ๆ ดังนั้นนิยมใช้งานภายใน Application เดียวกัน หรือ Application ต่างกันแต่อยู่ภายใต้บริษัทเดียวกัน แต่ก็สามารถใช้งาน Explicit Intent เพื่อเรียกข้าม Application ได้เช่นกัน
- Implicit Intent คือการใช้งาน Intent โดยไม่มีการระบุ Android Component หรือ Class ตรง ๆ แต่จะมีการตรวจสอบ parameter ที่ร้องขอและค้นหาโดย Android System ก่อนจะเรียกใช้งาน Android Component ที่ตรงกับการร้องขอ ดังนั้นจึงนิยมใช้งานต่าง Application กัน
Explicit Intent
เรียกใช้งาน
- Activity นั้น เราสามารถใช้งาน Intent จาก Activity A ไปยัง Activity B ดังนี้
Intent intent = new Intent(ActicityA.this, ActicityB.class); startActivity(intent);
- Service Provider นั้น เราสามารถใช้งาน Intent จาก Activity A ไปยัง Service B ดังนี้
Intent intent = new Intent(ActivityA.this, ServiceA.class); startService(intent);
- Broadcast receiver นั้น เราสามารถใช้งาน Intent จาก Activity A ไปยัง Receive B ดังนี้
Intent intent = new Intent(ActivityA.this, ReceiverA.class); sendBroadcast(intent);
ส่งข้อมูล
ทั้ง 3 Android Component ข้างต้นเราสามารถส่งข้อมูลระหว่างกันได้ โดยใช้คำสั่ง putExtra ซึ่งมีโครงสร้างแบบ Key และ value ดังนี้
Intent intent = new Intent(ActivityA.this, ActivityB.class); intent.putExtra("password", "p@ssw0rd"); startActivity(intent);
Implicit Intent
Function เรียกใช้งาน เพื่อส่งไปกรอง Intent โดยเครื่อง Android
- Activity นั้น เราสามารถใช้งาน Intent จาก Activity A ไปยัง Activity ของ Application อื่น ๆ ในเครื่อง Android ดังนี้
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://itselectlab.com")); startActivity(intent); //method นี้จะใช้สำหรับส่ง Intent เพื่อเปิด Activity ใหม่ หรือสั่งให้ Activity ที่เปิดอยู่แล้วทำงานบางอย่าง
- Broadcast receiver นั้น เราสามารถใช้งาน Intent จาก Activity A ไปยัง Broadcast ดังนี้
Intent intent = new Intent(); intent.setAction("com.example.SendBroadcast"); sendBroadcast(intent); //method นี้จะใช้สำหรับส่ง Intent ไปยังทุก ๆ Receiver ที่มีอยู่ในเครื่อง
- Service Provider นั้น ไม่นิยมใช้งาน Implicit Intent ส่วนมากใช้งานแบบ Explicit แต่ถ้าจะใช้งานจะทำการเรียกผ่าน Activity หรือ Receiver
Parameter ที่ต้องกำหนดเพื่อช่วยกรอง Intent ให้ตรงกับ Application ในเครื่อง Android (Intent Filter)
- Action เป็น Parameter ของ Implicit Intent ที่ทั้งโปรแกรมต้นทางเรียกใช้งาน และโปรแกรมปลายทางต้องกำหนดไว้ อย่างน้อย 1 action เพื่อที่จะเรียกใช้งานหรือส่งข้อมูลได้อย่างได้ถูกต้อง หรือสั่งให้ทำงานตาม โดย Action สามารถรับหรือสั่งให้ทำงานได้ทั้ง Activity และ Receiver ดังตัวอย่างดังนี้
- Default Action สำหรับ Activity (โดยมากใช้งานที่โปรแกรมต้นทาง)
- ACTION_ALL_APPS แสดงรายชื่อ Application ทั้งหมดในเครื่อง
- ACTION_DATE_CHANGED เปลี่ยนวันที่
- ACTION_SEND เพื่อส่งข้อมูล
- ACTION_EDIT เพื่อใช้แก้ไขข้อมูล
- ACTION_DEFAULT หรืออีกชื่อคือ ACTION_VIEW เพื่อแสดงข้อมูล
- Default Action สำหรับ Receiver (โดยมากใช้งานที่โปรแกรมปลายทาง เพราะ System จะส่งมายัง Receiver ที่เรากำหนดไว้ที่ Android Manifest)
- ACTION_BATTERY_LOW เพื่อรับ Broadcast จากระบบ ว่าแบตเตอรี่ใกล้หมด
- ACTION_BOOT_COMPLETED เพื่อรับ Broadcast จากระบบ ว่าเครื่อง Android ได้ Boot ระบบเสร็จสิ้น
- ACTION_DEVICE_STORAGE_LOW เพื่อรับ Broadcast จากระบบ ว่าเครื่อง Android มีหน่วยความจำใกล้หมด
- Default Action สำหรับ Activity (โดยมากใช้งานที่โปรแกรมต้นทาง)
- Data เป็น Parameter ของ Implicit Intent ที่จะต้องระบุสำหรับบาง Action ข้างต้น โดยข้อมูลมีรูปแบบที่เรียกว่า URI โดยใช้ฟังก์ชัน sertData() ดังต่อไปนี้
- ACTION_VIEW tel:0886554466 แสดงเบอร์โทรตามหมายเลขที่กำหนด
- ACTION_DIAL tel:0886554466 โทรออกตามหมายเลขที่กำหนด
- Type เป็น Parameter ของ Implicit Intent ที่โปรแกรมปลายทางต้องกำหนดไว้ เพื่อบอกว่าส่งและรับข้อมูลประเภทใด โดยใช้ฟังก์ชัน setType()
- สำหรับผู้ส่ง
Intent intent = new Intent(Intent.ACTION_CALL); intent.setData(Uri.parse("tel:0886554433")); startActivity(intent);
- สำหรับผู้รับอาจกำหนดได้ดังนี้
<activity android:name=".TestActivity"> <intent-filter> <action android:name="android.intent.action.SEND"/> <category android:name="android.intent.category.DEFAULT"/> <data android:mimeType="text/plain"/> <data android:mimeType="image/*"/> </intent-filter> </activity>
- สำหรับผู้ส่ง
- Category เป็น Parameter ของ Implicit Intent หมวดหมู่ของ Component ปลายทาง
อ้างอิง
- https://developer.android.com/guide/topics/manifest/manifest-intro.html
- https://developer.android.com/guide/topics/providers/content-provider-basics.html
- https://developer.android.com/reference/android/content/Intent.html
- https://developer.android.com/guide/components/intents-filters.html#Types
- http://www.tutorialspoint.com/android/android_intents_filters.htm
- https://www.tutorialspoint.com/android/android_intent_standard_actions.htm