تنظیمات سریع، کاشیهایی هستند که در پنل تنظیمات سریع نمایش داده میشوند و نشاندهندهی اقداماتی هستند که کاربران میتوانند برای انجام سریع وظایف تکراری، روی آنها ضربه بزنند. برنامهی شما میتواند از طریق کلاس TileService یک کاشی سفارشی در اختیار کاربران قرار دهد و از یک شیء Tile برای ردیابی وضعیت کاشی استفاده کند. به عنوان مثال، میتوانید کاشیای ایجاد کنید که به کاربران امکان میدهد VPN ارائه شده توسط برنامهی شما را روشن یا خاموش کنند.

تصمیم بگیرید چه زمانی یک کاشی ایجاد کنید
ما توصیه میکنیم برای عملکردهای خاصی که انتظار دارید کاربران اغلب به آنها دسترسی داشته باشند یا نیاز به دسترسی سریع به آنها دارند (یا هر دو)، کاشیهایی ایجاد کنید. مؤثرترین کاشیها، کاشیهایی هستند که با هر دوی این ویژگیها مطابقت دارند و دسترسی سریع به اقدامات مکرر را فراهم میکنند.
برای مثال، میتوانید برای یک اپلیکیشن تناسب اندام، کاشیای ایجاد کنید که به کاربران امکان شروع سریع یک جلسه تمرین را بدهد. با این حال، توصیه نمیکنیم برای همان اپلیکیشن، کاشیای ایجاد کنید که به کاربران امکان میدهد کل سابقه تمرین خود را مرور کنند.

برای کمک به بهبود قابلیت کشف و سهولت استفاده از کاشی، توصیه میکنیم از برخی اقدامات اجتناب کنید:
از استفاده از کاشیها برای اجرای برنامهها خودداری کنید. در عوض از میانبر برنامهها یا یک لانچر استاندارد استفاده کنید.
از استفاده از کاشیها برای اقدامات یکبار مصرف کاربر خودداری کنید. به جای آن از میانبر برنامه یا اعلان استفاده کنید.
از ایجاد کاشیهای زیاد خودداری کنید. ما حداکثر دو کاشی برای هر برنامه را توصیه میکنیم. به جای آن از میانبر برنامه استفاده کنید.
از استفاده از کاشیهایی که اطلاعات را نمایش میدهند اما برای کاربران تعاملی نیستند، خودداری کنید. در عوض از یک اعلان یا ویجت استفاده کنید.
کاشی خود را ایجاد کنید
برای ایجاد یک کاشی، ابتدا باید یک آیکون کاشی مناسب ایجاد کنید، سپس TileService خود را ایجاد و در فایل مانیفست برنامه خود اعلام کنید.
نمونه تنظیمات سریع، مثالی از نحوه ایجاد و مدیریت یک کاشی ارائه میدهد.
آیکون سفارشی خود را بسازید
شما باید یک آیکون سفارشی ارائه دهید که روی کاشی در پنل تنظیمات سریع نمایش داده شود. (این آیکون را هنگام تعریف TileService که در بخش بعدی توضیح داده شده است، اضافه خواهید کرد.) آیکون باید سفید یکدست با پسزمینه شفاف، با ابعاد 24 در 24dp و به شکل VectorDrawable باشد.

