สร้างการ์ดการตั้งค่าด่วนที่กำหนดเองสำหรับแอป

การตั้งค่าด่วนคือการ์ดที่แสดงในแผงการตั้งค่าด่วน แสดงการกระทำ ซึ่งผู้ใช้แตะเพื่อทำงานที่เกิดซ้ำให้เสร็จได้อย่างรวดเร็ว แอปของคุณสามารถจัดเตรียมการ์ดที่กำหนดเองให้กับผู้ใช้ผ่านทางTileService และใช้ออบเจ็กต์ Tile เพื่อติดตามสถานะของการ์ด ตัวอย่างเช่น คุณสามารถสร้างการ์ดที่ให้ผู้ใช้เปิดใช้ VPN ที่แอปของคุณมีให้ หรือ ปิดอยู่

แผงการตั้งค่าด่วนที่เปิดการ์ด VPN อยู่
  เปิดและปิด
รูปที่ 1 แผงการตั้งค่าด่วนที่เปิดและปิดการ์ด VPN

เลือกว่าจะสร้างการ์ดเมื่อใด

เราขอแนะนำให้สร้างการ์ดสำหรับฟังก์ชันการทำงานเฉพาะที่คุณคาดว่าผู้ใช้ เพื่อเข้าถึงบ่อยครั้งหรือต้องการการเข้าถึงอย่างรวดเร็ว (หรือทั้งสองแบบ) มีประสิทธิภาพมากที่สุด ไทล์จะเป็นรายการที่ตรงกับทั้ง 2 คุณภาพเหล่านี้ ซึ่งทำให้เข้าถึง การดำเนินการที่กระทำบ่อย

ตัวอย่างเช่น คุณอาจสร้างไทล์สำหรับแอปฟิตเนสที่ช่วยให้ผู้ใช้ เริ่มเซสชันการออกกำลังกายอย่างรวดเร็ว อย่างไรก็ตาม เราไม่แนะนําให้สร้างการ์ด สำหรับแอปเดียวกันที่อนุญาตให้ผู้ใช้ดูประวัติการออกกำลังกายทั้งหมด

กรณีการใช้งานการ์ดแอปฟิตเนส
รูปที่ 2 ตัวอย่างการ์ดที่แนะนำและไม่แนะนำสำหรับแอปฟิตเนส

เราขอแนะนำให้หลีกเลี่ยงแนวทางปฏิบัติบางอย่างต่อไปนี้เพื่อช่วยปรับปรุงการค้นพบและความสะดวกในการใช้งานการ์ด

  • หลีกเลี่ยงการใช้การ์ดเพื่อเปิดแอป ใช้ทางลัดของแอปหรือมาตรฐาน Launcher แทน

  • หลีกเลี่ยงการใช้การ์ดสําหรับการดําเนินการของผู้ใช้แบบครั้งเดียว ใช้ทางลัดของแอปหรือ notification แทน

  • หลีกเลี่ยงการสร้างการ์ดมากเกินไป เราขอแนะนำให้ใช้ไม่เกิน 2 รายการต่อแอป และใช้ทางลัดของแอปแทน

  • หลีกเลี่ยงการใช้การ์ดที่แสดงข้อมูลแต่ผู้ใช้ไม่สามารถโต้ตอบได้ โปรดใช้การแจ้งเตือนหรือวิดเจ็ตแทน

สร้างการ์ด

หากต้องการสร้างการ์ด คุณต้องสร้างไอคอนการ์ดที่เหมาะสมก่อน จากนั้นสร้างและประกาศ TileService ในไฟล์ Manifest ของแอป

ตัวอย่างการตั้งค่าด่วนแสดงตัวอย่างวิธีสร้างและจัดการการ์ด

สร้างไอคอนที่กำหนดเอง

คุณจะต้องมีไอคอนที่กำหนดเอง ซึ่งจะแสดงบนการ์ดใน แผงการตั้งค่า (คุณจะต้องเพิ่มไอคอนนี้เมื่อประกาศ TileService ดังที่อธิบายไว้ในส่วนถัดไป) ไอคอนต้องเป็นสีขาวล้วนที่มีพื้นหลังโปร่งใส ขนาด 24 x 24dp และอยู่ในรูปแบบ VectorDrawable

ตัวอย่าง Vector Drawable
รูปที่ 3 ตัวอย่าง Vector Drawable

สร้างไอคอนที่บอกใบ้ไปยังวัตถุประสงค์ของการ์ดของคุณ วิธีนี้ช่วยให้ผู้ใช้ระบุได้อย่างง่ายดายว่าการ์ดของคุณเหมาะกับความต้องการของตนหรือไม่ ตัวอย่างเช่น คุณอาจสร้าง ไอคอนนาฬิกาจับเวลา โดยมีการ์ดแอปฟิตเนสที่อนุญาตให้ผู้ใช้เริ่ม เซสชันการออกกำลังกาย

