हमेशा चालू रहने वाले ऐप्लिकेशन और सिस्टम ऐंबियंट मोड

इस गाइड में, ऐप्लिकेशन को हमेशा चालू रखने, पावर स्टेट ट्रांज़िशन पर प्रतिक्रिया करने, और बैटरी बचाने के साथ-साथ लोगों को बेहतर अनुभव देने के लिए, ऐप्लिकेशन के व्यवहार को मैनेज करने का तरीका बताया गया है.

किसी ऐप्लिकेशन को लगातार दिखाने से, बैटरी लाइफ़ पर काफ़ी असर पड़ता है. इसलिए, यह सुविधा जोड़ने से पहले, बैटरी पर पड़ने वाले असर के बारे में सोचें.

खास कॉन्सेप्ट

जब कोई Wear OS ऐप्लिकेशन फ़ुल स्क्रीन पर दिखता है, तो वह दो पावर स्टेट में से किसी एक में होता है:

  • इंटरैक्टिव: यह हाई-पावर स्टेट है. इसमें स्क्रीन की रोशनी पूरी होती है. इससे उपयोगकर्ता को पूरा इंटरैक्शन करने की अनुमति मिलती है.
  • ऐंबियंट: यह लो-पावर स्टेट है. इसमें पावर बचाने के लिए, डिसप्ले की रोशनी कम हो जाती है. इस स्टेट में, आपके ऐप्लिकेशन का यूज़र इंटरफ़ेस (यूआई) अब भी पूरी स्क्रीन पर दिखता है. हालांकि, सिस्टम इसे धुंधला करके या इस पर समय जैसे कॉन्टेंट को ओवरले करके, इसकी दिखावट में बदलाव कर सकता है. इसे ऐंबियंट मोड भी कहा जाता है.

ऑपरेटिंग सिस्टम, इन स्टेट के बीच ट्रांज़िशन को कंट्रोल करता है.

हमेशा चालू रहने वाला ऐप्लिकेशन ऐसा ऐप्लिकेशन होता है जो इंटरैक्टिव और ऐंबियंट , दोनों स्टेट में कॉन्टेंट दिखाता है.

जब कोई हमेशा चालू रहने वाला ऐप्लिकेशन, डिवाइस के लो-पावर ऐंबियंट स्टेट में होने पर भी अपना यूज़र इंटरफ़ेस (यूआई) दिखाता रहता है, तो इसे ऐंबिएक्टिव मोड में होना कहा जाता है.

सिस्टम ट्रांज़िशन और डिफ़ॉल्ट व्यवहार

जब कोई ऐप्लिकेशन फ़ोरग्राउंड में होता है, तो सिस्टम, उपयोगकर्ता की कोई गतिविधि न होने पर ट्रिगर होने वाले दो टाइमआउट के आधार पर, पावर स्टेट ट्रांज़िशन को मैनेज करता है.

  • टाइमआउट #1: इंटरैक्टिव से ऐंबियंट स्टेट में ट्रांज़िशन: उपयोगकर्ता की कोई गतिविधि न होने पर, डिवाइस ऐंबियंट स्टेट में चला जाता है.
  • टाइमआउट #2: वॉच फ़ेस पर वापस आना: उपयोगकर्ता की कोई गतिविधि न होने पर, सिस्टम मौजूदा ऐप्लिकेशन को छिपाकर वॉच फ़ेस दिखा सकता है.

सिस्टम के ऐंबियंट स्टेट में पहले ट्रांज़िशन के तुरंत बाद, डिफ़ॉल्ट व्यवहार, Wear OS के वर्शन और आपके ऐप्लिकेशन के कॉन्फ़िगरेशन पर निर्भर करता है:

  • Wear OS 5 और इससे पहले के वर्शन पर, सिस्टम, आपके पॉज़ किए गए ऐप्लिकेशन का धुंधला स्क्रीनशॉट दिखाता है. इस पर समय की जानकारी ओवरले की जाती है. इस स्टेट को यहां दिए गए फ़्लोचार्ट में"AOD Lite" नोड से दिखाया गया है.
  • Wear OS 6 और इसके बाद के वर्शन पर, अगर कोई ऐप्लिकेशन SDK 36 या इसके बाद के वर्शन को टारगेट करता है, तो उसे हमेशा चालू रहने वाला ऐप्लिकेशन माना जाता है. डिसप्ले की रोशनी कम हो जाती है, लेकिन ऐप्लिकेशन चलता रहता है और दिखता रहता है. (अपडेट, हर मिनट में एक बार से ज़्यादा नहीं हो सकते.) इस स्टेट को, यहां दिए गए फ़्लोचार्ट में "Global AOD" नोड से दिखाया गया है.

ऐंबियंट स्टेट के लिए व्यवहार को पसंद के मुताबिक बनाना