آیکونی ایجاد کنید که به صورت بصری به هدف کاشی شما اشاره کند. این به کاربران کمک میکند تا به راحتی تشخیص دهند که آیا کاشی شما با نیازهای آنها مطابقت دارد یا خیر. به عنوان مثال، میتوانید آیکونی از یک کرونومتر برای کاشی یک برنامه تناسب اندام ایجاد کنید که به کاربران امکان میدهد یک جلسه تمرینی را شروع کنند.
TileService خود را ایجاد و اعلام کنید
یک سرویس برای کاشی خود ایجاد کنید که کلاس TileService را ارث بری کند.
کاتلین
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() } }
جاوا
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 خود را در فایل مانیفست برنامهتان تعریف کنید. نام و برچسب 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 یک سرویس مقید است. TileService شما زمانی مقید میشود که توسط برنامه شما درخواست شود یا سیستم نیاز به برقراری ارتباط با آن داشته باشد. یک چرخه حیات معمول سرویس مقید شامل چهار متد فراخوانی زیر است: onCreate() ، onBind() ، onUnbind() و onDestroy() . این متدها هر بار که سرویس وارد یک مرحله چرخه حیات جدید میشود، توسط سیستم فراخوانی میشوند.
مرور کلی چرخه عمر TileService
علاوه بر فراخوانیهای برگشتی که چرخه حیات bound-service را کنترل میکنند، باید متدهای دیگری مختص چرخه حیات TileService پیادهسازی کنید. این متدها ممکن است خارج از onCreate() و onDestroy() فراخوانی شوند، زیرا متدهای چرخه حیات Service و متدهای چرخه حیات TileService در دو thread ناهمزمان جداگانه فراخوانی میشوند.
چرخه حیات TileService شامل متدهای زیر است که هر بار TileService شما وارد یک مرحله جدید از چرخه حیات میشود، توسط سیستم فراخوانی میشوند:
onTileAdded(): این متد فقط زمانی فراخوانی میشود که کاربر برای اولین بار کاشی شما را اضافه کند، و اگر کاربر کاشی شما را حذف و دوباره اضافه کند. این بهترین زمان برای انجام هرگونه مقداردهی اولیه یکباره است. با این حال، این ممکن است تمام مقداردهی اولیه مورد نیاز را برآورده نکند.onStartListening()وonStopListening(): این متدها هر زمان که برنامه شما کاشی را بهروزرسانی میکند، فراخوانی میشوند و اغلب اوقات فراخوانی میشوند.TileServiceبینonStartListening()وonStopListening()محدود میماند و به برنامه شما اجازه میدهد کاشی را تغییر داده و بهروزرسانیها را اعمال کند.onTileRemoved(): این متد فقط در صورتی فراخوانی میشود که کاربر کاشی شما را حذف کند.
انتخاب حالت گوش دادن
TileService شما در حالت فعال یا غیرفعال به درخواستها گوش میدهد. توصیه میکنیم از حالت فعال استفاده کنید که باید در مانیفست برنامه آن را تعریف کنید. در غیر این صورت، TileService حالت استاندارد است و نیازی به تعریف ندارد.
فرض نکنید که TileService شما خارج از جفت متدهای onStartListening() و onStopListening() قرار خواهد گرفت.
حالت فعال (توصیه شده)
از حالت فعال برای TileService استفاده کنید که وضعیت خود را در فرآیند خودش گوش میدهد و نظارت میکند. یک TileService در حالت فعال به رویدادهای onTileAdded() ، onTileRemoved() ، tap و در صورت درخواست فرآیند برنامه وابسته است.
اگر TileService شما از طریق فرآیند خودش از بهروزرسانی وضعیت کاشیهایتان مطلع میشود، حالت فعال را توصیه میکنیم. کاشیهای فعال فشار روی سیستم را محدود میکنند زیرا لازم نیست هر بار که پنل تنظیمات سریع برای کاربر قابل مشاهده میشود، به آن متصل شوند.
متد استاتیک TileService.requestListeningState() را میتوان برای درخواست شروع حالت در حال گوش دادن و دریافت یک فراخوانی مجدد به onStartListening() فراخوانی کرد.
شما میتوانید با اضافه کردن META_DATA_ACTIVE_TILE به فایل مانیفست برنامه خود، حالت فعال (active mode) را اعلام کنید.
<service ...>
<meta-data android:name="android.service.quicksettings.ACTIVE_TILE"
android:value="true" />
...
</service>
حالت غیرفعال
حالت غیرفعال، حالت استاندارد است. یک TileService در صورتی در حالت غیرفعال قرار دارد که هر زمان که کاشی شما برای کاربر قابل مشاهده است، متصل باشد. این بدان معناست که TileService شما ممکن است در مواقعی خارج از کنترل خود ایجاد و دوباره متصل شود. همچنین ممکن است وقتی کاربر کاشی را نمیبیند، آزاد و از بین برود.
برنامه شما پس از اینکه کاربر پنل تنظیمات سریع خود را باز کرد، یک فراخوانی مجدد به onStartListening() دریافت میکند. میتوانید شیء Tile خود را هر چند بار که میخواهید بین onStartListening() و onStopListening() بهروزرسانی کنید.
نیازی به اعلام حالت غیرفعال نیست - کافیست META_DATA_ACTIVE_TILE را به فایل مانیفست برنامه خود اضافه نکنید.
نمای کلی حالتهای کاشی
بعد از اینکه کاربر کاشی شما را اضافه کرد، همیشه در یکی از حالتهای زیر وجود خواهد داشت.
STATE_ACTIVE: وضعیت روشن یا فعال را نشان میدهد. کاربر میتواند در این وضعیت با کاشی شما تعامل داشته باشد.برای مثال، برای یک کاشی برنامه تناسب اندام که به کاربران اجازه میدهد یک جلسه تمرین زمانبندیشده را آغاز کنند،
STATE_ACTIVEبه این معنی است که کاربر یک جلسه تمرین را آغاز کرده و تایمر در حال اجرا است.STATE_INACTIVE: وضعیت خاموش یا متوقفشده را نشان میدهد. کاربر میتواند در این حالت با کاشی شما تعامل داشته باشد.اگر بخواهیم دوباره از مثال کاشی برنامه تناسب اندام استفاده کنیم، یک کاشی در
STATE_INACTIVEبه این معنی است که کاربر جلسه تمرینی را شروع نکرده است، اما در صورت تمایل میتواند این کار را انجام دهد.STATE_UNAVAILABLE: نشاندهندهی وضعیتی است که موقتاً در دسترس نیست. کاربر در این وضعیت نمیتواند با کاشی شما تعامل داشته باشد.برای مثال، یک کاشی در
STATE_UNAVAILABLEبه این معنی است که آن کاشی به دلایلی در حال حاضر برای کاربر در دسترس نیست.
سیستم فقط وضعیت اولیه شیء Tile شما را تنظیم میکند. شما وضعیت شیء Tile را در طول بقیه چرخه حیات آن تنظیم میکنید.
سیستم ممکن است آیکون کاشی و پسزمینه را رنگی کند تا وضعیت شیء Tile شما را منعکس کند. اشیاء Tile که روی STATE_ACTIVE تنظیم شدهاند، تیرهترین هستند و STATE_INACTIVE و STATE_UNAVAILABLE به طور فزایندهای روشنتر میشوند. رنگ دقیق آن مختص سازنده و نسخه است.