สร้างและประกาศ 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 เป็นบริการที่มีผลผูกพัน TileService จะได้รับการเชื่อมโยงเมื่อแอปของคุณขอหรือเมื่อระบบต้องสื่อสารกับ TileService วงจรชีวิตของบริการที่เชื่อมโยงโดยทั่วไปจะมีเมธอดการเรียกกลับ 4 รายการ ได้แก่ onCreate(), onBind(), onUnbind() และ onDestroy() ระบบจะเรียกใช้เมธอดเหล่านี้ทุกครั้งที่มีการเรียก เข้าสู่ช่วงวงจรใหม่

ภาพรวมวงจรการใช้งาน TileService

นอกเหนือจากการเรียกกลับที่ควบคุมวงจรบริการที่เชื่อมโยงแล้ว คุณต้องติดตั้งใช้งานเมธอดอื่นๆ สำหรับวงจร TileService โดยเฉพาะ วิธีการเหล่านี้อาจเรียกใช้นอก onCreate() และ onDestroy() เนื่องจากมีการเรียกใช้เมธอดวงจรชีวิตของ Service และเมธอดวงจรชีวิตของ TileService ใน 2 เทรดที่ไม่สอดคล้องกัน

วงจรการใช้งาน 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 จะสว่างขึ้นเรื่อยๆ โทนสีที่ตรงกัน ขึ้นอยู่กับผู้ผลิตและเวอร์ชัน

ปรับไทล์ VPN ให้แสดงสถานะของออบเจ็กต์
รูปที่ 4 ตัวอย่างไทล์ที่มีการปรับสีให้สอดคล้องกับสถานะของไทล์ (สถานะใช้งานอยู่ ไม่ได้ใช้งาน และใช้งานไม่ได้ ตามลำดับ)

อัปเดตหน้าต่าง

คุณจะอัปเดตการ์ดได้เมื่อได้รับการติดต่อกลับไปยัง 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 ที่คุณส่งผ่านไปยังเมธอดนี้

แจ้งให้ผู้ใช้เพิ่มการ์ด

หากต้องการเพิ่มการ์ดด้วยตนเอง ผู้ใช้ต้องทำตามขั้นตอนต่อไปนี้

  1. ปัดลงเพื่อเปิดแผงการตั้งค่าด่วน
  2. แตะปุ่มแก้ไข
  3. เลื่อนดูการ์ดทั้งหมดในอุปกรณ์จนกว่าจะเจอการ์ดของคุณ
  4. กดการ์ดค้างไว้แล้วลากไปยังรายการที่ใช้งานอยู่

ผู้ใช้ยังสามารถย้ายหรือนำการ์ดของคุณออกได้ทุกเมื่อ

ตั้งแต่ Android 13 เป็นต้นไป คุณจะใช้เมธอด requestAddTileService() ได้เพื่อช่วยให้ผู้ใช้เพิ่มการ์ดลงในอุปกรณ์ได้ง่ายขึ้นมาก วิธีนี้ จะแสดงข้อความให้ผู้ใช้เห็นเพื่อขอให้เพิ่มการ์ดของคุณลงใน "Quick" โดยตรง แผงการตั้งค่า โดยพรอมต์จะมีชื่อแอปพลิเคชัน ป้ายกำกับที่ระบุ และไอคอน

ข้อความแจ้ง API ตำแหน่งโฆษณาของการตั้งค่าด่วน
รูปที่ 5 ข้อความแจ้ง API ตำแหน่งโฆษณาของการตั้งค่าด่วน
public void requestAddTileService (
  ComponentName tileServiceComponentName,
  CharSequence tileLabel,
  Icon icon,
  Executor resultExecutor,
  Consumer<Integer> resultCallback
)

Callback มีข้อมูลว่าได้มีการเพิ่มการ์ดแล้วหรือไม่ ไม่ใช่ เพิ่ม ถ้ามีอยู่แล้ว หรือมีข้อผิดพลาดเกิดขึ้น

ใช้วิจารณญาณในการตัดสินใจว่าจะแสดงข้อความแจ้งให้ผู้ใช้ทราบเมื่อใดและบ่อยเพียงใด เราขอแนะนําให้เรียก requestAddTileService() ในบริบทเท่านั้น เช่น เมื่อผู้ใช้โต้ตอบกับฟีเจอร์ที่การ์ดของคุณอำนวยความสะดวกเป็นครั้งแรก

ระบบสามารถเลือกหยุดประมวลผลคำขอสำหรับ ComponentName หากผู้ใช้เคยปฏิเสธมาหลายครั้งแล้ว ระบบจะกำหนดผู้ใช้จาก Context ที่ใช้ดึงข้อมูลบริการนี้ ซึ่งต้องตรงกับผู้ใช้ปัจจุบัน