सिस्टम के डिफ़ॉल्ट व्यवहार के बावजूद, Wear OS के सभी वर्शन पर, ऐंबियंट स्टेट में होने पर, अपने ऐप्लिकेशन की दिखावट या व्यवहार को पसंद के मुताबिक बनाया जा सकता है. इसके लिए, AmbientLifecycleObserver का इस्तेमाल करके, स्टेट ट्रांज़िशन पर कॉलबैक को सुना जा सकता है. इस स्टेट को, यहां दिए गए फ़्लोचार्ट में "ऐंबिएक्टिव मोड" नोड से दिखाया गया है.

AmbientLifecycleObserver का इस्तेमाल करना

ऐंबियंट मोड के इवेंट पर प्रतिक्रिया करने के लिए, AmbientLifecycleObserver क्लास का इस्तेमाल करें:

  1. AmbientLifecycleObserver.AmbientLifecycleCallback इंटरफ़ेस लागू करें. लो-पावर स्टेट के लिए, अपने यूज़र इंटरफ़ेस (यूआई) को अडजस्ट करने के लिए 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.
        }
    }

  2. AmbientLifecycleObserver बनाएं और इसे अपनी गतिविधि या कंपोज़ेबल के लाइफ़साइकल के साथ रजिस्टर करें.

    private val ambientObserver = AmbientLifecycleObserver(activity, ambientCallback)
    
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        lifecycle.addObserver(ambientObserver)
    
        // ...
    }

  3. onDestroy() में, ऑब्ज़र्वर को हटाने के लिए removeObserver() को कॉल करें.

    override fun onDestroy() {
        super.onDestroy()
        lifecycle.removeObserver(ambientObserver)
    
        // ...
    }

Jetpack Compose का इस्तेमाल करने वाले डेवलपर के लिए, Horologist लाइब्रेरी एक काम का यूटिलिटी, AmbientAware कंपोज़ेबल उपलब्ध कराती है. इससे इस पैटर्न को लागू करना आसान हो जाता है .

ऐंबियंट-अवेयर TimeText

कस्टम ऑब्ज़र्वर की ज़रूरत के अपवाद के तौर पर, Wear OS 6 पर TimeText विजेट, ऐंबियंट-अवेयर होता है. जब डिवाइस ऐंबियंट स्टेट में होता है, तो यह हर मिनट में अपने-आप अपडेट हो जाता है. इसके लिए, किसी अतिरिक्त कोड की ज़रूरत नहीं होती.

ऐंबियंट व्यवहार का फ़्लोचार्ट

यहां दिए गए फ़्लोचार्ट से पता चलता है कि डिवाइस के Wear OS वर्शन, आपके ऐप्लिकेशन के targetSdkVersion, और AmbientLifecycleCallback को लागू करने या न करने के आधार पर, सिस्टम ऐंबियंट व्यवहार कैसे तय करता है.

Wear OS के ऐंबियंट मोड के लिए, फ़ैसले लेने के लॉजिक को दिखाने वाला फ़्लोचार्ट. इसमें दिखाया गया है कि डिवाइस के ओएस वर्शन और ऐप्लिकेशन के कॉन्फ़िगरेशन से, तीन में से कोई एक नतीजा कैसे तय होता है: धुंधली ओवरले, ग्लोबल एओडी या ऐप्लिकेशन के ज़रिए मैनेज किया जाने वाला ऐंबियाक्टिव मोड.
इमेज 1.: Wear OS के ऐंबियंट मोड के लिए, फ़ैसले लेने की प्रोसेस को दिखाने वाला फ़्लोचार्ट.

स्क्रीन पर कॉन्टेंट दिखने की अवधि को कंट्रोल करना

यहां दिए गए सेक्शन में, यह मैनेज करने का तरीका बताया गया है कि आपका ऐप्लिकेशन स्क्रीन पर कितनी देर तक दिखता है.

चालू गतिविधि या लाइव अपडेट के साथ, वॉच फ़ेस पर वापस आने से रोकना

