चल रही गतिविधि

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

जारी सूचनाओं का इस्तेमाल आम तौर पर यह बताने के लिए किया जाता है कि किसी सूचना में बैकग्राउंड में चलने वाला टास्क, जिसमें उपयोगकर्ता सक्रिय रूप से काम कर रहा है या किसी वजह से उसे मंज़ूरी मिलना बाकी है और इस वजह से डिवाइस में घुल-मिल गया.

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

हालांकि, सूचना देखने के लिए उपयोगकर्ता को सूचना ट्रे दिख रही है और सही सूचना दिख रही है. यह अन्य प्लैटफ़ॉर्म जितना आसान नहीं है.

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

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

दौड़ने-का-आइकॉन

पहला डायग्राम. गतिविधि दिखाने वाला संकेत.

ग्लोबल ऐप्लिकेशन लॉन्चर के हाल ही के सेक्शन में, मौजूदा गतिविधियां:

लॉन्चर

दूसरा डायग्राम. ग्लोबल लॉन्चर.

किसी मौजूदा सूचना का इस्तेमाल करने के लिए, ये अच्छी स्थितियां हैं चल रही गतिविधि:

टाइमर

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

मैप

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

संगीत वाले गेम

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

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

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

सेटअप

अपने ऐप्लिकेशन में Ongoing Activity API का इस्तेमाल शुरू करने के लिए, ये चीज़ें जोड़ें ये आपके ऐप्लिकेशन की build.gradle फ़ाइल पर निर्भर करती हैं:

dependencies {
  implementation "androidx.wear:wear-ongoing:1.0.0"
  // Includes LocusIdCompat and new Notification categories for Ongoing Activity.
  implementation "androidx.core:core:1.6.0"
}

कोई जारी गतिविधि शुरू करें

एक जारी सूचना और फिर एक जारी गतिविधि बनाकर शुरू करें.

एक जारी सूचना बनाएं

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

आपको चल रही किसी गतिविधि को किसी चल रही सूचना के साथ जोड़ना होगा. अपनी चल रही गतिविधि को सूचना से लिंक करने के कई फ़ायदे हैं, इसमें ये शामिल हैं:

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

इसका उपयोग करके एक जारी सूचना बनाएं Notifications.Builder.setOngoing.

कोई जारी गतिविधि शुरू करें

एक जारी सूचना मिलने के बाद, चल रही गतिविधि को दिखाए गए तरीके से बनाएं यहां दिए गए सैंपल में. हर प्रॉपर्टी के व्यवहार को समझने के लिए, शामिल की गई टिप्पणियां देखें.

Kotlin

var notificationBuilder = NotificationCompat.Builder(this, CHANNEL_ID)
      
      .setSmallIcon(..)
      .setOngoing(true)

val ongoingActivityStatus = Status.Builder()
    // Sets the text used across various surfaces.
    .addTemplate(mainText)
    .build()

val ongoingActivity =
    OngoingActivity.Builder(
        applicationContext, NOTIFICATION_ID, notificationBuilder
    )
        // Sets the animated icon that will appear on the watch face in
        // active mode.
        // If it isn't set, the watch face will use the static icon in
        // active mode.
        .setAnimatedIcon(R.drawable.ic_walk)
        // Sets the icon that will appear on the watch face in ambient mode.
        // Falls back to Notification's smallIcon if not set.
        // If neither is set, an Exception is thrown.
        .setStaticIcon(R.drawable.ic_walk)
        // Sets the tap/touch event so users can re-enter your app from the
        // other surfaces.
        // Falls back to Notification's contentIntent if not set.
        // If neither is set, an Exception is thrown.
        .setTouchIntent(activityPendingIntent)
        // Here, sets the text used for the Ongoing Activity (more
        // options are available for timers and stopwatches).
        .setStatus(ongoingActivityStatus)
        .build()

ongoingActivity.apply(applicationContext)

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

Java

