जारी गतिविधियां दिखाना

Wear OS डिवाइसों का इस्तेमाल अक्सर लंबे समय तक चलने वाली गतिविधियों के लिए किया जाता है. जैसे, कसरत को ट्रैक करना. इन गतिविधियों से, उपयोगकर्ताओं को अहम जानकारी भी मिल सकती है. साथ ही, उन्हें इस जानकारी को तुरंत ऐक्सेस करने की ज़रूरत पड़ सकती है.

इससे उपयोगकर्ता अनुभव से जुड़ी एक चुनौती सामने आती है: अगर कोई उपयोगकर्ता कोई टास्क शुरू करता है और फिर वॉच फ़ेस पर चला जाता है, तो भी उसके पास ये काम करने की सुविधा होनी चाहिए:

  • अहम अपडेट पाने की सुविधा जारी रखना.
  • एक टैप में टास्क पर वापस जाने की सुविधा.

लॉन्चर का इस्तेमाल करके ऐप्लिकेशन पर वापस जाना मुश्किल हो सकता है. खास तौर पर, चलते-फिरते ऐसा करना मुश्किल होता है. इससे उपयोगकर्ताओं को परेशानी हो सकती है.

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

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

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

इनके लिए इस्तेमाल किया जा सकता है: ट्रैक की गई कसरत; टाइमर; राइडशेयर को ट्रैक करने की सुविधा चालू होना; लंबी अवधि की वॉइस रिकॉर्डिंग, जैसे कि मीटिंग; और शॉपिंग लिस्ट, जो उपयोगकर्ता के स्टोर में होने के दौरान उपलब्ध होनी चाहिए

इनके लिए इस्तेमाल नहीं किया जा सकता: कम समय के वॉइस मैसेज रिकॉर्ड करना, प्रमोशन, अपडेट हो रहे ऐप्लिकेशन का स्टेटस, और आने वाले कैलेंडर इवेंट.

अहम जानकारी: Wear OS के लिए ऐप्लिकेशन की क्वालिटी से जुड़ी गाइडलाइन WO-V4 के तहत, इन स्थितियों में OngoingActivity या लाइव अपडेट का इस्तेमाल करना ज़रूरी है.

उदाहरण के लिए, कसरत से जुड़े इस ऐप्लिकेशन में, जानकारी उपयोगकर्ता के वॉच फ़ेस पर, दौड़ते हुए दिखने वाले आइकॉन के तौर पर दिख सकती है. इस आइकॉन को टैप किया जा सकता है:

running-icon

पहली इमेज. गतिविधि दिखाने वाला इंडिकेटर.

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

लॉन्चर

दूसरी इमेज. ग्लोबल लॉन्चर.

चालू गतिविधि से जुड़ी चालू सूचना का इस्तेमाल इन स्थितियों में किया जा सकता है:

टाइमर

तीसरी इमेज. टाइमर: यह समय को लगातार काउंट डाउन करता है और टाइमर के रुकने या बंद होने पर खत्म हो जाता है.

मैप

चौथी इमेज. मोड़-दर-मोड़ नेविगेशन: यह किसी जगह पर पहुंचने के लिए निर्देश देता है. जब उपयोगकर्ता अपनी जगह पर पहुंच जाता है या नेविगेशन बंद कर देता है, तो यह बंद हो जाता है.

संगीत

पांचवीं इमेज. मीडिया: यह किसी सेशन के दौरान संगीत चलाता है. जब उपयोगकर्ता सेशन को रोकता है, तो यह तुरंत बंद हो जाता है.

Wear, मीडिया ऐप्लिकेशन के लिए चालू गतिविधियां अपने-आप बनाता है.

अन्य तरह के ऐप्लिकेशन के लिए चालू गतिविधियां बनाने का विस्तृत उदाहरण देखने के लिए, चालू गतिविधि का कोडलैब देखें.

सेटअप

अपने ऐप्लिकेशन में चालू गतिविधि के एपीआई का इस्तेमाल करने के लिए, अपने ऐप्लिकेशन की build.gradle फ़ाइल में ये डिपेंडेंसी जोड़ें:

dependencies {
  implementation "androidx.wear:wear-ongoing:1.1.0"
  implementation "androidx.core:core:1.19.0"
}

चालू गतिविधि बनाना

इसमें तीन चरण शामिल हैं:

  1. एक स्टैंडर्ड NotificationCompat.Builder बनाएं और इसे चालू के तौर पर कॉन्फ़िगर करें.
  2. OngoingActivity ऑब्जेक्ट बनाएं और उसे कॉन्फ़िगर करें. साथ ही, इसमें सूचना बनाने वाले टूल को पास करें.
  3. सूचना बनाने वाले टूल पर चालू गतिविधि लागू करें और सूचना पोस्ट करें.

