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

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

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

เลือกเวลาที่จะสร้างไทล์

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

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

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

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

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

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

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

ภาพรวมวงจรของ TileService

นอกเหนือจาก Callback ที่ควบคุมวงจรของบริการที่เชื่อมโยงแล้ว คุณต้อง ใช้เมธอดอื่นๆ ที่เจาะจง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);
}

หรือคุณจะเพิ่มแฟล็กในส่วน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 Settings Placement API
รูปที่ 5 ข้อความแจ้ง API ตำแหน่งการตั้งค่าด่วน
public void requestAddTileService (
  ComponentName tileServiceComponentName,
  CharSequence tileLabel,
  Icon icon,
  Executor resultExecutor,
  Consumer<Integer> resultCallback
)

โดยการเรียกกลับจะมีข้อมูลว่าเพิ่มวิดเจ็ตแล้วหรือไม่ ไม่ได้เพิ่มวิดเจ็ต หากมีวิดเจ็ตอยู่แล้ว หรือหากเกิดข้อผิดพลาด

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

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