এই নির্দেশিকাটি ব্যাখ্যা করে যে কীভাবে আপনার অ্যাপটি সর্বদা চালু রাখবেন, পাওয়ার স্টেট ট্রানজিশনে কীভাবে প্রতিক্রিয়া জানাবেন এবং ব্যাটারি সাশ্রয় করার সময় একটি ভাল ব্যবহারকারীর অভিজ্ঞতা প্রদানের জন্য অ্যাপ্লিকেশন আচরণ কীভাবে পরিচালনা করবেন।
একটি অ্যাপকে ক্রমাগত দৃশ্যমান করে রাখলে ব্যাটারির আয়ু উল্লেখযোগ্যভাবে প্রভাবিত হয়, তাই এই বৈশিষ্ট্যটি যুক্ত করার সময় পাওয়ার প্রভাব বিবেচনা করুন।
মূল ধারণা
যখন একটি Wear OS অ্যাপ পূর্ণ স্ক্রিনে প্রদর্শিত হয়, তখন এটি দুটি পাওয়ার অবস্থায় থাকে:
- ইন্টারেক্টিভ : একটি উচ্চ-শক্তির অবস্থা যেখানে স্ক্রিন সম্পূর্ণ উজ্জ্বলতায় থাকে, যা সম্পূর্ণ ব্যবহারকারীর সাথে ইন্টারঅ্যাকশনের সুযোগ করে দেয়।
- অ্যাম্বিয়েন্ট : একটি কম-পাওয়ার অবস্থা যেখানে ডিসপ্লেটি শক্তি সংরক্ষণের জন্য ম্লান হয়ে যায়। এই অবস্থায়, আপনার অ্যাপের UI এখনও পূর্ণ স্ক্রিন দখল করে, তবে সিস্টেমটি এটিকে ঝাপসা করে বা সময়ের মতো কন্টেন্ট ওভারলে করে এর চেহারা পরিবর্তন করতে পারে। এটিকে অ্যাম্বিয়েন্ট মোডও বলা হয়।
অপারেটিং সিস্টেম এই অবস্থার মধ্যে রূপান্তর নিয়ন্ত্রণ করে।
একটি অলওয়েজ-অন অ্যাপ হল এমন একটি অ্যাপ্লিকেশন যা ইন্টারেক্টিভ এবং অ্যাম্বিয়েন্ট উভয় অবস্থাতেই বিষয়বস্তু প্রদর্শন করে।
যখন একটি সর্বদা-চালু অ্যাপ ডিভাইসটি কম-পাওয়ার অ্যাম্বিয়েন্ট অবস্থায় থাকাকালীন তার নিজস্ব UI প্রদর্শন করতে থাকে, তখন এটিকে অ্যাম্বিয়েন্ট মোডে থাকা হিসাবে বর্ণনা করা হয়।
সিস্টেম ট্রানজিশন এবং ডিফল্ট আচরণ
যখন কোনও অ্যাপ সামনের দিকে থাকে, তখন ব্যবহারকারীর নিষ্ক্রিয়তার কারণে দুটি টাইমআউটের উপর ভিত্তি করে সিস্টেমটি পাওয়ার স্টেট ট্রানজিশন পরিচালনা করে।
- টাইমআউট #১: অ্যাম্বিয়েন্ট অবস্থায় ইন্টারেক্টিভ: ব্যবহারকারীর নিষ্ক্রিয়তার কিছু সময় পর, ডিভাইসটি অ্যাম্বিয়েন্ট অবস্থায় প্রবেশ করে।
- টাইমআউট #২: ওয়াচফেসে ফিরে যান: আরও কিছুক্ষণ নিষ্ক্রিয় থাকার পরে, সিস্টেমটি বর্তমান অ্যাপটি লুকিয়ে রাখতে পারে এবং ওয়াচফেসটি প্রদর্শন করতে পারে।
সিস্টেমটি অ্যাম্বিয়েন্ট অবস্থায় প্রথম রূপান্তরের মধ্য দিয়ে যাওয়ার পরপরই, ডিফল্ট আচরণ Wear OS সংস্করণ এবং আপনার অ্যাপের কনফিগারেশনের উপর নির্ভর করে:
- Wear OS 5 এবং তার নিচের ভার্সনে , সিস্টেমটি আপনার পজ করা অ্যাপ্লিকেশনের একটি ঝাপসা স্ক্রিনশট প্রদর্শন করে, যার উপরে সময় ওভারলে করা থাকে। এই অবস্থাটি নিম্নলিখিত ফ্লোচার্টে "AOD Lite" নোড দ্বারা প্রতিনিধিত্ব করা হয়েছে।
- Wear OS 6 এবং উচ্চতর ভার্সনে , যদি কোনও অ্যাপ SDK 36 বা তার পরবর্তী ভার্সনকে টার্গেট করে, তাহলে এটি সর্বদা চালু বলে বিবেচিত হবে। ডিসপ্লেটি ম্লান করা হয়, কিন্তু অ্যাপ্লিকেশনটি চলতে থাকে এবং দৃশ্যমান থাকে। (আপডেটগুলি প্রতি মিনিটে একবারের মতো বিরল হতে পারে।) এই অবস্থাটি নিম্নলিখিত ফ্লোচার্টে "গ্লোবাল AOD" নোড দ্বারা প্রতিনিধিত্ব করা হয়েছে।
অ্যাম্বিয়েন্ট স্টেটের জন্য আচরণ কাস্টমাইজ করুন
ডিফল্ট সিস্টেম আচরণ যাই হোক না কেন, সমস্ত Wear OS সংস্করণে আপনি অ্যাম্বিয়েন্ট অবস্থায় থাকাকালীন AmbientLifecycleObserver ব্যবহার করে স্টেট ট্রানজিশনের কলব্যাক শুনতে আপনার অ্যাপের চেহারা বা আচরণ কাস্টমাইজ করতে পারেন। এই অবস্থাটি নিম্নলিখিত ফ্লোচার্টে "অ্যাম্বিয়াকটিভ মোড" নোড দ্বারা প্রতিনিধিত্ব করা হয়েছে।
অ্যাম্বিয়েন্টলাইফসাইকেলঅবজারভার ব্যবহার করুন
অ্যাম্বিয়েন্ট মোড ইভেন্টগুলিতে প্রতিক্রিয়া জানাতে, AmbientLifecycleObserver ক্লাসটি ব্যবহার করুন:
AmbientLifecycleObserver.AmbientLifecycleCallbackইন্টারফেসটি বাস্তবায়ন করুন। কম-পাওয়ার অবস্থার জন্য আপনার UI সামঞ্জস্য করতেonEnterAmbient()পদ্ধতিটি ব্যবহার করুন এবং সম্পূর্ণ ইন্টারেক্টিভ ডিসপ্লেতে পুনরুদ্ধার করতেonExitAmbient()পদ্ধতিটি ব্যবহার করুন।val ambientCallback = object : AmbientLifecycleObserver.AmbientLifecycleCallback { override fun onEnterAmbient(ambientDetails: AmbientLifecycleObserver.AmbientDetails) { // ... Called when moving from interactive mode into ambient mode. // Adjust UI for low-power state: dim colors, hide non-essential elements. } override fun onExitAmbient() { // ... Called when leaving ambient mode, back into interactive mode. // Restore full UI. } override fun onUpdateAmbient() { // ... Called by the system periodically (typically once per minute) // to allow the app to update its display while in ambient mode. } }
একটি
AmbientLifecycleObserverতৈরি করুন এবং এটি আপনার কার্যকলাপের জীবনচক্র বা কম্পোজেবলের সাথে নিবন্ধন করুন।private val ambientObserver = AmbientLifecycleObserver(activity, ambientCallback) override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) lifecycle.addObserver(ambientObserver) // ... }
onDestroy()থেকে পর্যবেক্ষক অপসারণ করতেremoveObserver()কল করুন।override fun onDestroy() { super.onDestroy() lifecycle.removeObserver(ambientObserver) // ... }
জেটপ্যাক কম্পোজ ব্যবহারকারী ডেভেলপারদের জন্য, হরোলজিস্ট লাইব্রেরি একটি সহায়ক ইউটিলিটি, AmbientAware কম্পোজেবল প্রদান করে, যা এই প্যাটার্নের বাস্তবায়নকে সহজ করে তোলে।
অ্যাম্বিয়েন্ট-সচেতন টাইমটেক্সট
কাস্টম পর্যবেক্ষকের প্রয়োজনের ব্যতিক্রম হিসেবে, Wear OS 6-এ TimeText উইজেটটি অ্যাম্বিয়েন্ট-সচেতন। ডিভাইসটি অ্যাম্বিয়েন্ট অবস্থায় থাকলে এটি প্রতি মিনিটে একবার স্বয়ংক্রিয়ভাবে আপডেট হয়, কোনও অতিরিক্ত কোড ছাড়াই।
পরিবেষ্টিত আচরণের ফ্লোচার্ট
নিম্নলিখিত ফ্লোচার্টটি দেখায় যে ডিভাইসের Wear OS সংস্করণ, আপনার অ্যাপের targetSdkVersion এবং এটি AmbientLifecycleCallback বাস্তবায়ন করে কিনা তার উপর ভিত্তি করে সিস্টেম কীভাবে পরিবেষ্টনের আচরণ নির্ধারণ করে।

স্ক্রিন-অন সময়কাল নিয়ন্ত্রণ করুন
আপনার অ্যাপটি স্ক্রিনে কতক্ষণ থাকবে তা কীভাবে পরিচালনা করবেন তা নিম্নলিখিত বিভাগগুলিতে বর্ণনা করা হয়েছে।
চলমান কার্যকলাপ সহ ওয়াচফেসে ফিরে আসা প্রতিরোধ করুন
অ্যাম্বিয়েন্ট অবস্থায় কিছু সময় থাকার পর (টাইমআউট #২), সিস্টেমটি সাধারণত ওয়াচফেসে ফিরে আসবে। ব্যবহারকারী সিস্টেম সেটিংসে টাইমআউটের সময়কাল কনফিগার করতে পারবেন। কিছু ব্যবহারের ক্ষেত্রে, যেমন ব্যবহারকারীর ওয়ার্কআউট ট্র্যাক করার ক্ষেত্রে, একটি অ্যাপকে আরও বেশি সময় ধরে দৃশ্যমান থাকতে হতে পারে।
Wear OS 5 এবং তার পরবর্তী ভার্সনে, আপনি একটি Ongoing Activity প্রয়োগ করে এটি প্রতিরোধ করতে পারেন। যদি আপনার অ্যাপটি চলমান ব্যবহারকারীর কাজ সম্পর্কে তথ্য প্রদর্শন করে, যেমন একটি ওয়ার্কআউট সেশন, তাহলে আপনি Ongoing Activity API ব্যবহার করে আপনার অ্যাপটি কাজ শেষ না হওয়া পর্যন্ত দৃশ্যমান রাখতে পারেন। যদি কোনও ব্যবহারকারী ম্যানুয়ালি ওয়াচফেসে ফিরে যান, তাহলে চলমান কার্যকলাপ নির্দেশক তাদের আপনার অ্যাপে ফিরে যাওয়ার জন্য এক-ট্যাপ উপায় প্রদান করে।
এটি বাস্তবায়নের জন্য, চলমান বিজ্ঞপ্তির স্পর্শের উদ্দেশ্য অবশ্যই আপনার সর্বদা-চালু কার্যকলাপের দিকে নির্দেশ করবে, যেমনটি নিম্নলিখিত কোড স্নিপেটে দেখানো হয়েছে:
val activityIntent = Intent(this, AlwaysOnActivity::class.java).apply { flags = Intent.FLAG_ACTIVITY_SINGLE_TOP } val pendingIntent = PendingIntent.getActivity( this, 0, activityIntent, PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE, ) val notificationBuilder = NotificationCompat.Builder(this, CHANNEL_ID) // ... // ... .setOngoing(true) // ... val ongoingActivity = OngoingActivity.Builder(applicationContext, NOTIFICATION_ID, notificationBuilder) // ... // ... .setTouchIntent(pendingIntent) .build() ongoingActivity.apply(applicationContext) val notification = notificationBuilder.build()
স্ক্রিন চালু রাখুন এবং অ্যাম্বিয়েন্ট অবস্থা প্রতিরোধ করুন
বিরল ক্ষেত্রে, আপনার ডিভাইসটিকে অ্যাম্বিয়েন্ট অবস্থায় প্রবেশ করা থেকে সম্পূর্ণরূপে বিরত রাখতে হতে পারে। অর্থাৎ, টাইমআউট #1 এড়াতে। এটি করার জন্য, আপনি FLAG_KEEP_SCREEN_ON উইন্ডো ফ্ল্যাগ ব্যবহার করতে পারেন। এটি একটি ওয়েক লক হিসেবে কাজ করে, ডিভাইসটিকে ইন্টারেক্টিভ অবস্থায় রাখে। এটি অত্যন্ত সতর্কতার সাথে ব্যবহার করুন কারণ এটি ব্যাটারির আয়ুকে মারাত্মকভাবে প্রভাবিত করে।
অ্যাম্বিয়েন্ট মোডের জন্য সুপারিশ
অ্যাম্বিয়েন্ট মোডে সর্বোত্তম ব্যবহারকারীর অভিজ্ঞতা প্রদান এবং শক্তি সংরক্ষণ করতে, এই নকশা নির্দেশিকাগুলি অনুসরণ করুন। এই সুপারিশগুলি বিভ্রান্তিকর তথ্য প্রতিরোধ করে এবং ভিজ্যুয়াল বিশৃঙ্খলা হ্রাস করে, একই সাথে ডিসপ্লে পাওয়ার অপ্টিমাইজ করে একটি স্পষ্ট ব্যবহারকারীর অভিজ্ঞতাকে অগ্রাধিকার দেয়।
- ভিজ্যুয়াল ক্লাস্টার এবং ডিসপ্লে পাওয়ার কমানো। একটি পরিষ্কার, ন্যূনতম UI ব্যবহারকারীকে সংকেত দেয় যে অ্যাপটি কম-পাওয়ার অবস্থায় আছে এবং উজ্জ্বল পিক্সেল সীমিত করে উল্লেখযোগ্য ব্যাটারি সাশ্রয় করে।
- স্ক্রিনের কমপক্ষে ৮৫% কালো রাখুন।
- শুধুমাত্র সবচেয়ে গুরুত্বপূর্ণ তথ্য দেখান, গৌণ বিবরণগুলি ইন্টারেক্টিভ ডিসপ্লেতে স্থানান্তর করুন।
- বড় আইকন বা বোতামের জন্য সলিড ফিল ব্যবহার না করে রূপরেখা ব্যবহার করুন।
- বড় বড় রঙের ব্লক এবং অকার্যকর ব্র্যান্ডিং বা ব্যাকগ্রাউন্ড ছবি এড়িয়ে চলুন।
- পুরানো গতিশীল ডেটা পরিচালনা করুন
-
onUpdateAmbient()কলব্যাক শুধুমাত্র পর্যায়ক্রমে আহ্বান করা হয় -- সাধারণত প্রতি মিনিটে একবার -- শক্তি সংরক্ষণের জন্য। এই সীমাবদ্ধতার কারণে, ঘন ঘন পরিবর্তিত যেকোনো ডেটা -- যেমন স্টপওয়াচ, হার্ট রেট, বা ওয়ার্কআউট দূরত্ব -- আপডেটের মধ্যে অচল হয়ে যায়। বিভ্রান্তিকর এবং ভুল তথ্য প্রদর্শন এড়াতে,onEnterAmbientকলব্যাকটি শুনুন এবং এই লাইভ মানগুলিকে স্ট্যাটিক প্লেসহোল্ডার কন্টেন্ট দিয়ে প্রতিস্থাপন করুন, যেমন--।
-
- একটি সামঞ্জস্যপূর্ণ বিন্যাস বজায় রাখুন
- একটি মসৃণ রূপান্তর তৈরি করতে ইন্টারেক্টিভ এবং অ্যাম্বিয়েন্ট মোড জুড়ে উপাদানগুলিকে একই অবস্থানে রাখুন।
- সর্বদা সময় দেখান।
- প্রেক্ষাপট সম্পর্কে সচেতন থাকুন
- ডিভাইসটি অ্যাম্বিয়েন্ট মোডে প্রবেশ করার সময় ব্যবহারকারী যদি কোনও সেটিংস বা কনফিগারেশন স্ক্রিনে ছিলেন, তাহলে সেটিংস ভিউয়ের পরিবর্তে আপনার অ্যাপ থেকে আরও প্রাসঙ্গিক স্ক্রিন দেখানোর কথা বিবেচনা করুন।
- ডিভাইস-নির্দিষ্ট প্রয়োজনীয়তাগুলি পরিচালনা করুন
-
AmbientDetailsঅবজেক্টটিonEnterAmbient()এ পাস করা হয়েছে:- যদি
deviceHasLowBitAmbienttrueহয়, তাহলে সম্ভব হলে অ্যান্টি-অ্যালিয়াসিং অক্ষম করুন। - যদি
burnInProtectionRequiredtrueহয়, তাহলে পর্যায়ক্রমে UI উপাদানগুলিকে সামান্য পরিবর্তন করুন এবং স্ক্রিন বার্ন-ইন প্রতিরোধ করার জন্য কঠিন সাদা অংশগুলি এড়িয়ে চলুন।
- যদি
-
ডিবাগিং এবং পরীক্ষা
ডিভাইসটি অ্যাম্বিয়েন্ট মোডে থাকাকালীন আপনার অ্যাপটি কীভাবে আচরণ করে তা ডেভেলপ করার সময় বা পরীক্ষা করার সময় এই adb কমান্ডগুলি কার্যকর হতে পারে:
# put device in ambient mode if the always on display is enabled in settings
# (and not disabled by other settings, such as theatre mode)
$ adb shell input keyevent KEYCODE_SLEEP
# put device in interactive mode
$ adb shell input keyevent KEYCODE_WAKEUP
উদাহরণ: ওয়ার্কআউট অ্যাপ
এমন একটি ওয়ার্কআউট অ্যাপ বিবেচনা করুন যা ব্যবহারকারীকে তাদের ব্যায়াম সেশনের পুরো সময়কাল জুড়ে মেট্রিক্স প্রদর্শন করতে হবে। অ্যাপটিকে অ্যাম্বিয়েন্ট স্টেট ট্রানজিশনের সময় দৃশ্যমান রাখতে হবে এবং ওয়াচফেস দ্বারা প্রতিস্থাপিত হওয়া এড়াতে হবে।
এটি অর্জনের জন্য, বিকাশকারীকে নিম্নলিখিতগুলি করতে হবে:
- ইন্টারেক্টিভ এবং অ্যাম্বিয়েন্ট অবস্থার মধ্যে UI পরিবর্তনগুলি পরিচালনা করার জন্য একটি
AmbientLifecycleObserverপ্রয়োগ করুন, যেমন স্ক্রিনটি ম্লান করা এবং অপ্রয়োজনীয় ডেটা অপসারণ করা। - অ্যাম্বিয়েন্ট স্টেটের জন্য একটি নতুন কম-পাওয়ার লেআউট তৈরি করুন যা সর্বোত্তম অনুশীলন অনুসরণ করে।
- সিস্টেমটি যাতে ওয়াচফেসে ফিরে না আসে তার জন্য ওয়ার্কআউটের সময়কালের জন্য চলমান কার্যকলাপ API ব্যবহার করুন।
সম্পূর্ণ বাস্তবায়নের জন্য, GitHub-এ কম্পোজ-ভিত্তিক এক্সারসাইজ নমুনাটি দেখুন। এই নমুনাটি কম্পোজে অ্যাম্বিয়েন্ট মোড হ্যান্ডলিং সহজ করার জন্য হোরোলজিস্ট লাইব্রেরি থেকে AmbientAware কম্পোজেবলের ব্যবহারও প্রদর্শন করে।