सूचना बनाना और उसे कॉन्फ़िगर करना

सबसे पहले, NotificationCompat.Builder बनाएं. इसे बैकग्राउंड में जारी गतिविधि की सूचना के तौर पर मार्क करने के लिए, setOngoing(true) को कॉल करना ज़रूरी है. इस चरण में, सूचना की अन्य प्रॉपर्टी भी सेट की जा सकती हैं. जैसे, छोटा आइकॉन और कैटगरी.

// Create a PendingIntent to pass to the notification builder
val pendingIntent =
    PendingIntent.getActivity(
        this,
        0,
        Intent(this, AlwaysOnActivity::class.java).apply {
            flags = Intent.FLAG_ACTIVITY_SINGLE_TOP
        },
        PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE,
    )

val notificationBuilder = NotificationCompat.Builder(this, CHANNEL_ID)
    .setContentTitle("Always On Service")
    .setContentText("Service is running in background")
    .setSmallIcon(R.drawable.animated_walk)
    // Category helps the system prioritize the ongoing activity
    .setCategory(NotificationCompat.CATEGORY_WORKOUT)
    .setContentIntent(pendingIntent)
    .setVisibility(NotificationCompat.VISIBILITY_PUBLIC)
    .setOngoing(true) // Important!

चालू गतिविधि बनाना

इसके बाद, चालू गतिविधि के टूल का इस्तेमाल करके, OngoingActivity का इंस्टेंस बनाएं. OngoingActivity.Builder के लिए, Context, सूचना आईडी, और पिछले चरण में बनाया गया NotificationCompat.Builder ज़रूरी है.

नई यूज़र इंटरफ़ेस (यूआई) वाली सतहों पर दिखने वाली मुख्य प्रॉपर्टी कॉन्फ़िगर करें:

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

val ongoingActivity =
    OngoingActivity.Builder(applicationContext, NOTIFICATION_ID, notificationBuilder)
        // Sets the icon that appears on the watch face in active mode.
        .setAnimatedIcon(R.drawable.animated_walk)
        // Sets the icon that appears on the watch face in ambient mode.
        .setStaticIcon(R.drawable.ic_walk)
        // Sets the tap target to bring the user back to the app.
        .setTouchIntent(pendingIntent)
        .build()

सूचना पर लागू करना और पोस्ट करना

आखिरी चरण में, OngoingActivity को सूचना से लिंक करें और फिर उसे पोस्ट करें. The ongoingActivity.apply() तरीका, सूचना बनाने वाले मूल टूल में बदलाव करता है. साथ ही, ज़रूरी डेटा जोड़ता है, ताकि सिस्टम इसे अन्य सतहों पर दिखा सके. इसे लागू करने के बाद, सूचना को सामान्य तरीके से बनाया और पोस्ट किया जा सकता है.

// This call modifies notificationBuilder to include the ongoing activity data.
ongoingActivity.apply(applicationContext)

// Post the notification.
startForeground(NOTIFICATION_ID, notificationBuilder.build())

लॉन्चर में, स्टेटस का डाइनैमिक टेक्स्ट जोड़ना

ऊपर दिए गए कोड से, वॉच फ़ेस पर टैप किया जा सकने वाला आइकॉन जुड़ जाता है. लॉन्चर के हाल ही में इस्तेमाल किए गए सेक्शन में, रीयल-टाइम अपडेट देने के लिए, Status ऑब्जेक्ट बनाएं और इसे अपने OngoingActivity से जोड़ें. अगर आपने कोई कस्टम Status नहीं दिया है, तो सिस्टम डिफ़ॉल्ट रूप से सूचना के कॉन्टेंट टेक्स्ट (जिसे setContentText() का इस्तेमाल करके सेट किया गया है) का इस्तेमाल करता है. डाइनैमिक टेक्स्ट दिखाने के लिए, Status.Builder का इस्तेमाल करें. प्लेसहोल्डर के साथ टेंप्लेट स्ट्रिंग तय की जा सकती है. साथ ही, उन प्लेसहोल्डर को भरने के लिए, Status.Part ऑब्जेक्ट दिए जा सकते हैं. Status.Part डाइनैमिक हो सकता है. जैसे, स्टॉपवॉच या टाइमर.

यहां दिए गए उदाहरण में, ऐसा स्टेटस बनाने का तरीका बताया गया है जो "Run for [a stopwatch timer]" दिखाता है:

// Define a template with placeholders for the activity type and the timer.
val statusTemplate = "#type# for #time#"

// Set the start time for a stopwatch.
// Use SystemClock.elapsedRealtime() for time-based parts.
val runStartTime = SystemClock.elapsedRealtime()

val ongoingActivityStatus = Status.Builder()
    // Sets the template string.
    .addTemplate(statusTemplate)
    // Fills the #type# placeholder with a static text part.
    .addPart("type", Status.TextPart("Run"))
    // Fills the #time# placeholder with a stopwatch part.
    .addPart("time", Status.StopwatchPart(runStartTime))
    .build()