NotificationCompat.Builder notificationBuilder = NotificationCompat.Builder(this, CHANNEL_ID)
      
      .setSmallIcon(..)
      .setOngoing(true);

OngoingActivityStatus ongoingActivityStatus = OngoingActivityStatus.Builder()
    // Sets the text used across various surfaces.
    .addTemplate(mainText)
    .build();

OngoingActivity ongoingActivity =
    OngoingActivity.Builder(
        applicationContext, NOTIFICATION_ID, notificationBuilder
    )
        // Sets the animated icon that will appear on the watch face in
        // active mode.
        // If it isn't set, the watch face will use the static icon in
        // active mode.
        .setAnimatedIcon(R.drawable.ic_walk)
        // Sets the icon that will appear on the watch face in ambient mode.
        // Falls back to Notification's smallIcon if not set.
        // If neither is set, an Exception is thrown.
        .setStaticIcon(R.drawable.ic_walk)
        // Sets the tap/touch event so users can re-enter your app from the
        // other surfaces.
        // Falls back to Notification's contentIntent if not set.
        // If neither is set, an Exception is thrown.
        .setTouchIntent(activityPendingIntent)
        // Here, sets the text used for the Ongoing Activity (more
        // options are available for timers and stopwatches).
        .setStatus(ongoingActivityStatus)
        .build();

ongoingActivity.apply(applicationContext);

notificationManager.notify(NOTIFICATION_ID, builder.build());

इन चरणों में, पिछले उदाहरण का सबसे अहम हिस्सा बताया गया है:

  1. इस नंबर पर .setOngoing(true) को कॉल करें NotificationCompat.Builder और कोई भी वैकल्पिक सेट करें फ़ील्ड.

  2. OngoingActivityStatus या स्थिति का कोई दूसरा विकल्प बनाएं, जैसे कि नीचे दिए गए सेक्शन में बताया गया है—ताकि टेक्स्ट को दिखाया जा सके.

  3. OngoingActivity बनाएं और सूचना आईडी सेट करें.

  4. OngoingActivity पर संदर्भ के साथ apply() को कॉल करें.

  5. notificationManager.notify() पर कॉल करें और उसी सूचना में पास करें वह आईडी जिसे मौजूदा गतिविधि में सेट किया गया है, ताकि वे आपस में जुड़ सकें.

स्थिति

आपने Status का इस्तेमाल किया हो की मौजूदा, लाइव स्थिति को सामने लाने के लिए उपयोगकर्ता को नए प्लैटफ़ॉर्म पर OngoingActivity दिखाएं, जैसे कि हाल ही के सेक्शन पर क्लिक करें. इस सुविधा का इस्तेमाल करने के लिए, Status.Builder सब-क्लास.

ज़्यादातर मामलों में, आपको सिर्फ़ टेंप्लेट जोड़ना जो उस टेक्स्ट के बारे में बताती है जिसे आपको ऐप्लिकेशन लॉन्चर के हाल ही के सेक्शन में देखना है.

इसके बाद, आपके पास यह चुनने का विकल्प होगा कि टेक्स्ट कैसा दिखे spans को addTemplate() तरीके का इस्तेमाल करके और टेक्स्ट के किसी भी डाइनैमिक हिस्से को Status.Part.

नीचे दिए गए उदाहरण में, "समय" शब्द बनाने का तरीका बताया गया है लाल रंग में दिखेगा. कॉन्टेंट बनाने उदाहरण में Status.StopwatchPart का इस्तेमाल करके, ऐप्लिकेशन लॉन्चर के हाल ही के सेक्शन में स्टॉपवॉच को दिखाया जा सकता है.

Kotlin

val htmlStatus =
        "<p>The <font color=\"red\">time</font> on your current #type# is #time#.</p>"

val statusTemplate =
        Html.fromHtml(
                htmlStatus,
                Html.FROM_HTML_MODE_COMPACT
        )

// Creates a 5 minute timer.
// Note the use of SystemClock.elapsedRealtime(), not System.currentTimeMillis().
val runStartTime = SystemClock.elapsedRealtime() + TimeUnit.MINUTES.toMillis(5)

