در عینک صوتی، سیستم ورودی فیزیکی (مانند اشارههای صفحه لمسی یا فشردن دکمه) را براساس آگاهی کاربر و نه تمرکز نمایشگر دیداری هدایت میکند. چون کاربران نمیتوانند میانای کاربر را ببینند، سیستم ورودی فیزیکی را به فعالیت پیشبینیشده هر تجربه برنامهای که کاربر حس میکند یا بهطور فعال با آن تعامل دارد هدایت میکند.
نحوه تعیین آگاهی کاربر توسط سیستم
سیستم با نظارت بر اینکه کدامیک از جریانهای داده زیر فعال هستند، آگاهی کاربر را تعیین میکند:
- جاریسازیهای خروجی صدا: خواندن صوتی، نشانههای صوتی، یا بازپخش رسانه.
- جاریسازیهای ضبط میکروفون: فرمانهای گفتاری درحال انجام یا ضبط صدا از محیط اطراف کاربر.
- جاریسازیهای ضبط دوربین: جاریسازیهای ویدیو یا عکس.
برخیاز جریانهای داده گذرا هستند و فقط برای مدت کوتاهی آگاهی کاربر را حفظ میکنند. برای مثال، خواندن صوتی پیچ بعدی که کاربر باید هنگام پیمایش مسیر بپیچد. سایر جریانهای داده نامحدود هستند و تا زمانی که ادامه داشته باشند، آگاهی کاربر را حفظ میکنند. برای مثال، بازپخش رسانه با فهرست پخش تصادفی بیپایان. وقتی یک جریان داده گذرا یک جریان داده نامحدود را قطع میکند، بهطور موقت توجه کاربر را جلب میکند.
همرسها و تمرکز ورودی
کاربران اغلب چندین تجربه برنامه را بهطور همزمان در عینک صوتی اجرا میکنند. برای مثال، کاربر ممکن است درحین دنبال کردن ناوبری گامبهگام به موسیقی گوش دهد. در این موارد، سیستم یک وضعیت همزمانی اختصاص میدهد و با انجام کارهای زیر، تمرکز ورودی را برای مطابقت با تمرکز صوتی تغییر میدهد:
- ازسر گرفتن یا متوقف کردن فعالیت پیشبینیشده برنامهتان.
- درحال مسیریابی ورودی فیزیکی به فعالیت پیشبینیشده در پیشزمینه.
این رویکرد به حفظ تجربه کاربری یکپارچه کمک میکند.
به سیستم اجازه دهید فعالیت پیشبینیشده شما را دوباره راهاندازی کند
وقتی برنامه شما آگاهی کاربر را بهدست میآورد، بهویژه اگر فعالیت پیشبینیشده آن در پسزمینه باشد، سیستم باید بتواند فعالیت را ازسر بگیرد و ورودی فیزیکی را به آن هدایت کند.
برای اطمینان از اینکه سیستم میتواند فعالیت شما را مجدداً راهاندازی کند:
ایجاد قصد معوق: یک
Intentصریح بسازید که به فعالیت پیشبینیشده هدف شما اشاره میکند. قصد را درPendingIntentقرار دهید وFLAG_UPDATE_CURRENTیاFLAG_IMMUTABLEرا تنظیم کنید تا رفتار راهاندازی ایمن و قابلپیشبینی حفظ شود:// Build an explicit Intent pointing to this projected activity and wrap it in a // PendingIntent so the system can relaunch it and route physical input to it. private val pendingIntent: PendingIntent by lazy { val intent = Intent(this, ProjectedInputFocusActivity::class.java) PendingIntent.getActivity( this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE ) }
ثبت گیرنده ورودی: نمونهای از
ProjectedActivityCompatرا دریافت کنید وPendingIntentخود را بهعنوان گیرنده ورودی تعیینشده با ارسال آن بهsetActivityAsInputReceiverثبت کنید.override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) lifecycleScope.launch { // Create or obtain the ProjectedActivityCompat instance val projectedActivity = ProjectedActivityCompat.create(this@ProjectedInputFocusActivity) // Register the PendingIntent as the designated input receiver projectedActivity.setActivityAsInputReceiver(pendingIntent) }
پاک کردن گیرنده ورودی هنگام پاکسازی: وقتی فعالیت شما ازبین میرود یا دیگر نیازی به دریافت ورودی فیزیکی ندارد، گیرنده ورودی را پاک کنید تا از ارسالهای
PendingIntentقدیمی جلوگیری شود و نشت حافظه رخ ندهد.override fun onDestroy() { super.onDestroy() lifecycleScope.launch { val projectedActivity = ProjectedActivityCompat.create(this@ProjectedInputFocusActivity) projectedActivity.clearActivityAsInputReceiver() } }
آشنایی با نحوه جابهجایی تمرکز ورودی در حالتهای همزمانی
برای تعیین اینکه کدام برنامه تمرکز ورودی را دریافت میکند، سیستم جریانهای داده فعال را ارزیابی میکند و ورودی را براساس این حالتهای همزمانی مسیریابی میکند:
| وضعیت همرسها | زمینه محیطی | رفتار سیستم و تمرکز ورودی | مثال |
|---|---|---|---|
غیرهمزمان |
فعالیت مستقل پیشبینیشدهای فعال است؛ هیچ جلسه رسانه پسزمینهای درحال اجرا نیست. |
تمرکز ورودی کاملاً به فعالیت پیشبینیشده شما هدایت میشود، حتی در دورههای سکوت بین خواندنها. |
کاربری برنامه ردیابی تمرین را اجرا میکند. حتی در لحظات سکوت، ورودیهای صفحه لمسی مستقیماً به برنامه تناسب اندام هدایت میشوند. |
نیمههمزمان |
فعالیت پیشبینیشدهای فعال است، اما جلسه رسانه پسزمینهای در وضعیت موقتاً متوقفشده وجود دارد. |
در دورههای سکوت بین خواندنهای فعال برنامه، تمرکز ورودی بهطور پیشفرض روی کنترلهای رسانه موقتاً متوقفشده قرار میگیرد. |
کاربر برنامه ردیابی تمرین را درحالیکه موسیقی موقتاً متوقف شده است اجرا میکند. بین بهروزرسانیهای مربی تناسب اندام، تکضرب روی صفحه لمسی موسیقی را ازسر میگیرد و عملکرد تمرین را فعال نمیکند. |
همزمان |
بازپخش دوگانه فعال است (برای مثال، اعلان صوتی برنامهتان موسیقی پسزمینه را قطع میکند یا صدای آن را کاهش میدهد). |
تمرکز صوتی با تمرکز ورودی برابر است. درطول خواندن فعال، تمرکز ورودی به فعالیت فرافکنیشده شما هدایت میشود و وقتی جاریسازی صوتی تمام میشود، به کنترلهای رسانه برمیگردد. |
کاربر درحال گوش دادن به موسیقی است که برنامه پیمایش دستورالعملی را میخواند. درطول خواندن، برنامه ناوبری تمرکز ورودی را دریافت میکند. پساز پایان خواندن، تمرکز ورودی به کنترلهای رسانه برمیگردد. |
محافظهای زمانبندی سیستم
سیستم پادمانهای زیر را برای کمک به جلوگیری از ورودی تصادفی یا رفتارهای غیرمنتظره برای کاربران ارائه میدهد:
- مهلت ارفاقی برای فعالیتهای فرافکنیشده تازه راهاندازیشده: برای تطبیق با بارگیری دارایی راهاندازی سرد یا تأخیرهای شبکه، فعالیتهای فرافکنیشده تازه راهاندازیشده مهلت ارفاقی کوتاهی دریافت میکنند تا جریان داده برقرار کنند و آگاهی کاربر را قبلاز اینکه سیستم فعالیت فرافکنیشده را متوقف کند و آن را به پسزمینه منتقل کند، بهدست آورند.
- تمرکز براساس آگاهی کاربر هدایت میشود: اگر آگاهی کاربر ازطریق جریان دادههای فعال و جدیدی مثل خواندن صوتی تغییر کند، سیستم فوراً فعالیت پیشبینیشده شما را ازسر میگیرد و تمرکز ورودی را به آن هدایت میکند.
- بافرهای انتقال درطول بازپخش رسانه: وقتی خواندن گذرا درطول بازپخش رسانه در پسزمینه تکمیل میشود، تمرکز ورودی برای لحظهای روی فعالیت فرافکنیشده باقی میماند. دوره میانگیر به جلوگیری از ورودیهای تصادفی کمک میکند، مثلاً وقتی کاربر میخواهد خواندن را بیصدا کند اما بهجای آن قطعه موسیقی را رد میکند. پساز میانگیر انتقال، سیستم فعالیت پیشبینیشده برنامه را متوقف میکند و تمرکز ورودی را به کنترلهای رسانه هدایت میکند.
- فعالیتهای فرافکنیشده غیرفعال متوقف یا موقتاً متوقف میشوند: سیستم هرگونه فعالیت فرافکنیشده غیرفعال را که جریان داده فعال نداشته باشد پساز چند دقیقه متوقف میکند (یا بهطور موقت برای خروجی رسانه درحال اجرا هنگام توقف موقت).
انتقال تمرکز ورودی در تمرین
برای درک نحوه انتقال تمرکز ورودی در حالتهای همزمانی، سناریوهای نمونه زیر را برای برنامه پیمایشی که راهنمایی گامبهگام ارائه میدهد درنظر بگیرید:
سناریو الف: غیرهمزمان (رسانه غیرفعال)
برای این سناریو، سیستم ورودی را به برنامه پیمایش هدایت میکند که درطول کل سفر از کاربر آگاه است.
- کاربر پیمایش را بدون پخش موسیقی پسزمینه راهاندازی میکند.
- برنامه ناوبری فعالیت پیشبینیشده خود را در عینک صوتی راهاندازی میکند.
- چون هیچ جلسه رسانهای فعال نیست، برنامه ناوبری تمرکز ورودی صفحه لمسی را درطول سفر حفظ میکند.
- کنشهای کاربر: تکضرب زدن درطول خواندن فعال میتواند راهنمایی را بیصدا کند. ضربه زدن در زمان سکوت میتواند دستورالعمل آخر را تکرار کند.
سناریو ب: نیمههمزمان (رسانه موقتاً متوقفشده)
در این سناریو، هرگاه برنامه ناوبری از کاربر آگاهی نداشته باشد، سیستم ورودی را به کنترلهای رسانه سیستم هدایت میکند.
- کاربر ناوبری را راهاندازی میکند درحالیکه موسیقی پسزمینه موقتاً متوقف شده است.
- درطول دورههای سکوت بین خواندنها، تمرکز ورودی بهطور پیشفرض روی کنترلهای رسانه قرار میگیرد.
- وقتی برنامه ناوبری میگوید «۵۰۰ فوت جلوتر، به چپ بپیچید»، تمرکز ورودی را بهدست میآورد.
- کنشهای کاربر: تکضرب زدن درطول خواندن میتواند راهنمایی را بیصدا کند. تکضرب زدن درطول سکوت، بازپخش موسیقی را ازسر میگیرد.
سناریو پ: همزمان (رسانه فعال)
برای این سناریو، هرگاه برنامه ناوبری آگاهی کاربر را نداشته باشد، سیستم ورودی را به کنترلهای رسانه سیستم هدایت میکند و صدای بازپخش رسانه فعال درطول هر خواندن از برنامه ناوبری کاهش مییابد.
- کاربر درحالیکه موسیقی درحال پخش است، ناوبری را راهاندازی میکند.
- درطول خواندن دستورالعمل، سیستم صدای پسزمینه را کاهش میدهد و کانون ورودی را به برنامه ناوبری منتقل میکند.
- کنشهای کاربر: تکضرب زدن درطول خواندن میتواند راهنمایی را بیصدا کند. ضربه زدن در دورههای سکوت، بازپخش رسانه را کنترل میکند (برای مکث یا ازسر گرفتن).