ऐंबियंट स्टेट में कुछ समय (टाइमआउट #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 से बचने के लिए. ऐसा करने के लिए, FLAG_KEEP_SCREEN_ON विंडो फ़्लैग का इस्तेमाल किया जा सकता है. यह वेक लॉक की तरह काम करता है. इससे डिवाइस इंटरैक्टिव स्टेट में रहता है. इसका इस्तेमाल बहुत सावधानी से करें, क्योंकि इससे बैटरी लाइफ़ पर काफ़ी असर पड़ता है.

ऐंबियंट मोड के लिए सुझाव

ऐंबियंट मोड में लोगों को बेहतर अनुभव देने और पावर बचाने के लिए, डिज़ाइन से जुड़े इन दिशा-निर्देशों का पालन करें. इन सुझावों में, लोगों को बेहतर अनुभव देने पर ज़ोर दिया गया है. इसके लिए, गुमराह करने वाली जानकारी को रोका जाता है और विज़ुअल क्लटर को कम किया जाता है. साथ ही, डिसप्ले पावर को ऑप्टिमाइज़ किया जाता है.

  • विज़ुअल क्लटर और डिसप्ले पावर कम करें. साफ़ और कम एलिमेंट वाला यूज़र इंटरफ़ेस (यूआई), उपयोगकर्ता को यह बताता है कि ऐप्लिकेशन लो-पावर स्टेट में है. साथ ही, रोशनी वाले पिक्सल को सीमित करके, बैटरी को काफ़ी हद तक बचाया जा सकता है.
    • स्क्रीन का कम से कम 85% हिस्सा काला रखें.
    • सिर्फ़ सबसे ज़रूरी जानकारी दिखाएं. साथ ही, सेकंडरी जानकारी को इंटरैक्टिव डिसप्ले पर ले जाएं.
    • बड़े आइकॉन या बटन के लिए, सॉलिड फ़िल के बजाय आउटलाइन का इस्तेमाल करें.
    • सॉलिड कलर के बड़े ब्लॉक और काम न करने वाली ब्रैंडिंग या बैकग्राउंड इमेज का इस्तेमाल न करें.
  • पुराने हो चुके डाइनैमिक डेटा को हैंडल करना
    • पावर बचाने के लिए, onUpdateAmbient() कॉलबैक को समय-समय पर ही शुरू किया जाता है. आम तौर पर, यह हर मिनट में एक बार शुरू होता है. इस सीमा की वजह से, ऐसा कोई भी डेटा जो बार-बार बदलता है -- जैसे कि स्टॉपवॉच, धड़कन की दर या कसरत की दूरी -- अपडेट के बीच पुराना हो जाता है. गुमराह करने वाली और गलत जानकारी दिखाने से बचने के लिए, onEnterAmbient कॉलबैक को सुनें. साथ ही, इन लाइव वैल्यू को स्टैटिक प्लेसहोल्डर कॉन्टेंट से बदलें. जैसे, --.
  • एक जैसा लेआउट बनाए रखना
    • स्मूद ट्रांज़िशन बनाने के लिए, इंटरैक्टिव और ऐंबियंट , दोनों मोड में एलिमेंट को एक ही जगह पर रखें.
    • हमेशा समय दिखाएं.
  • कॉन्टेक्स्ट के हिसाब से जानकारी दिखाना
    • अगर डिवाइस ऐंबियंट मोड में जाने के दौरान, उपयोगकर्ता सेटिंग या कॉन्फ़िगरेशन स्क्रीन पर था, तो सेटिंग व्यू के बजाय, अपने ऐप्लिकेशन से ज़्यादा काम की स्क्रीन दिखाने पर विचार करें.
  • डिवाइस के हिसाब से ज़रूरी शर्तों को पूरा करना
    • AmbientDetails ऑब्जेक्ट में जिसे onEnterAmbient() को पास किया गया है:
      • अगर deviceHasLowBitAmbient की वैल्यू true है, तो जहां भी हो सके, एंटी-एलियासिंग की सुविधा बंद करें.
      • अगर burnInProtectionRequired की वैल्यू 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

उदाहरण: कसरत करने वाला ऐप्लिकेशन

मान लें कि कसरत करने वाले किसी ऐप्लिकेशन को, उपयोगकर्ता के कसरत सेशन की पूरी अवधि के दौरान, मेट्रिक दिखानी हैं. ऐप्लिकेशन को ऐंबियंट स्टेट ट्रांज़िशन के दौरान भी दिखते रहना चाहिए. साथ ही, वॉच फ़ेस से इसे बदला नहीं जाना चाहिए.

ऐसा करने के लिए, डेवलपर को यह काम करना चाहिए:

  1. इंटरैक्टिव और ऐंबियंट स्टेट के बीच, यूज़र इंटरफ़ेस (यूआई) में होने वाले बदलावों को हैंडल करने के लिए, AmbientLifecycleObserver लागू करें. जैसे, स्क्रीन की रोशनी कम करना और गैर-ज़रूरी डेटा हटाना.
  2. ऐंबियंट स्टेट के लिए, कम पावर वाला नया लेआउट बनाएं. यह लेआउट, सबसे सही तरीकों के मुताबिक होना चाहिए.
  3. कसरत की अवधि के दौरान, चालू गतिविधि एपीआई (या Wear OS 7 और इसके बाद के वर्शन पर लाइव अपडेट) का इस्तेमाल करें, ताकि सिस्टम वॉच फ़ेस पर वापस न जाए.

पूरी जानकारी के लिए, GitHub पर कंपोज़ पर आधारित कसरत का सैंपल देखें. इस सैंपल में, Compose में ऐंबियंट मोड को आसानी से हैंडल करने के लिए, Horologist लाइब्रेरी से AmbientAware कंपोज़ेबल के इस्तेमाल के बारे में भी बताया गया है.