พื้นฐาน Android - Intents and Intent Filters (Overview)

Intent ใช้ทำอะไรได้บ้าง ?

โดยรวม Intent ใช้ในการติดต่อกันระหว่าง app component ต่างๆ
โดยพื้นฐานจะมี 3 เรื่องหลักๆคือ

-Starting an activity < ใช้บ่อยสุด
-Starting a service
-Delivering a broadcast


1.) Building an intent

Intent types
-Explicit intents
-Implicit intents

1.1) Example explicit intent (เจาะจง component )

val downloadIntent = Intent(this, DownloadService::class.java).apply {
    data = Uri.parse("http://www.example.com/image.png")
}
startService(downloadIntent)

1.2) Example implicit intent (ไม่เจาะจง component )

val sendIntent = Intent().apply {
    action = Intent.ACTION_SEND
    putExtra(Intent.EXTRA_TEXT, "text message")
    type = "text/plain"
}

if (sendIntent.resolveActivity(packageManager) != null) {
    startActivity(sendIntent)
}

1.2) Forcing an app chooser

val sendIntent = Intent(Intent.ACTION_SEND)
val title: String = resources.getString(R.string.chooser_title)
val chooser: Intent = Intent.createChooser(sendIntent, title)

if (sendIntent.resolveActivity(packageManager) != null) {
    startActivity(chooser)
}

2.) Receiving an implicit intent

Intent Filter ใช้กำหนดได้ว่า Component (Activity , BroadcastReceiver , Service) 
ต้องการรับข้อมูลที่มากับ Implicit Intent แบบไหนได้บ้าง

ตัวอย่างการใช้ intent-filter รับ ACTION_SEND intent เมื่อ data type เป็น text

<activity android:name="ShareActivity">
    <intent-filter>
        <action android:name="android.intent.action.SEND"/>
        <category android:name="android.intent.category.DEFAULT"/>
        <data android:mimeType="text/plain"/>
    </intent-filter>
</activity>

ตัวอย่างการใช้ intent-filter (social-sharing app)

// activity หลักทำงานเป็นตัวแรกที่เปิดแอพ
<activity android:name="MainActivity">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>

// ตัวอย่างการประกาศ Intent-filter 2 ตัวภายใน 1 activity
<activity android:name="ShareActivity">
    <intent-filter>
        <action android:name="android.intent.action.SEND"/>
        <category android:name="android.intent.category.DEFAULT"/>
        <data android:mimeType="text/plain"/>
    </intent-filter>

    <!-- This activity also handles "SEND" and "SEND_MULTIPLE" with media data -->
    <intent-filter>
        <action android:name="android.intent.action.SEND"/>
        <action android:name="android.intent.action.SEND_MULTIPLE"/>
        <category android:name="android.intent.category.DEFAULT"/>
        <data android:mimeType="application/vnd.google.panorama360+jpg"/>
        <data android:mimeType="image/*"/>
        <data android:mimeType="video/*"/>
    </intent-filter>
</activity>



Using a pending intent (ตัวนี้จะไม่ค่อยได้ใช้บ่อย แต่ควรรู้จักไว้คร่าวๆ)

PendingIntent จะใช้เก็บ Intent ไว้ เมื่อสั่งงานก็จะยังไม่ทำงานในทันที

ตัวอย่างเช่น :
การใช้ร่วมกับ NotificationManager โดยใช้ pending intent เก็บ Intent ไว้
เมื่อผู้ใช้ Notification Intent นั้นถึงจะทำงานอะไรบางอย่าง


ทั้งหมดที่สรุปมานี้ สามารถอ่านแบบละเอียดๆ และนำไปใช้งานจริงได้ที่ :
http://www.akexorcist.com/2017/01/android-intent-and-pending-intent.html
https://developer.android.com/guide/components/intents-filters