کاشی خود را به روز کنید
شما میتوانید کاشی خود را پس از دریافت فراخوانی مجدد به onStartListening() بهروزرسانی کنید. بسته به حالت کاشی، کاشی شما میتواند حداقل یک بار تا زمان دریافت فراخوانی مجدد به onStopListening() بهروزرسانی شود.
در حالت فعال، میتوانید کاشی خود را دقیقاً یک بار قبل از دریافت فراخوانی مجدد به onStopListening() بهروزرسانی کنید. در حالت غیرفعال، میتوانید کاشی خود را هر چند بار که میخواهید بین onStartListening() و onStopListening() بهروزرسانی کنید.
شما میتوانید شیء Tile خود را با فراخوانی getQsTile() بازیابی کنید. برای بهروزرسانی فیلدهای خاص شیء Tile خود، متدهای زیر را فراخوانی کنید:
شما باید پس از تنظیم فیلدهای شیء Tile با مقادیر صحیح، updateTile() را برای بهروزرسانی کاشی خود فراخوانی کنید. این کار باعث میشود سیستم دادههای کاشی بهروزرسانیشده را تجزیه و تحلیل کرده و رابط کاربری را بهروزرسانی کند.
کاتلین
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() }
جاوا
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() را دریافت میکند، میتواند یک کادر محاورهای یا فعالیت را اجرا کند، کارهای پسزمینه را انجام دهد یا وضعیت کاشی شما را تغییر دهد.
کاتلین
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() }
جاوا
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 اضافه کنید.
با شروع از اندروید API 28، PendingIntent باید دارای Intent.FLAG_ACTIVITY_NEW_TASK باشد:
if (Build.VERSION.SDK_INT >= 28) {
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
}
شما میتوانید به طور جایگزین، پرچم را در AndroidManifest.xml در بخش Activity مربوطه اضافه کنید.
کاشی خود را به عنوان قابل تغییر علامت گذاری کنید
اگر کاشی شما عمدتاً به عنوان یک سوئیچ دو حالته عمل میکند (که رایجترین رفتار کاشیها است)، توصیه میکنیم آن را به عنوان قابل تغییر علامتگذاری کنید. این کار به ارائه اطلاعات در مورد رفتار کاشی به سیستم عامل و بهبود دسترسی کلی کمک میکند.
برای اینکه کاشی شما به عنوان قابل تغییر علامت گذاری شود، متادیتای TOGGLEABLE_TILE را روی true تنظیم کنید.
<service ...>
<meta-data android:name="android.service.quicksettings.TOGGLEABLE_TILE"
android:value="true" />
</service>
فقط اقدامات ایمن را روی دستگاههای قفلشدهی ایمن انجام دهید
ممکن است کاشی شما در بالای صفحه قفل دستگاههای قفلشده نمایش داده شود. اگر کاشی حاوی اطلاعات حساس است، مقدار isSecure() را بررسی کنید تا مشخص شود که آیا دستگاه در حالت امن است یا خیر، و TileService شما باید رفتار خود را بر این اساس تغییر دهد.
اگر اجرای عملیات کاشی در حالت قفل بیخطر است، از startActivity() برای اجرای یک فعالیت در بالای صفحه قفل استفاده کنید.
اگر عملکرد کاشی ناامن است، از unlockAndRun() برای درخواست از کاربر جهت باز کردن قفل دستگاه خود استفاده کنید. در صورت موفقیت، سیستم شیء Runnable را که به این متد ارسال میکنید، اجرا میکند.
کاشی خود را دسته بندی کنید
برای بهبود تجربه کاربری در تنظیمات سریع، میتوانید کاشی خود را دستهبندی کنید. سیستم، کاشیها را در دستههایی مانند اتصال، نمایشگر و حریم خصوصی سازماندهی میکند. سیستم از این دستهها برای مرتبسازی و گروهبندی کاشیها در حالت ویرایش تنظیمات سریع استفاده میکند که پیدا کردن و مدیریت آنها را برای کاربران آسانتر میکند.
پیادهسازی
برای مشخص کردن یک دسته برای TileService خود، یک فیلد ابرداده به تعریف سرویس در فایل AndroidManifest.xml اضافه کنید:
- در
AndroidManifest.xmlخود، درون عنصر<service>مربوط بهTileService، یک عنصر<meta-data>اضافه کنید. -
android:name: این مقدار را رویandroid.service.quicksettings.TILE_CATEGORYتنظیم کنید. -
android:value: یکی از ثابتهای دستهبندی از پیش تعریفشده، مانندandroid.service.quicksettings.CATEGORY_CONNECTIVITYیاandroid.service.quicksettings.CATEGORY_DISPLAYرا اختصاص میدهد.
همانطور که در مثال زیر نشان داده شده است:
<service
android:name=".MyConnectivityTileService"
[...]
>
<meta-data android:name="android.service.quicksettings.TILE_CATEGORY"
android:value="android.service.quicksettings.CATEGORY_CONNECTIVITY" />
</service>
این API مجموعهای از دستهبندیهای از پیش تعریفشده را برای انتخاب ارائه میدهد. این دستهبندیها به صورت ثابتهای رشتهای در کلاس TileService تعریف شدهاند.
اگر دسته بندی مشخص نشده باشد، سیستم به طور خودکار یک دسته بندی پیش فرض اختصاص می دهد:
- از برنامههای سیستمی: برای کاشیهایی که بخشی از یک برنامه سیستمی هستند.
- از برنامههایی که نصب کردهاید: برای کاشیهای برنامههای نصبشده توسط کاربر.
اگرچه دستگاههای گوگل پیکسل از دستهبندیها در تنظیمات سریع استفاده میکنند، تولیدکنندگان اصلی تجهیزات (OEM) میتوانند از این اطلاعات دستهبندی در رابط کاربری سیستم مربوطه خود استفاده کنند یا آن را نادیده بگیرند.
از کاربر بخواهید کاشی شما را اضافه کند
برای اضافه کردن دستی کاشی، کاربران باید چندین مرحله را دنبال کنند:
- برای باز کردن پنل تنظیمات سریع، انگشت خود را به پایین بکشید.
- روی دکمه ویرایش ضربه بزنید.
- در تمام کاشیهای دستگاهشان اسکرول کنید تا کاشی شما را پیدا کنند.
- کاشی خود را نگه دارید و آن را به لیست کاشیهای فعال بکشید.
کاربر همچنین میتواند کاشی شما را در هر نقطهای جابجا یا حذف کند.
از اندروید ۱۳ به بعد، میتوانید از متد requestAddTileService() برای آسانتر کردن اضافه کردن کاشی به دستگاه برای کاربران استفاده کنید. این متد از کاربران میخواهد که کاشی شما را مستقیماً به پنل تنظیمات سریع خود اضافه کنند. این درخواست شامل نام برنامه، برچسب ارائه شده و آیکون آن میشود.

public void requestAddTileService (
ComponentName tileServiceComponentName,
CharSequence tileLabel,
Icon icon,
Executor resultExecutor,
Consumer<Integer> resultCallback
)
این فراخوانی شامل اطلاعاتی در مورد اینکه آیا کاشی اضافه شده است یا خیر، اضافه نشده است، آیا از قبل وجود داشته است یا خیر، یا آیا خطایی رخ داده است یا خیر، میباشد.
هنگام تصمیمگیری در مورد زمان و تعداد دفعات درخواست از کاربران، از صلاحدید خود استفاده کنید. توصیه میکنیم requestAddTileService() فقط در متن فراخوانی کنید - مانند زمانی که کاربر برای اولین بار با ویژگیای که کاشی شما آن را تسهیل میکند، تعامل دارد.
سیستم میتواند پردازش درخواستهای مربوط به یک ComponentName مشخص را در صورتی که قبلاً به تعداد کافی توسط کاربر رد شده باشد، متوقف کند. کاربر از Context مورد استفاده برای بازیابی این سرویس تعیین میشود - باید با کاربر فعلی مطابقت داشته باشد.