किसी ऐप्लिकेशन को लगातार दिखाने से, बैटरी लाइफ़ पर काफ़ी असर पड़ता है. इसलिए, यह सुविधा जोड़ने से पहले, बैटरी पर पड़ने वाले असर के बारे में सोचें.
खास कॉन्सेप्ट
जब Wear OS ऐप्लिकेशन, फ़ुल स्क्रीन पर दिखता है, तो वह दो पावर स्टेट में से किसी एक में होता है:
- इंटरैक्टिव: यह हाई-पावर स्टेट है. इसमें स्क्रीन की रोशनी पूरी होती है. इससे उपयोगकर्ता को पूरा इंटरैक्शन करने की अनुमति मिलती है.
- एंबियंट: यह लो-पावर स्टेट है. इसमें पावर बचाने के लिए, डिसप्ले की रोशनी कम हो जाती है. इस स्टेट में, आपके ऐप्लिकेशन का यूज़र इंटरफ़ेस (यूआई) अब भी फ़ुल स्क्रीन पर दिखता है. हालांकि, सिस्टम धुंधला करके या समय जैसे ओवरले कॉन्टेंट को दिखाकर, इसके दिखने के तरीके में बदलाव कर सकता है. इसे एंबियंट मोड भी कहा जाता है.
ऑपरेटिंग सिस्टम, इन स्टेट के बीच ट्रांज़िशन को कंट्रोल करता है.
हमेशा चालू रहने वाला ऐप्लिकेशन ऐसा ऐप्लिकेशन होता है जो इंटरैक्टिव और एंबियंट , दोनों स्टेट में कॉन्टेंट दिखाता है.
जब कोई हमेशा चालू रहने वाला ऐप्लिकेशन, डिवाइस के लो-पावर एंबियंट स्टेट में होने पर भी अपना यूज़र इंटरफ़ेस (यूआई) दिखाता रहता है, तो इसे एंबियाक्टिव मोड में होना कहा जाता है.
सिस्टम ट्रांज़िशन और डिफ़ॉल्ट सेटिंग
जब कोई ऐप्लिकेशन फ़ोरग्राउंड में होता है, तो सिस्टम, उपयोगकर्ता की गतिविधि न होने पर ट्रिगर होने वाले दो टाइम आउट के आधार पर, पावर स्टेट ट्रांज़िशन को मैनेज करता है.
- टाइम आउट #1: इंटरैक्टिव से एंबियंट स्टेट में जाना: उपयोगकर्ता की गतिविधि न होने पर, डिवाइस एंबियंट स्टेट में चला जाता है.
- टाइम आउट #2: वॉच फ़ेस पर वापस आना: उपयोगकर्ता की गतिविधि न होने पर, सिस्टम मौजूदा ऐप्लिकेशन को छिपाकर वॉच फ़ेस दिखा सकता है.
सिस्टम के एंबियंट स्टेट में पहले ट्रांज़िशन के तुरंत बाद, डिफ़ॉल्ट सेटिंग, Wear OS के वर्शन और आपके ऐप्लिकेशन के कॉन्फ़िगरेशन पर निर्भर करती है:
- Wear OS 5 और इससे पहले के वर्शन पर, सिस्टम, पॉज़ किए गए ऐप्लिकेशन का धुंधला स्क्रीनशॉट दिखाता है. इसके ऊपर समय दिखता है. इस स्टेट को यहां दिए गए फ़्लोचार्ट में"AOD Lite" नोड से दिखाया गया है.
- Wear OS 6 और इसके बाद के वर्शन पर, अगर कोई ऐप्लिकेशन, SDK 36 या इसके बाद के वर्शन को टारगेट करता है, तो उसे हमेशा चालू रहने वाला ऐप्लिकेशन माना जाता है. डिसप्ले की रोशनी कम हो जाती है, लेकिन ऐप्लिकेशन चलता रहता है और दिखता रहता है. (अपडेट, हर मिनट में एक बार से ज़्यादा नहीं हो सकते.) इस स्टेट को, यहां दिए गए फ़्लोचार्ट में "Global AOD" नोड से दिखाया गया है.
एंबियंट स्टेट के लिए सेटिंग को पसंद के मुताबिक बनाना
सिस्टम की डिफ़ॉल्ट सेटिंग के बावजूद, Wear OS के सभी वर्शन पर,
एंबियंट स्टेट में अपने ऐप्लिकेशन के दिखने के तरीके या सेटिंग को पसंद के मुताबिक बनाया जा सकता है. इसके लिए,
Wear OS पर
Jetpack Compose में स्टेट ट्रांज़िशन देखने के लिए, LocalAmbientModeManager का इस्तेमाल करें. इस स्टेट को, यहां दिए गए फ़्लोचार्ट में "Ambiactive Mode"
नोड से दिखाया गया है.
एंबियंट स्टेट देखना
Wear OS पर Jetpack Compose में, एंबियंट मोड के इवेंट पर प्रतिक्रिया देने के लिए:
सिस्टम के एंबियंट मोड के स्टेटस में होने वाले बदलावों को देखने के लिए,
LocalAmbientModeManagerका इस्तेमाल करें. इसके बाद, अपने कंपोज़ेबल को उसके हिसाब से अडजस्ट करें.AmbientMode.Ambientस्टेट में, अपने कॉम्पोनेंट को लो-पावर मोड के हिसाब से अडजस्ट करें. साथ ही,AmbientMode.Interactiveस्टेट में, इसे पूरी तरह से इंटरैक्टिव डिसप्ले पर वापस लाएं.// In a production application, the AmbientModeManager should be instantiated and provided at // the highest level of the Compose hierarchy (typically in the host Activity's setContent // block) using a CompositionLocalProvider. This ensures proper lifecycle management and // broad accessibility. // For this self-contained demo, AmbientModeManager is created and provided locally: val activityAmbientModeManager = rememberAmbientModeManager() CompositionLocalProvider(LocalAmbientModeManager provides activityAmbientModeManager) { val ambientModeManager = LocalAmbientModeManager.current val ambientMode = ambientModeManager?.currentAmbientMode if (ambientModeManager != null) { ambientModeManager.AmbientTickEffect { // While device is in ambient mode, update properties every minute or so // ... } } // ... val ambientModeName = when (ambientMode) { is AmbientMode.Interactive -> "Interactive" is AmbientMode.Ambient -> "Ambient" else -> "Unknown" } Text(text = "$ambientModeName Mode") // ... }
Jetpack Compose का इस्तेमाल करने वाले डेवलपर, LocalAmbientModeManager का इस्तेमाल करें. इससे
इस पैटर्न को लागू करना आसान हो जाता है.
एंबियंट बिहेवियर फ़्लोचार्ट
यहां दिए गए फ़्लोचार्ट में बताया गया है कि सिस्टम, डिवाइस के Wear OS वर्शन, आपके ऐप्लिकेशन के targetSdkVersion, और AmbientLifecycleCallback को लागू करने के आधार पर, एंबियंट बिहेवियर कैसे तय करता है.
स्क्रीन पर कॉन्टेंट दिखने की अवधि को कंट्रोल करना
यहां दिए गए सेक्शन में, यह मैनेज करने का तरीका बताया गया है कि आपका ऐप्लिकेशन स्क्रीन पर कितनी देर तक दिखता है.
चालू गतिविधि या लाइव अपडेट के साथ, वॉच फ़ेस पर वापस आने से रोकना
एंबियंट स्टेट में कुछ समय (टाइम आउट #2) के बाद, सिस्टम आम तौर पर वॉच फ़ेस पर वापस आ जाता है. उपयोगकर्ता, सिस्टम सेटिंग में जाकर टाइम आउट की अवधि को कॉन्फ़िगर कर सकता है. कुछ मामलों में, जैसे कि उपयोगकर्ता के वर्कआउट को ट्रैक करने के लिए, किसी ऐप्लिकेशन को ज़्यादा समय तक दिखने की ज़रूरत पड़ सकती है.
Wear OS 5 और इसके बाद के वर्शन पर, चालू गतिविधि को लागू करके, इसे रोका जा सकता है. अगर आपका ऐप्लिकेशन, उपयोगकर्ता के चालू टास्क के बारे में जानकारी दिखा रहा है, जैसे कि वर्कआउट सेशन, तो चालू गतिविधि एपीआई का इस्तेमाल करके, टास्क खत्म होने तक अपने ऐप्लिकेशन को दिखाया जा सकता है. अगर कोई उपयोगकर्ता मैन्युअल तरीके से स्मार्ट वॉच की होम स्क्रीन पर वापस आता है, तो बैकग्राउंड में जारी गतिविधि इंडिकेटर की मदद से, वह एक टैप में आपके ऐप्लिकेशन पर वापस आ सकता है.
इसके अलावा, Wear OS 7 और इसके बाद के वर्शन पर, लाइव अपडेट का इस्तेमाल चालू गतिविधि के बजाय किया जा सकता है. पीछे के वर्शन के साथ काम करने की सुविधा के लिए, Wear OS 6 या इससे पहले के वर्शन पर चलने वाले डिवाइसों पर, चालू गतिविधि की सुविधा जारी रखें.
इसे लागू करने के लिए, चालू सूचना के टच इंटेंट को, हमेशा चालू रहने वाली आपकी गतिविधि की ओर ले जाना होगा. जैसा कि यहां दिए गए कोड स्निपेट में दिखाया गया है:
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 से बचने के लिए. ऐसा करने के लिए, keepScreenOn मॉडिफ़ायर का इस्तेमाल किया जा सकता है. यह वेक लॉक के तौर पर काम करता है. इससे डिवाइस इंटरैक्टिव स्टेट में रहता है. इसका इस्तेमाल बहुत सावधानी से करें, क्योंकि इससे बैटरी लाइफ़ पर काफ़ी असर पड़ता है.
एंबियंट मोड के लिए सुझाव
एंबियंट मोड में लोगों को बेहतर अनुभव देने और पावर बचाने के लिए, डिज़ाइन से जुड़े इन दिशा-निर्देशों का पालन करें. इन सुझावों में, लोगों को बेहतर अनुभव देने पर ज़ोर दिया गया है. इसके लिए, गुमराह करने वाली जानकारी को रोका जाता है और विज़ुअल क्लटर को कम किया जाता है. साथ ही, डिसप्ले पावर को ऑप्टिमाइज़ किया जाता है.
- विज़ुअल क्लटर और डिसप्ले पावर कम करें. साफ़ और कम एलिमेंट वाला यूज़र इंटरफ़ेस (यूआई), लोगों को यह बताता है कि ऐप्लिकेशन लो-पावर स्टेट में है. साथ ही, रोशनी वाले पिक्सल को सीमित करके, बैटरी को काफ़ी हद तक बचाया जा सकता है.
- स्क्रीन का कम से कम 85% हिस्सा काले रंग का रखें.
- सिर्फ़ सबसे ज़रूरी जानकारी दिखाएं. साथ ही, सेकंडरी जानकारी को इंटरैक्टिव डिसप्ले पर ले जाएं.
- बड़े आइकॉन या बटन के लिए, सॉलिड फ़िल के बजाय आउटलाइन का इस्तेमाल करें.
- सॉलिड कलर के बड़े ब्लॉक और काम न करने वाली ब्रैंडिंग या बैकग्राउंड इमेज का इस्तेमाल न करें.
- पुराने हो चुके डाइनैमिक डेटा को हैंडल करना
- पावर बचाने के लिए,
AmbientTickEffectकॉलबैक को समय-समय पर ही लागू किया जाता है. आम तौर पर, इसे हर मिनट में एक बार लागू किया जाता है. इस सीमा की वजह से, ऐसा कोई भी डेटा जो बार-बार बदलता है, जैसे कि स्टॉपवॉच, धड़कन की दर या वर्कआउट की दूरी, अपडेट के बीच पुराना हो जाता है. गुमराह करने वाली और गलत जानकारी दिखाने से बचने के लिए, इन लाइव वैल्यू को स्टैटिक प्लेसहोल्डर कॉन्टेंट से बदलें. जैसे,--.
- पावर बचाने के लिए,
- एक जैसा लेआउट बनाए रखना
- स्मूद ट्रांज़िशन बनाने के लिए, इंटरैक्टिव और एंबियंट , दोनों मोड में एलिमेंट को एक ही जगह पर रखें.
- समय हमेशा दिखाएं.
- कॉन्टेक्स्ट के हिसाब से जानकारी दिखाना
- अगर डिवाइस के एंबियंट मोड में जाने के दौरान, उपयोगकर्ता सेटिंग या कॉन्फ़िगरेशन स्क्रीन पर था, तो सेटिंग व्यू के बजाय, अपने ऐप्लिकेशन से ज़्यादा काम की स्क्रीन दिखाने पर विचार करें.
- डिवाइस के हिसाब से ज़रूरी शर्तें पूरी करना
currentAmbientModeसे मिलेAmbientModeऑब्जेक्ट में:- अगर
isLowBitAmbientSupportedकी वैल्यूtrueहै, तो जहां हो सके वहां एंटी-एलियासिंग की सुविधा बंद करें. - अगर
isBurnInProtectionRequiredकी वैल्यूtrueहै, तो स्क्रीन बर्न-इन से बचने के लिए, यूज़र इंटरफ़ेस (यूआई) के एलिमेंट को समय-समय पर थोड़ा-थोड़ा बदलें. साथ ही, सॉलिड व्हाइट एरिया का इस्तेमाल न करें.
- अगर
डीबग करना और टेस्ट करना
डिवाइस के एंबियंट मोड में होने पर, आपका ऐप्लिकेशन कैसा काम करता है, यह डेवलप या टेस्ट करते समय, ये 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
उदाहरण: कसरत ऐप्लिकेशन
मान लें कि वर्कआउट ऐप्लिकेशन को, उपयोगकर्ता के पूरे वर्कआउट सेशन के दौरान, मेट्रिक दिखानी हैं. ऐप्लिकेशन को एंबियंट स्टेट ट्रांज़िशन के दौरान भी दिखते रहना चाहिए. साथ ही, वॉच फ़ेस से इसे बदला नहीं जाना चाहिए.
ऐसा करने के लिए, डेवलपर को यह काम करना चाहिए:
- इंटरैक्टिव और एंबियंट स्टेट के बीच, यूज़र इंटरफ़ेस (यूआई) में होने वाले बदलावों को हैंडल करने के लिए,
LocalAmbientModeManagerका इस्तेमाल करें. जैसे, स्क्रीन की रोशनी कम करना और गैर-ज़रूरी डेटा हटाना. - एंबियंट स्टेट के लिए, सबसे सही तरीकों के हिसाब से, नया लो-पावर लेआउट बनाएं.
- वर्कआउट के दौरान, चालू गतिविधि एपीआई (या Wear OS 7 और इसके बाद के वर्शन पर लाइव अपडेट) का इस्तेमाल करें, ताकि सिस्टम वॉच फ़ेस पर वापस न जाए.
पूरी जानकारी के लिए, GitHub पर कंपोज़ पर आधारित वर्कआउट का सैंपल देखें. इस सैंपल में, Compose में एंबियंट मोड को आसानी से हैंडल करने के लिए,
LocalAmbientModeManager कंपोज़ेबल के इस्तेमाल के बारे में भी बताया गया है.