आखिर में, इस Status को अपने OngoingActivity से लिंक करें. इसके लिए, OngoingActivity.Builder पर setStatus() को कॉल करें.

val ongoingActivity =
    OngoingActivity.Builder(applicationContext, NOTIFICATION_ID, notificationBuilder)
        // ...
        // Add the status to the OngoingActivity.
        .setStatus(ongoingActivityStatus)
        .build()

अन्य तरीके से पसंद के मुताबिक बनाना

Status के अलावा, चालू गतिविधि या सूचनाओं को इन तरीकों से पसंद के मुताबिक बनाया जा सकता है. हालांकि, ओईएम के लागू करने के तरीके के आधार पर, इन तरीकों से किए गए बदलावों का इस्तेमाल नहीं किया जा सकता.

चालू सूचना

  • सेट की गई कैटगरी से, चालू गतिविधि की प्राथमिकता तय होती है.
    • CATEGORY_CALL: आने वाली वॉइस या वीडियो कॉल या इसी तरह की सिंक्रोनस कम्यूनिकेशन की कोई अन्य अनुरोध
    • CATEGORY_NAVIGATION: मैप या रास्ते के दिशा-निर्देश
    • CATEGORY_TRANSPORT: मीडिया चलाने के लिए, मीडिया ट्रांसपोर्ट कंट्रोल
    • CATEGORY_ALARM: अलार्म या टाइमर
    • CATEGORY_WORKOUT: कसरत
    • CATEGORY_LOCATION_SHARING: जगह की जानकारी शेयर करने की अस्थायी कैटगरी
    • CATEGORY_STOPWATCH: स्टॉपवॉच

चालू गतिविधि

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

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

  • OngoingActivityStatus: सामान्य टेक्स्ट या Chronometer. यह ऐप्लिकेशन लॉन्चर के हाल ही में इस्तेमाल किए गए सेक्शन में दिखता है. अगर यह उपलब्ध नहीं कराया जाता है, तो सूचना का "कॉन्टेक्स्ट टेक्स्ट" इस्तेमाल किया जाता है.

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

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

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

चालू गतिविधि को अपडेट करना

जब आपको स्टेटस में बदलाव करना हो, तो नई सूचना और चालू गतिविधि बनाने के बजाय, मौजूदा सूचना के लिए चालू गतिविधि को अपडेट करें. चालू गतिविधि और पोस्ट की गई सूचना को अपडेट करने के लिए, पहले बनाए गए ऑब्जेक्ट का इस्तेमाल करें और update() को कॉल करें. जैसा कि यहां दिए गए उदाहरण में दिखाया गया है:

ongoingActivity.update(context, newStatus)

जिन मामलों में चालू गतिविधि का रेफ़रंस सेव करना मुमकिन नहीं है, उनमें चालू गतिविधि को वापस पाने के लिए एक स्टैटिक तरीका है. हालांकि, इसे कम प्राथमिकता दी जाती है:

OngoingActivity.recoverOngoingActivity(context)
    ?.update(context, newStatus)

चालू गतिविधि को रोकना

जब ऐप्लिकेशन, चालू गतिविधि के तौर पर चलना बंद कर देता है, तो उसे सिर्फ़ चालू सूचना को रद्द करना होता है.

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

चालू गतिविधि को रोकना

अगर आपके ऐप्लिकेशन में, गतिविधि को रोकने की कोई कार्रवाई साफ़ तौर पर दी गई है, तो उसे फिर से शुरू करने के बाद, चालू गतिविधि को जारी रखें. अगर किसी ऐप्लिकेशन में, गतिविधि को रोकने की कोई कार्रवाई साफ़ तौर पर नहीं दी गई है, तो गतिविधि को रोकने पर उसे खत्म कर दें.

अहम बातें

चालू गतिविधि के एपीआई के साथ काम करते समय, इन बातों का ध्यान रखें:

Wear OS डिवाइसों पर मीडिया चलाने के दौरान, मीडिया सूचनाएं पब्लिश करना

अगर Wear OS डिवाइस पर मीडिया कॉन्टेंट चल रहा है, तो मीडिया सूचना पब्लिश करें. इससे सिस्टम, चालू गतिविधि बना सकता है.

अगर Media3 का इस्तेमाल किया जा रहा है, तो सूचना अपने-आप पब्लिश हो जाती है. अगर सूचना को मैन्युअल तरीके से बनाया जाता है, तो उसमें MediaStyleNotificationHelper.MediaStyle का इस्तेमाल किया जाना चाहिए. साथ ही, उससे जुड़े MediaSession में, सेशन की गतिविधि की जानकारी होनी चाहिए.