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

कीवर्ड: wear,ambient,alwayson

जब कोई उपयोगकर्ता स्मार्टवॉच का इस्तेमाल करना बंद कर देता है, तो Wear OS ऐप्लिकेशन को कम बैटरी मोड में अपने-आप ले जाता है. इसे सिस्टम ऐंबियंट मोड कहा जाता है. अगर उपयोगकर्ता किसी तय समयसीमा के अंदर फिर से स्मार्टवॉच से इंटरैक्ट करता है, तो Wear OS उसे उस ऐप्लिकेशन पर वापस ले जाता है जहां वह छोड़कर गया था.

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

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

अपना प्रोजेक्ट कॉन्फ़िगर करना

ऐंबियंट मोड के साथ काम करने के लिए, यह तरीका अपनाएं:

  1. स्मार्टवॉच ऐप्लिकेशन बनाएं और चलाएं पेज पर मौजूद कॉन्फ़िगरेशन के आधार पर, अपना प्रोजेक्ट बनाएं या अपडेट करें.
  2. Android मेनिफ़ेस्ट फ़ाइल में WAKE_LOCK अनुमति जोड़ें:
<uses-permission android:name="android.permission.WAKE_LOCK" />

हमेशा चालू रहने वाला मोड चालू करना

AmbientLifecycleObserver क्लास का इस्तेमाल करने के लिए, यह तरीका अपनाएं:

  1. AmbientLifecycleObserver.AmbientLifecycleCallback इंटरफ़ेस को लागू करें, जैसा कि इस उदाहरण में दिखाया गया है. इस चरण में, तरीके खाली होते हैं. हालांकि, गाइड में बाद में बताया गया है कि ऐंबियंट मोड में जाने और उससे बाहर निकलने के लिए, आपको विज़ुअलाइज़ेशन में कौनसे बदलाव करने चाहिए.

    Kotlin

    val ambientCallback = object : AmbientLifecycleObserver.AmbientLifecycleCallback {
        override fun onEnterAmbient(ambientDetails: AmbientLifecycleObserver.AmbientDetails) {
        // ... Called when moving from interactive mode into ambient mode.
        }
    
        override fun onExitAmbient() {
        // ... Called when leaving ambient mode, back into interactive mode.
        }
    
        override fun onUpdateAmbient() {
        // ... Called by the system in order to allow the app to periodically
        // update the display while in ambient mode. Typically the system will
        // call this every 60 seconds.
        }
    }
  2. AmbientLifecycleObserver बनाएं और ऑब्ज़र्वर को रजिस्टर करें. आम तौर पर, इसका इस्तेमाल onCreate() या टॉप-लेवल कॉम्पोज़ेबल में किया जाता है. ऐसा तब किया जाता है, जब Wear OS के लिए Compose का इस्तेमाल किया जा रहा हो. इससे गतिविधि के पूरे लाइफ़साइकल के दौरान, हमेशा चालू रहने की सुविधा चालू रहती है.

    Kotlin

    private val ambientObserver = AmbientLifecycleObserver(activity, callback)
    
    override fun onCreate(savedInstanceState: Bundle) {
      super.onCreate(savedInstanceState)
      lifecycle.addObserver(observer)
    
      // ...
    }
  3. जब हमेशा चालू रहने की सुविधा की ज़रूरत न हो, तो removeObserver() को कॉल करके ऑब्ज़र्वर हटाएं. उदाहरण के लिए, इस तरीके को अपनी गतिविधि के onDestroy() तरीके में कॉल किया जा सकता है.

हमेशा चालू रहने वाले ऐप्लिकेशन, बैकग्राउंड में चल सकते हैं

Wear OS 5 में, सिस्टम हमेशा चालू रहने वाले ऐप्लिकेशन को बैकग्राउंड में ले जाता है. ऐसा तब होता है, जब वे ऐप्लिकेशन कुछ समय तक ऐंबियंट मोड में दिखते हैं. उपयोगकर्ता, सिस्टम सेटिंग में जाकर टाइम आउट को कॉन्फ़िगर कर सकते हैं.

अगर आपका हमेशा चालू रहने वाला ऐप्लिकेशन, उपयोगकर्ता के किसी मौजूदा टास्क की जानकारी दिखाता है, जैसे कि संगीत चलाना या कसरत का सेशन, तो हो सकता है कि आप टास्क पूरा होने तक, मौजूदा गतिविधि को दिखता रखना चाहें. ऐसा करने के लिए, ऑनgoing Activity API का इस्तेमाल करके, हमेशा चालू रहने वाली गतिविधि से जुड़ी सूचना पोस्ट करें.

सिस्टम को चल रही गतिविधि की पहचान करने के लिए, चल रही सूचना के टच इंटेंट को हमेशा चालू रहने वाली गतिविधि पर ले जाना चाहिए, जैसा कि यहां दिए गए कोड स्निपेट में दिखाया गया है:

// Create a pending intent that point to your always-on activity
val touchIntent =
    PendingIntent.getActivity(
        context,
        0,
        Intent(context, MyAlwaysOnActivity::class.java),
        PendingIntent.FLAG_MUTABLE or PendingIntent.FLAG_UPDATE_CURRENT
    )

val notificationBuilder =
    NotificationCompat.Builder(this, CHANNEL_ID)
    // ...
    .setOngoing(true)

val ongoingActivity =
    OngoingActivity.Builder(
        applicationContext, NOTIFICATION_ID, notificationBuilder
    )
    // ...
    .setTouchIntent(touchIntent)
    .build()

ongoingActivity.apply(applicationContext)

notificationManager.notify(
    NOTIFICATION_ID,
    notificationBuilder.build()
)

एंबियंट मोड में विज़ुअल के दिखने के तरीके में बदलाव करना

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

बैटरी बचाने के लिए, ये काम करें:

  • कम पिक्सल को रोशन करें और स्क्रीन के ज़्यादातर हिस्से को काला छोड़ दें. ऐंबियंट मोड में सिर्फ़ ज़रूरी जानकारी दिखाएं. साथ ही, जब उपयोगकर्ता इंटरैक्टिव मोड में आए, तो ज़्यादा जानकारी दें.
  • कम बार अपडेट किए जाने वाले कॉन्टेंट में बदलाव करें. उदाहरण के लिए, टाइमर को सेकंड के बजाय, मिनट के हिसाब से दिखाना.
  • AmbientDetails onEnterAmbient() को पास किए गए ऑब्जेक्ट में:
    • अगर deviceHasLowBitAmbient सेट है, तो जहां भी हो सके वहां ऐंटी-ऐलिऐसिंग बंद करें.
    • अगर burnInProtectionRequired सेट है, तो समय-समय पर विज़ुअलाइज़ेशन को एक जगह से दूसरी जगह पर ले जाएं और पूरी तरह से सफ़ेद जगहों से बचें.

Wear OS के लिए Compose का इस्तेमाल करते समय, हमारा सुझाव है कि आप स्टेटस अपडेट करने के लिए, इन कॉलबैक तरीकों का इस्तेमाल करें. इससे सिस्टम आपके यूज़र इंटरफ़ेस को सही तरीके से फिर से कॉम्पोज़ कर पाएगा.

यह कैसे किया जा सकता है, इसका उदाहरण देखने के लिए GitHub पर, Compose पर आधारित ऐप्लिकेशन का सैंपल देखें. इसमें Horologist लाइब्रेरी के AmbientAware composable का इस्तेमाल किया गया है.