val status = new Status.Builder()
   .addTemplate(statusTemplate)
   .addPart("type", Status.TextPart("run"))
   .addPart("time", Status.StopwatchPart(runStartTime)
   .build()

Java

String htmlStatus =
        "<p>The <font color=\"red\">time</font> on your current #type# is #time#.</p>";

Spanned statusTemplate =
        Html.fromHtml(
                htmlStatus,
                Html.FROM_HTML_MODE_COMPACT
        );

// Creates a 5 minute timer.
// Note the use of SystemClock.elapsedRealtime(), not System.currentTimeMillis().
Long runStartTime = SystemClock.elapsedRealtime() + TimeUnit.MINUTES.toMillis(5);

Status status = new Status.Builder()
   .addTemplate(statusTemplate)
   .addPart("type", new Status.TextPart("run"))
   .addPart("time", new Status.StopwatchPart(runStartTime)
   .build();

टेंप्लेट से किसी हिस्से का रेफ़रंस देने के लिए, # के चारों ओर मौजूद नाम का इस्तेमाल करें. आउटपुट में # बनाने के लिए, टेंप्लेट में ## का इस्तेमाल करें.

पिछले उदाहरण में, HTMLCompat ताकि टेंप्लेट को पास करने के लिए, CharSequence जनरेट किया जा सके. यह इससे आसान है Spannable ऑब्जेक्ट को मैन्युअल तरीके से परिभाषित करती है.

अन्य कस्टमाइज़ेशन

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

पहले से चल रही सूचना

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

चल रही गतिविधि

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

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

  • OngoingActivityStatus: सादा टेक्स्ट या Chronometer. इसमें डिसप्ले ऐप्लिकेशन लॉन्चर का हाल ही के सेक्शन. अगर उपयोगकर्ता ने कोई सूचना नहीं दी है, तो “संदर्भ टेक्स्ट” का इस्तेमाल किया जाता है.

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

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

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

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

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

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

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

Kotlin

ongoingActivity.update(context, newStatus)

Java

ongoingActivity.update(context, newStatus);

आसानी के लिए, जारी गतिविधि बनाने के लिए एक स्टैटिक तरीका दिया गया है.

Kotlin

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

Java

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

चल रही किसी गतिविधि को रोकना

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

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

चल रही किसी गतिविधि को रोकना

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

सबसे सही तरीके

जारी ऐक्टिविटी एपीआई के साथ काम करते समय ये बातें याद रखें:

  • कॉल करने से पहले ongoingActivity.apply(context) पर कॉल करें notificationManager.notify(...).
  • अपनी जारी गतिविधि के लिए या तो एक स्टैटिक आइकॉन सेट करें साफ़ तौर पर या फ़ॉलबैक के तौर पर, सूचना. अगर फ़ोन नहीं है, तो आपको IllegalArgumentException मिलेगा.

  • पारदर्शी बैकग्राउंड वाले काले और सफ़ेद वेक्टर आइकॉन का इस्तेमाल करें.

  • अपनी मौजूदा गतिविधि के लिए टच इंटेंट सेट करें साफ़ तौर पर या फ़ॉलबैक के तौर पर, सूचना. अगर फ़ोन नहीं है, तो आपको IllegalArgumentException मिलेगा.

  • NotificationCompat के लिए Core AndroidX लाइब्रेरी का इस्तेमाल करें core:1.5.0-alpha05+, जिसमें LocusIdCompat और नया कैटगरी के हिसाब से दिखाया जाता है. और जगह की जानकारी शेयर करने की सुविधा मिलती है.

  • अगर आपके ऐप्लिकेशन में एक से ज़्यादा MAIN LAUNCHER गतिविधियों का एलान किया गया है मेनिफ़ेस्ट फ़ाइल में, डाइनैमिक शॉर्टकट और LocusId का इस्तेमाल करके, इसे अपनी मौजूदा गतिविधि से जोड़ें.

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

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

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