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