इस गाइड में बताया गया है कि अपने ऐप्लिकेशन को हमेशा चालू कैसे रखें, पावर स्टेट ट्रांज़िशन पर कैसे प्रतिक्रिया दें, और ऐप्लिकेशन के व्यवहार को कैसे मैनेज करें, ताकि बैटरी बचाते हुए उपयोगकर्ताओं को बेहतर अनुभव दिया जा सके.
किसी ऐप्लिकेशन को लगातार दिखने की सुविधा चालू रखने से, बैटरी लाइफ़ पर काफ़ी असर पड़ता है. इसलिए, इस सुविधा को जोड़ते समय बैटरी पर पड़ने वाले असर के बारे में सोचें.
खास कॉन्सेप्ट
जब Wear OS ऐप्लिकेशन को फ़ुल स्क्रीन पर दिखाया जाता है, तो वह दो पावर स्टेट में से किसी एक में होता है:
- इंटरैक्टिव: यह एक ऐसी स्थिति होती है जिसमें स्क्रीन पूरी तरह से चालू होती है और उसकी चमक सबसे ज़्यादा होती है. इससे उपयोगकर्ता को पूरी तरह से इंटरैक्ट करने की अनुमति मिलती है.
- ऐम्बियंट: यह कम बैटरी खर्च करने वाली स्थिति होती है. इसमें बैटरी बचाने के लिए, डिसप्ले की रोशनी कम हो जाती है. इस स्थिति में, आपके ऐप्लिकेशन का यूज़र इंटरफ़ेस (यूआई) अब भी पूरी स्क्रीन पर दिखता है. हालांकि, सिस्टम इसकी उपस्थिति में बदलाव कर सकता है. जैसे, इसे धुंधला कर सकता है या समय जैसे ओवरले कॉन्टेंट को दिखा सकता है. इसे आस-पास की आवाज़ सुनाने वाला मोड भी कहा जाता है.
ऑपरेटिंग सिस्टम, इन स्टेटस के बीच ट्रांज़िशन को कंट्रोल करता है.
हमेशा चालू रहने वाला ऐप्लिकेशन ऐसा ऐप्लिकेशन होता है जो इंटरैक्टिव और ऐम्बिएंट, दोनों मोड में कॉन्टेंट दिखाता है.
जब कोई ऐप्लिकेशन, डिवाइस के कम बैटरी मोड वाले ऐंबियंट मोड में होने पर भी अपना यूज़र इंटरफ़ेस (यूआई) दिखाता रहता है, तो उसे ऐंबियैक्टिव मोड में होना कहा जाता है.
सिस्टम ट्रांज़िशन और डिफ़ॉल्ट बिहेवियर
जब कोई ऐप्लिकेशन फ़ोरग्राउंड में होता है, तो सिस्टम, पावर स्टेट ट्रांज़िशन को मैनेज करता है. ऐसा उपयोगकर्ता की गतिविधि न होने पर ट्रिगर होने वाले दो टाइमआउट के आधार पर किया जाता है.
- टाइम आउट #1: इंटरैक्टिव से ऐंबियंट मोड में स्विच करना: अगर उपयोगकर्ता कुछ समय तक कोई गतिविधि नहीं करता है, तो डिवाइस ऐंबियंट मोड में चला जाता है.
- टाइम आउट #2: वॉच फ़ेस पर वापस जाना: कुछ समय तक कोई गतिविधि न होने पर, सिस्टम मौजूदा ऐप्लिकेशन को छिपा सकता है और वॉच फ़ेस दिखा सकता है.
सिस्टम के Ambient मोड में जाने के तुरंत बाद, डिफ़ॉल्ट व्यवहार Wear OS के वर्शन और आपके ऐप्लिकेशन के कॉन्फ़िगरेशन पर निर्भर करता है:
- Wear OS 5 और इससे पहले के वर्शन पर, सिस्टम आपके रोके गए ऐप्लिकेशन का धुंधला स्क्रीनशॉट दिखाता है. इस पर समय की जानकारी भी दिखती है. इस स्थिति को इस फ़्लोचार्ट में "AOD Lite" नोड से दिखाया गया है.
- Wear OS 6 और इसके बाद के वर्शन पर, अगर कोई ऐप्लिकेशन एसडीके 36 या इसके बाद के वर्शन को टारगेट करता है, तो उसे हमेशा चालू रहने वाला ऐप्लिकेशन माना जाता है. डिस्प्ले की रोशनी कम हो जाती है, लेकिन ऐप्लिकेशन चलता रहता है और दिखता रहता है. (अपडेट हर मिनट में एक बार भी हो सकते हैं.) इस स्थिति को इस फ़्लोचार्ट में "Global AOD" नोड से दिखाया गया है.
हमेशा चालू रहने वाली स्क्रीन के लिए, व्यवहार को पसंद के मुताबिक बनाएं
सिस्टम के डिफ़ॉल्ट व्यवहार से कोई फ़र्क़ नहीं पड़ता. Wear OS के सभी वर्शन पर, ऐम्बिएंट मोड में ऐप्लिकेशन के दिखने के तरीके या उसके व्यवहार को पसंद के मुताबिक बनाया जा सकता है. इसके लिए, Jetpack Compose on Wear OS में 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") // ... }
आस-पास की स्थितियों के हिसाब से काम करने की सुविधा का फ़्लोचार्ट
इस फ़्लोचार्ट में बताया गया है कि सिस्टम, डिवाइस के Wear OS वर्शन, आपके ऐप्लिकेशन के targetSdkVersion, और ऐप्लिकेशन के परिवेश की स्थिति में बदलावों को मॉनिटर करने की क्षमता (LocalAmbientModeManager या AmbientLifecycleCallback का इस्तेमाल करके) के आधार पर, परिवेश की स्थिति का पता कैसे लगाता है.
स्क्रीन चालू रहने की अवधि को कंट्रोल करना
यहां दिए गए सेक्शन में बताया गया है कि ऐप्लिकेशन को स्क्रीन पर दिखने की अवधि को कैसे मैनेज करें.
'चल रही गतिविधि' या 'लाइव अपडेट' सुविधा का इस्तेमाल करते समय, स्मार्टवॉच की होम स्क्रीन पर वापस आने से रोकना
कुछ समय तक ऐम्बिएंट मोड में रहने के बाद (टाइम आउट #2), सिस्टम आम तौर पर वॉच फ़ेस पर वापस आ जाता है. उपयोगकर्ता, सिस्टम सेटिंग में जाकर टाइम आउट की अवधि को कॉन्फ़िगर कर सकता है. कुछ मामलों में, ऐप्लिकेशन को लंबे समय तक दिखने की ज़रूरत पड़ सकती है. जैसे, जब कोई उपयोगकर्ता वर्कआउट को ट्रैक कर रहा हो.
Wear OS 5 और इसके बाद के वर्शन पर, OngoingActivity को लागू करके, ऐसा होने से रोका जा सकता है. अगर आपका ऐप्लिकेशन, उपयोगकर्ता के किसी टास्क के बारे में जानकारी दिखा रहा है, जैसे कि वर्कआउट सेशन, तो Ongoing Activity API का इस्तेमाल करके, अपने ऐप्लिकेशन को तब तक दिखाया जा सकता है, जब तक टास्क पूरा नहीं हो जाता. अगर कोई उपयोगकर्ता मैन्युअल तरीके से स्मार्टवॉच की होम स्क्रीन पर वापस आता है, तो बैकग्राउंड में जारी गतिविधि का इंडिकेटर, उसे एक टैप में आपके ऐप्लिकेशन पर वापस जाने का विकल्प देता है.
इसके अलावा, 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% हिस्से को काला रखें. इसका मतलब है कि स्क्रीन पर मौजूद पिक्सल का अनुपात 15% या इससे कम होना चाहिए.
- सिर्फ़ सबसे ज़रूरी जानकारी दिखाएं और अन्य जानकारी को इंटरैक्टिव डिसप्ले पर ले जाएं.
- बड़े आइकॉन या बटन के लिए, सॉलिड फ़िल के बजाय आउटलाइन का इस्तेमाल करें. साथ ही, आउटलाइन के कंट्रास्ट को इस तरह से अडजस्ट करें कि एलिमेंट साफ़ तौर पर दिखें. इससे स्क्रीन फ़्लिकर या बर्न-इन होने का खतरा नहीं होता.
- एक ही रंग के बड़े ब्लॉक और काम न करने वाली ब्रैंडिंग या बैकग्राउंड इमेज का इस्तेमाल न करें.
- डाइनैमिक डेटा और एनिमेशन को हैंडल करना
- बैटरी बचाने के लिए,
AmbientTickEffectकॉलबैक को सिर्फ़ समय-समय पर ट्रिगर किया जाता है. आम तौर पर, इसे हर मिनट में एक बार ट्रिगर किया जाता है. इस सीमा की वजह से, ऐसा डेटा जो बार-बार बदलता है वह अपडेट के बीच पुराना हो जाता है. जैसे, स्टॉपवॉच, धड़कन की दर या कसरत की दूरी. गुमराह करने वाली और गलत जानकारी दिखाने से बचने के लिए, इन लाइव वैल्यू को स्टैटिक प्लेसहोल्डर कॉन्टेंट से बदलें. जैसे,--. - ऐसे प्रोग्रेस इंडिकेटर हटाएं जिन्हें उपयोगकर्ता के मौजूदा कॉन्टेक्स्ट या स्थिति के हिसाब से बार-बार अपडेट करना पड़ता है, ताकि वे काम के बने रहें. जैसे, छोटे मीडिया सेशन के लिए प्रोग्रेस रिंग. प्रोग्रेस इंडिकेटर को उन जगहों पर बनाए रखा जा सकता है जहां हर मिनट में एक बार अपडेट होने से अब भी फ़ायदा मिलता है. जैसे, लंबे टाइमर के लिए.
- ऐंबियंट मोड में सभी ऐनिमेशन रोकें या हटाएं. इनमें ऐनिमेटेड प्रोग्रेस इंडिकेटर और स्क्रोल करने वाला मार्की टेक्स्ट शामिल है.
- बैटरी बचाने के लिए,
- एक जैसा लेआउट बनाए रखें
- स्मूद ट्रांज़िशन बनाने के लिए, इंटरैक्टिव और ऐम्बिएंट मोड में एलिमेंट को एक ही जगह पर रखें. इंटरैक्टिव यूज़र इंटरफ़ेस (यूआई) एलिमेंट, जैसे कि बटन दिखते रहते हैं. ऐसा इसलिए, क्योंकि Wear OS वाले नए डिवाइसों में ऐंबियंट सेशन के दौरान टच इनपुट की सुविधा काम करती है.
- मौजूदा समय हमेशा दिखता है. Jetpack Compose for Wear OS में,
TimeText(यहScreenScaffoldमें डिफ़ॉल्ट रूप से शामिल होता है) परिवेश के हिसाब से काम करता है. साथ ही, यह परिवेश मोड में हर मिनट में एक बार अपने-आप अपडेट होता है.
- कॉन्टेक्स्ट के बारे में जानकारी होना
- अगर डिवाइस के ऐंबियंट मोड में आने के दौरान उपयोगकर्ता, सेटिंग या कॉन्फ़िगरेशन स्क्रीन पर था, तो सेटिंग व्यू के बजाय अपने ऐप्लिकेशन से ज़्यादा काम की स्क्रीन दिखाएं.
- डिवाइस के हिसाब से ज़रूरी शर्तों को पूरा करना
currentAmbientMode,AmbientMode.Ambientकब दिखाता है:- अगर
isLowBitAmbientSupportedtrueहै, तो डिसप्ले, ऐंबियंट मोड में हर रंग के लिए कम बिट इस्तेमाल करता है. एंटी-एलियासिंग की सुविधा बंद करें. उदाहरण के लिए, कस्टमCanvasयाPaintड्राइंग ऑपरेशनों में. साथ ही, जहां हो सके वहां रंग के ग्रेडिएंट का इस्तेमाल न करें. - अगर
isBurnInProtectionRequiredtrueहै, तो सिस्टम समय-समय पर डिसप्ले कॉन्टेंट को बदलता रहता है, ताकि पिक्सल बर्न-इन की समस्या न हो. अपने ऐप्लिकेशन में यूज़र इंटरफ़ेस (यूआई) के एलिमेंट को मैन्युअल तरीके से न बदलें. इसके बजाय, पूरी तरह से सफ़ेद जगहों से बचें. साथ ही, यूज़र इंटरफ़ेस (यूआई) के ज़रूरी एलिमेंट को स्क्रीन के किनारे से कम से कम 10 पिक्सल दूर रखें, ताकि सिस्टम के डिसप्ले को बदलने पर वे न दिखें. (स्टैंडर्ड Wear Compose लेआउट, जैसे किScreenScaffoldमें पहले से ही काफ़ी एज पैडिंग होती है.)
- अगर
डीबग करना और जांच करना
डिवाइस के ऐंबियंट मोड में होने पर, आपका ऐप्लिकेशन कैसा काम करता है, यह डेवलप या टेस्ट करते समय, 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का इस्तेमाल करके, इंटरैक्टिव और ऐम्बिएंट मोड के बीच यूज़र इंटरफ़ेस (यूआई) में होने वाले बदलावों को मैनेज करें. जैसे, स्क्रीन की रोशनी कम करना और गैर-ज़रूरी डेटा हटाना.- ऐम्बिएंट मोड के लिए, कम पावर वाला नया लेआउट बनाएं. इसमें सबसे सही तरीकों का पालन किया गया हो.
- वर्कआउट के दौरान, Ongoing Activity API का इस्तेमाल करें. इसके अलावा, Wear OS 7 और इसके बाद के वर्शन पर लाइव अपडेट का इस्तेमाल करें, ताकि सिस्टम को स्मार्टवॉच की होम स्क्रीन पर वापस जाने से रोका जा सके.
पूरी तरह से लागू करने के लिए, GitHub पर Compose पर आधारित एक्सरसाइज़ का सैंपल देखें. इस सैंपल में, Compose में ऐंबियंट मोड को आसानी से हैंडल करने के लिए, LocalAmbientModeManager कंपोज़ेबल का इस्तेमाल करने का तरीका भी दिखाया गया है.