การตั้งค่าด่วนคือการ์ดที่แสดงในแผงการตั้งค่าด่วน
แสดงการกระทำ ซึ่งผู้ใช้แตะเพื่อทำงานที่เกิดซ้ำให้เสร็จได้อย่างรวดเร็ว
แอปของคุณสามารถจัดเตรียมการ์ดที่กำหนดเองให้กับผู้ใช้ผ่านทางTileService
และใช้ออบเจ็กต์ Tile
เพื่อติดตามสถานะของการ์ด ตัวอย่างเช่น
คุณสามารถสร้างการ์ดที่ให้ผู้ใช้เปิดใช้ VPN ที่แอปของคุณมีให้ หรือ
ปิดอยู่
เลือกว่าจะสร้างการ์ดเมื่อใด
เราขอแนะนำให้สร้างการ์ดสำหรับฟังก์ชันการทำงานเฉพาะที่คุณคาดว่าผู้ใช้ เพื่อเข้าถึงบ่อยครั้งหรือต้องการการเข้าถึงอย่างรวดเร็ว (หรือทั้งสองแบบ) มีประสิทธิภาพมากที่สุด ไทล์จะเป็นรายการที่ตรงกับทั้ง 2 คุณภาพเหล่านี้ ซึ่งทำให้เข้าถึง การดำเนินการที่กระทำบ่อย
ตัวอย่างเช่น คุณอาจสร้างไทล์สำหรับแอปฟิตเนสที่ช่วยให้ผู้ใช้ เริ่มเซสชันการออกกำลังกายอย่างรวดเร็ว อย่างไรก็ตาม เราไม่แนะนําให้สร้างการ์ด สำหรับแอปเดียวกันที่อนุญาตให้ผู้ใช้ดูประวัติการออกกำลังกายทั้งหมด
หากต้องการช่วยปรับปรุงการค้นพบและความสะดวกในการใช้งานของการ์ดของคุณ เราขอแนะนำให้ การหลีกเลี่ยงการปฏิบัติบางอย่าง:
หลีกเลี่ยงการใช้การ์ดเพื่อเปิดแอป ใช้ทางลัดของแอปหรือมาตรฐาน Launcher แทน
หลีกเลี่ยงการใช้การ์ดสำหรับการดำเนินการของผู้ใช้แบบครั้งเดียว ใช้ทางลัดของแอปหรือ notification แทน
หลีกเลี่ยงการสร้างการ์ดจำนวนมากเกินไป โดยเราแนะนำให้มีได้สูงสุด 2 แอปต่อแอป ใช้ ทางลัดของแอปแทน
หลีกเลี่ยงการใช้การ์ดที่แสดงข้อมูลแต่ไม่มีการโต้ตอบสำหรับ ผู้ใช้ โปรดใช้การแจ้งเตือนหรือวิดเจ็ตแทน
สร้างหน้าต่าง
หากต้องการสร้างการ์ด คุณต้องสร้างไอคอนการ์ดที่เหมาะสมก่อน จากนั้น
สร้างและประกาศ TileService
ในไฟล์ Manifest ของแอป
ตัวอย่างการตั้งค่าด่วนแสดงตัวอย่างวิธีสร้าง และจัดการการ์ด
สร้างไอคอนที่กำหนดเอง
คุณจะต้องมีไอคอนที่กำหนดเอง ซึ่งจะแสดงบนการ์ดใน
แผงการตั้งค่า (คุณจะต้องเพิ่มไอคอนนี้เมื่อประกาศ TileService
ดังที่อธิบายไว้ในส่วนถัดไป) ไอคอนต้องเป็นสีขาวทึบและ
พื้นหลังโปร่งใสขนาด 24 x 24 dp และอยู่ในรูปแบบของ
VectorDrawable
สร้างไอคอนที่บอกใบ้ไปยังวัตถุประสงค์ของการ์ดของคุณ ซึ่งช่วยให้ผู้ใช้ มองเห็นได้ง่ายว่าการ์ดของคุณ เหมาะกับความต้องการของพวกเขาไหม ตัวอย่างเช่น คุณอาจสร้าง ไอคอนนาฬิกาจับเวลา โดยมีการ์ดแอปฟิตเนสที่อนุญาตให้ผู้ใช้เริ่ม เซสชันการออกกำลังกาย
สร้างและประกาศ TileService
สร้างบริการสำหรับการ์ดที่ขยายคลาส TileService
Kotlin
class MyQSTileService: TileService() { // Called when the user adds your tile. override fun onTileAdded() { super.onTileAdded() } // Called when your app can update your tile. override fun onStartListening() { super.onStartListening() } // Called when your app can no longer update your tile. override fun onStopListening() { super.onStopListening() } // Called when the user taps on your tile in an active or inactive state. override fun onClick() { super.onClick() } // Called when the user removes your tile. override fun onTileRemoved() { super.onTileRemoved() } }
Java
public class MyQSTileService extends TileService { // Called when the user adds your tile. @Override public void onTileAdded() { super.onTileAdded(); } // Called when your app can update your tile. @Override public void onStartListening() { super.onStartListening(); } // Called when your app can no longer update your tile. @Override public void onStopListening() { super.onStopListening(); } // Called when the user taps on your tile in an active or inactive state. @Override public void onClick() { super.onClick(); } // Called when the user removes your tile. @Override public void onTileRemoved() { super.onTileRemoved(); } }
ประกาศ TileService
ในไฟล์ Manifest ของแอป เพิ่มชื่อและป้ายกำกับ
ของ TileService
ซึ่งเป็นไอคอนที่กำหนดเองที่คุณสร้างขึ้นในส่วนก่อนหน้านี้
และสิทธิ์ที่เหมาะสม
<service
android:name=".MyQSTileService"
android:exported="true"
android:label="@string/my_default_tile_label" // 18-character limit.
android:icon="@drawable/my_default_icon_label"
android:permission="android.permission.BIND_QUICK_SETTINGS_TILE">
<intent-filter>
<action android:name="android.service.quicksettings.action.QS_TILE" />
</intent-filter>
</service>
จัดการ TileService ของคุณ
เมื่อสร้างและประกาศ TileService
ในไฟล์ Manifest ของแอปแล้ว คุณจะ
ที่ต้องจัดการรัฐของตน
TileService
เป็นบริการที่มีผลผูกพัน TileService
ของคุณจะผูกพันเมื่อ
ที่แอปของคุณขอ หรือว่าระบบจำเป็นต้องสื่อสารกับแอปหรือไม่ ทั่วไป
อายุการใช้งานของ bound-service มีวิธี Callback 4 วิธีดังนี้
onCreate()
, onBind()
, onUnbind()
และ
onDestroy()
ระบบจะเรียกใช้เมธอดเหล่านี้ทุกครั้งที่มีการเรียก
เข้าสู่ช่วงวงจรใหม่
ภาพรวมวงจรการใช้งาน TileService
นอกจาก Callback ที่ควบคุมวงจรของบริการที่ผูกไว้ คุณต้อง
ใช้วิธีการอื่นๆ ที่เฉพาะเจาะจงกับวงจรของ TileService
วิธีการเหล่านี้
อาจถูกเรียกภายนอก onCreate()
และ onDestroy()
เนื่องจาก Service
มีการเรียกเมธอดวงจรและเมธอดวงจร TileService
ในสองฟังก์ชัน
แยกชุดข้อความอะซิงโครนัส
วงจรการใช้งาน TileService
มีเมธอดต่อไปนี้ซึ่งมีการเรียกใช้
ทุกครั้งที่ TileService
เข้าสู่ช่วงวงจรใหม่:
onTileAdded()
: ระบบจะเรียกใช้เมธอดนี้เฉพาะเมื่อผู้ใช้เพิ่ม ไทล์เป็นครั้งแรก และหากผู้ใช้นำการ์ดออกและเพิ่มการ์ดอีกครั้ง นี่คือช่วงเวลาที่ดีที่สุดในการเริ่มต้นแบบครั้งเดียว อย่างไรก็ตาม อาจมี ไม่ตรงตามการเริ่มต้นที่จำเป็นonStartListening()
และonStopListening()
: วิธีการเหล่านี้ ทุกครั้งที่แอปของคุณอัปเดตการ์ด และมีการเรียกใช้บ่อยTileService
ยังคงเชื่อมโยงระหว่างonStartListening()
ถึงonStopListening()
เพื่อให้แอปแก้ไขการ์ดและการอัปเดตพุชได้onTileRemoved()
: ระบบจะเรียกวิธีการนี้ก็ต่อเมื่อผู้ใช้นำ ไทล์
เลือกโหมดการฟัง
TileService
จะฟังในโหมดแอ็กทีฟหรือโหมดไม่ได้ใช้งาน คำแนะนำจากเรา
ใช้โหมดทำงาน ซึ่งคุณจะต้องประกาศในไฟล์ Manifest ของแอป หรือไม่เช่นนั้น
TileService
เป็นโหมดมาตรฐานและไม่จำเป็นต้องประกาศ
อย่าคิดเอาเองว่า TileService
จะเผยแพร่นอก onStartListening()
และ
onStopListening()
คู่ของเมธอด
โหมดแอ็กทีฟ (แนะนำ)
ใช้โหมดแอ็กทีฟสำหรับ TileService
ที่ฟังและตรวจสอบสถานะใน
กระบวนการของตนเอง TileService
ในโหมดทำงานจะผูกกับ onTileAdded()
onTileRemoved()
แตะกิจกรรม และเมื่อได้รับการร้องขอจากกระบวนการของแอป
ขอแนะนำให้ใช้โหมดแอ็กทีฟหาก TileService
ได้รับการแจ้งเตือนเมื่อการ์ดของคุณอยู่ในสถานะ
ควรได้รับการอัปเดตด้วยขั้นตอนของตนเอง ชิ้นส่วนที่ใช้งานอยู่จะจำกัดความเครียดของ
เพราะไม่จำเป็นต้องผูกทุกครั้งที่แผงการตั้งค่าด่วน
จะแสดงต่อผู้ใช้
สามารถเรียกเมธอด TileService.requestListeningState()
แบบคงที่ไปยัง
ขอการเริ่มต้นสถานะการฟังและได้รับการติดต่อกลับไปยัง
onStartListening()
คุณประกาศโหมดทำงานได้โดยการเพิ่ม META_DATA_ACTIVE_TILE
ลงใน
ไฟล์ Manifest ของแอป
<service ...>
<meta-data android:name="android.service.quicksettings.ACTIVE_TILE"
android:value="true" />
...
</service>
โหมดไม่ทำงาน
โหมดที่ไม่ได้ใช้งานคือโหมดมาตรฐาน TileService
จะอยู่ในโหมดไม่ทำงานหาก
ซึ่งจะเชื่อมโยงทุกครั้งที่ผู้ใช้มองเห็นการ์ดของคุณ ซึ่งหมายความว่า
ระบบอาจสร้างและเชื่อมโยง TileService
อีกครั้งนอกเหนือจากการควบคุม ทั้งนี้
ยังอาจถูกยกเลิกการเชื่อมโยงและถูกทำลายเมื่อผู้ใช้ไม่ได้กำลังดูการ์ดอยู่
แอปของคุณจะได้รับการติดต่อกลับไปยัง onStartListening()
หลังจากที่ผู้ใช้เปิดแอป
แผงการตั้งค่าด่วน คุณจะอัปเดตออบเจ็กต์ Tile
กี่ครั้งก็ได้
ต้องการระหว่าง onStartListening()
ถึง onStopListening()
คุณไม่จำเป็นต้องประกาศโหมดที่ไม่ทำงาน เพียงแค่ไม่ต้องเพิ่ม
META_DATA_ACTIVE_TILE
ลงในไฟล์ Manifest ของแอป
ภาพรวมสถานะของตัวต่อเรียง
หลังจากที่ผู้ใช้เพิ่มการ์ดของคุณแล้ว การ์ดนั้นจะมีสถานะอย่างใดอย่างหนึ่งต่อไปนี้เสมอ
STATE_ACTIVE
: ระบุสถานะเปิดหรือเปิดใช้ ผู้ใช้สามารถ โต้ตอบกับการ์ดของคุณขณะอยู่ในสถานะนี้เช่น การ์ดแอปฟิตเนสที่ให้ผู้ใช้เริ่มออกกำลังกายตามกำหนดเวลา เซสชัน
STATE_ACTIVE
จะหมายความว่าผู้ใช้ได้เริ่มออกกำลังกาย เซสชัน และตัวจับเวลากำลังทำงานSTATE_INACTIVE
: หมายถึงสถานะปิดหรือหยุดชั่วคราว ผู้ใช้สามารถ โต้ตอบกับการ์ดของคุณขณะอยู่ในสถานะนี้หากต้องการใช้ตัวอย่างการ์ดแอปฟิตเนสอีกครั้ง การ์ดใน
STATE_INACTIVE
จะ หมายความว่าผู้ใช้ยังไม่ได้เริ่มเซสชันการออกกำลังกาย แต่สามารถทำได้หาก ที่ต้องการSTATE_UNAVAILABLE
: ระบุสถานะไม่พร้อมใช้งานชั่วคราว ผู้ใช้ไม่สามารถโต้ตอบกับการ์ดของคุณขณะอยู่ในสถานะนี้ตัวอย่างเช่น การ์ดใน
STATE_UNAVAILABLE
หมายความว่าการ์ดนั้นไม่ใช่ พร้อมใช้งานสำหรับผู้ใช้ด้วยเหตุผลบางอย่าง
ระบบจะกำหนดสถานะเริ่มต้นของออบเจ็กต์ Tile
เท่านั้น คุณตั้งค่า Tile
สถานะของออบเจ็กต์ตลอดช่วงที่เหลือของวงจร
ระบบอาจแต้มสีไอคอนการ์ดและพื้นหลังเพื่อแสดงถึงสถานะของคุณ
ออบเจ็กต์ Tile
รายการ วัตถุ Tile
รายการที่ตั้งค่าเป็น STATE_ACTIVE
เป็นวัตถุที่มืดที่สุด โดยมี
STATE_INACTIVE
และ STATE_UNAVAILABLE
เบาลงเรื่อยๆ โทนสีที่ตรงกัน
ขึ้นอยู่กับผู้ผลิตและเวอร์ชัน
อัปเดตหน้าต่าง
คุณจะอัปเดตการ์ดได้เมื่อได้รับการติดต่อกลับไปยัง onStartListening()
คุณสามารถอัปเดตการ์ดของคุณได้อย่างน้อย 1 ครั้ง โดยขึ้นอยู่กับโหมดของการ์ดจนกว่าการ์ดนั้นๆ
ได้รับการติดต่อกลับไปยัง onStopListening()
ในโหมดทำงาน คุณจะอัปเดตการ์ดได้ 1 ครั้งก่อนที่จะได้รับ
โทรกลับไปยัง onStopListening()
ในโหมดที่ไม่มีการใช้งาน คุณจะอัปเดตการ์ดเป็น
หลายครั้งที่คุณต้องการระหว่าง onStartListening()
ถึง onStopListening()
คุณสามารถเรียกออบเจ็กต์ Tile
ได้โดยเรียกใช้ getQsTile()
เพื่ออัปเดต
ช่องที่เฉพาะเจาะจงของออบเจ็กต์ Tile
ของคุณ ให้เรียกใช้เมธอดต่อไปนี้
คุณต้องเรียกใช้ updateTile()
เพื่ออัปเดตการ์ดเมื่อตั้งค่าเสร็จแล้ว
ของออบเจ็กต์ Tile
เป็นค่าที่ถูกต้อง การดำเนินการนี้จะทำให้ระบบ
แยกวิเคราะห์ข้อมูลการ์ดที่อัปเดตแล้วและอัปเดต UI
Kotlin
data class StateModel(val enabled: Boolean, val label: String, val icon: Icon) override fun onStartListening() { super.onStartListening() val state = getStateFromService() qsTile.label = state.label qsTile.contentDescription = tile.label qsTile.state = if (state.enabled) Tile.STATE_ACTIVE else Tile.STATE_INACTIVE qsTile.icon = state.icon qsTile.updateTile() }
Java
public class StateModel { final boolean enabled; final String label; final Icon icon; public StateModel(boolean e, String l, Icon i) { enabled = e; label = l; icon = i; } } @Override public void onStartListening() { super.onStartListening(); StateModel state = getStateFromService(); Tile tile = getQsTile(); tile.setLabel(state.label); tile.setContentDescription(state.label); tile.setState(state.enabled ? Tile.STATE_ACTIVE : Tile.STATE_INACTIVE); tile.setIcon(state.icon); tile.updateTile(); }
แฮนเดิลการแตะ
ผู้ใช้จะแตะการ์ดเพื่อทริกเกอร์การดำเนินการได้หากการ์ดของคุณอยู่ใน
STATE_ACTIVE
หรือ STATE_INACTIVE
จากนั้นจะเรียกการเรียก
onClick()
ติดต่อกลับ
เมื่อแอปได้รับการติดต่อกลับจาก onClick()
แอปจะเปิดกล่องโต้ตอบหรือ
กิจกรรม ทริกเกอร์การทำงานในเบื้องหลัง หรือเปลี่ยนสถานะของการ์ด
Kotlin
var clicks = 0 override fun onClick() { super.onClick() counter++ qsTile.state = if (counter % 2 == 0) Tile.STATE_ACTIVE else Tile.STATE_INACTIVE qsTile.label = "Clicked $counter times" qsTile.contentDescription = qsTile.label qsTile.updateTile() }
Java
int clicks = 0; @Override public void onClick() { super.onClick(); counter++; Tile tile = getQsTile(); tile.setState((counter % 2 == 0) ? Tile.STATE_ACTIVE : Tile.STATE_INACTIVE); tile.setLabel("Clicked " + counter + " times"); tile.setContentDescription(tile.getLabel()); tile.updateTile(); }
เปิดกล่องโต้ตอบ
showDialog()
ยุบแผงการตั้งค่าด่วนและแสดงกล่องโต้ตอบ
ใช้กล่องโต้ตอบเพื่อเพิ่มบริบทในการดำเนินการหากจำเป็นต้องมีข้อมูลเพิ่มเติม
หรือความยินยอมของผู้ใช้
เปิดกิจกรรม
startActivityAndCollapse()
เริ่มกิจกรรมขณะยุบ
แผง กิจกรรมจะเป็นประโยชน์หากมีข้อมูลโดยละเอียดเพิ่มเติม
ภายในกล่องโต้ตอบ หรือถ้าการทำงานของคุณเป็นแบบอินเทอร์แอกทีฟสูง
หากแอปของคุณต้องโต้ตอบกับผู้ใช้อย่างมาก แอปควรเปิด กิจกรรมเท่านั้นเป็นทางเลือกสุดท้าย ให้ลองใช้กล่องโต้ตอบหรือปุ่มสลับแทน
การแตะค้างที่การ์ดจะแสดงหน้าจอข้อมูลแอปแก่ผู้ใช้ วิธีลบล้าง
พฤติกรรมนี้และเปิดกิจกรรมสำหรับการตั้งค่ากำหนด
<intent-filter>
ไปยังหนึ่งในกิจกรรมของคุณกับ
ACTION_QS_TILE_PREFERENCES
สำหรับ Android API 28 เป็นต้นไป PendingIntent
ต้อง
มี Intent.FLAG_ACTIVITY_NEW_TASK
:
if (Build.VERSION.SDK_INT >= 28) {
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
}
นอกจากนี้ คุณยังสามารถเพิ่ม Flag ใน AndroidManifest.xml
ใน
Activity
ทำเครื่องหมายการ์ดของคุณว่าเปิด/ปิดได้
เราขอแนะนำให้ทำเครื่องหมายการ์ดของคุณว่าเปิด/ปิดได้ หากการ์ดนั้นทำหน้าที่เป็น สวิตช์ 2 สถานะ (ซึ่งเป็นการทำงานที่พบบ่อยที่สุดของการ์ด) วิธีนี้ช่วย ให้ข้อมูลเกี่ยวกับลักษณะการทำงานของไทล์กับระบบปฏิบัติการ และ เพื่อปรับปรุงการช่วยเหลือพิเศษโดยรวม
ตั้งค่าข้อมูลเมตาของ TOGGLEABLE_TILE
เป็น true
เพื่อทำเครื่องหมายการ์ดของคุณว่าเปิด/ปิดได้
<service ...>
<meta-data android:name="android.service.quicksettings.TOGGLEABLE_TILE"
android:value="true" />
</service>
ดำเนินการที่ปลอดภัยในอุปกรณ์ที่ล็อกอย่างปลอดภัยเท่านั้น
การ์ดอาจแสดงที่ด้านบนของหน้าจอล็อกในอุปกรณ์ที่ล็อกอยู่ หากการ์ด
มีข้อมูลที่ละเอียดอ่อน โปรดตรวจสอบค่าของ isSecure()
เพื่อ
ระบุว่าอุปกรณ์อยู่ในสถานะปลอดภัยหรือไม่ และ TileService
ของคุณควร
เปลี่ยนลักษณะการทำงานตามนั้น
หากการ์ดดำเนินการได้อย่างปลอดภัยขณะล็อกอยู่ ให้ใช้ startActivity()
เพื่อเปิดกิจกรรมที่ด้านบนของหน้าจอล็อก
หากการดำเนินการของการ์ดไม่ปลอดภัย ให้ใช้ unlockAndRun()
เพื่อแจ้งให้ผู้ใช้
ปลดล็อกอุปกรณ์ของตน หากสำเร็จ ระบบจะประมวลผล
Runnable
ที่คุณส่งไปยังออบเจ็กต์นี้
แจ้งให้ผู้ใช้เพิ่มการ์ดของคุณ
หากต้องการเพิ่มการ์ดด้วยตนเอง ผู้ใช้ต้องทำตามขั้นตอนต่อไปนี้
- ปัดลงเพื่อเปิดแผงการตั้งค่าด่วน
- แตะปุ่มแก้ไข
- เลื่อนดูการ์ดทั้งหมดในอุปกรณ์จนกว่าจะเจอการ์ดของคุณ
- กดการ์ดค้างไว้แล้วลากไปยังรายการที่ใช้งานอยู่
ผู้ใช้ยังสามารถย้ายหรือนำการ์ดของคุณออกได้ทุกเมื่อ
ตั้งแต่ Android 13 เป็นต้นไป คุณจะใช้เมธอด requestAddTileService()
ได้
เพื่อให้ผู้ใช้เพิ่มการ์ดของคุณลงในอุปกรณ์ได้ง่ายขึ้น วิธีนี้
จะแสดงข้อความให้ผู้ใช้เห็นเพื่อขอให้เพิ่มการ์ดของคุณลงใน "Quick" โดยตรง
แผงการตั้งค่า ข้อความแจ้งจะมีชื่อแอปพลิเคชัน ป้ายกำกับที่ระบุ
และไอคอน
public void requestAddTileService (
ComponentName tileServiceComponentName,
CharSequence tileLabel,
Icon icon,
Executor resultExecutor,
Consumer<Integer> resultCallback
)
Callback มีข้อมูลว่าได้มีการเพิ่มการ์ดแล้วหรือไม่ ไม่ใช่ เพิ่ม ถ้ามีอยู่แล้ว หรือมีข้อผิดพลาดเกิดขึ้น
ใช้การพิจารณาตามที่เห็นสมควรเมื่อตัดสินใจว่าจะแสดงข้อความแจ้งให้ผู้ใช้บ่อยเพียงใดและเมื่อไหร่ พ
แนะนำให้เรียกใช้ requestAddTileService()
เฉพาะในบริบท เช่น
เมื่อผู้ใช้โต้ตอบกับฟีเจอร์ที่ไทล์ช่วยอำนวยความสะดวกเป็นครั้งแรก
ระบบสามารถเลือกหยุดประมวลผลคำขอสำหรับ
ComponentName
หากผู้ใช้เคยปฏิเสธมาหลายครั้งแล้ว
ผู้ใช้พิจารณาจาก Context
ที่ใช้ในการเรียกข้อมูลนี้
บริการ—ต้องตรงกับผู้ใช้ปัจจุบัน