टाइल में समय-समय पर होने वाले अपडेट दिखाएं

समय के साथ बदलने वाले कॉन्टेंट से टाइल बनाएं.

टाइमलाइन के साथ काम करना

समयावधि में एक या उससे ज़्यादा चीज़ें होती हैं TimelineEntry जिनमें से हर एक में एक खास लेआउट समय अंतराल. सभी टाइल के लिए एक टाइमलाइन की ज़रूरत है.

टाइल टाइमलाइन का डायग्राम

एक एंट्री वाली टाइल

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

एक TimelineEntry वाली टाइल का यह उदाहरण देखें:

Kotlin

override fun onTileRequest(
    requestParams: TileRequest
): ListenableFuture<Tile> {
    val tile = Tile.Builder()
        .setResourcesVersion(RESOURCES_VERSION)

        // We add a single timeline entry when our layout is fixed, and
        // we don't know in advance when its contents might change.
        .setTileTimeline(
            Timeline.fromLayoutElement(...)
        ).build()
    return Futures.immediateFuture(tile)
}

Java

@Override
protected ListenableFuture<Tile> onTileRequest(
       @NonNull TileRequest requestParams
) {
   Tile tile = new Tile.Builder()
       .setResourcesVersion(RESOURCES_VERSION)
       
       // We add a single timeline entry when our layout is fixed, and
       // we don't know in advance when its contents might change.
       .setTileTimeline(
            Timeline.fromLayoutElement(...)
       ).build();
   return Futures.immediateFuture(tile);
}

टाइमबाउंड टाइमलाइन एंट्री

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

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

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

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

Kotlin

public override fun onTileRequest(
    requestParams: TileRequest
): ListenableFuture<Tile> {
    val timeline = Timeline.Builder()

    // Add fallback "no meetings" entry
    // Use the version of TimelineEntry that's in androidx.wear.protolayout.
    timeline.addTimelineEntry(TimelineEntry.Builder()
        .setLayout(getNoMeetingsLayout())
        .build()
    )

    // Retrieve a list of scheduled meetings
    val meetings = MeetingsRepo.getMeetings()
    // Add a timeline entry for each meeting
    meetings.forEach { meeting ->
        timeline.addTimelineEntry(TimelineEntry.Builder()
            .setLayout(getMeetingLayout(meeting))
            .setValidity(
                // The tile should disappear when the meeting begins
                // Use the version of TimeInterval that's in
                // androidx.wear.protolayout.
                TimeInterval.Builder()
                    .setEndMillis(meeting.dateTimeMillis).build()
            ).build()
        )
    }

    val tile = Tile.Builder()
        .setResourcesVersion(RESOURCES_VERSION)
        .setTileTimeline(timeline.build())
        .build()
    return Futures.immediateFuture(tile)
}

Java

@Override
protected ListenableFuture<Tile> onTileRequest(
       @NonNull RequestBuilders.TileRequest requestParams
) {
   Timeline.Builder timeline = new Timeline.Builder();
   // Add fallback "no meetings" entry
   // Use the version of TimelineEntry that's in androidx.wear.protolayout.
   timeline.addTimelineEntry(new TimelineEntry.Builder().setLayout(getNoMeetingsLayout()).build());
   // Retrieve a list of scheduled meetings
   List<Meeting> meetings = MeetingsRepo.getMeetings();
   // Add a timeline entry for each meeting
   for(Meeting meeting : meetings) {
        timeline.addTimelineEntry(new TimelineEntry.Builder()
            .setLayout(getMeetingLayout(meeting))
            .setValidity(
                // The tile should disappear when the meeting begins
                // Use the version of TimeInterval that's in
                // androidx.wear.protolayout.
                new TimeInterval.builder()
                    .setEndMillis(meeting.getDateTimeMillis()).build()
            ).build()
        );
    }

    Tile tile = new Tile.Builder()
        .setResourcesVersion(RESOURCES_VERSION)
        .setTileTimeline(timeline.build())
        .build();
    return Futures.immediateFuture(tile);
}

टाइल को रीफ़्रेश करना

किसी टाइल पर दिखाई गई जानकारी कुछ समय बाद दिख सकती है. उदाहरण के लिए, मौसम पूरे दिन में एक जैसा तापमान दिखाने वाली टाइल सटीक नहीं होती.

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

Kotlin

override fun onTileRequest(requestParams: RequestBuilders.TileRequest) =
    Futures.immediateFuture(Tile.Builder()
        .setResourcesVersion(RESOURCES_VERSION)
        .setFreshnessIntervalMillis(60 * 60 * 1000) // 60 minutes
        .setTileTimeline(Timeline.fromLayoutElement(
            getWeatherLayout())
        ).build()
    )

Java

@Override
protected ListenableFuture<Tile> onTileRequest(
       @NonNull TileRequest requestParams
) {
    return Futures.immediateFuture(new Tile.Builder()
        .setResourcesVersion(RESOURCES_VERSION)
        .setFreshnessIntervalMillis(60 * 60 * 1000) // 60 minutes
        .setTimeline(Timeline.fromLayoutElement(
            getWeatherLayout())
        ).build());
}

जब अपडेट करने का इंटरवल सेट किया जाता है, तो सिस्टम onTileRequest() इंटरवल खत्म होने के तुरंत बाद. यदि आप ताज़गी का अंतराल सेट नहीं करते, तो सिस्टम onTileRequest() को कॉल नहीं करता.

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

Kotlin

fun eventDeletedCallback() {
     TileService.getUpdater(context)
             .requestUpdate(MyTileService::class.java)
}

Java

public void eventDeletedCallback() {
   TileService.getUpdater(context)
           .requestUpdate(MyTileService.class);
}

कोई अपडेट वर्कफ़्लो चुनें

अपने टाइल अपडेट कॉन्फ़िगर करने का तरीका तय करने के लिए, इन सबसे सही तरीकों का इस्तेमाल करें:

  • अगर अपडेट का अनुमान लगाया जा सकता है, तो उदाहरण के लिए, अगर अपडेट का स्टेटस अगले इवेंट के लिए है, तो उपयोगकर्ता का कैलेंडर—टाइमलाइन का उपयोग करें.
  • प्लैटफ़ॉर्म डेटा फ़ेच करते समय, डेटा बाइंडिंग का इस्तेमाल करें, ताकि सिस्टम अपडेट हो सके डेटा को अपने आप इकट्ठा करना होगा.
  • अगर उपयोगकर्ता, डिवाइस पर थोड़े समय में ही अपडेट का हिसाब लगा सकता है, तो जैसे कि सूर्योदय टाइल पर किसी चित्र की स्थिति अपडेट करना— onTileRequest().

    यह खास तौर पर तब काम आता है, जब आपको पहले से ही सभी इमेज जनरेट करने की ज़रूरत हो समय. अगर आपको आने वाले समय में नई इमेज जनरेट करनी है, तो इस नंबर पर कॉल करें setFreshnessIntervalMillis().

  • अगर बैकग्राउंड में बार-बार बहुत ज़्यादा गहन काम किया जा रहा है, जैसे कि पोल मौसम की जानकारी देखने के लिए, WorkManager का इस्तेमाल करें और अपनी टाइल पर अपडेट पुश करें.

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

  • अगर टाइल डेटा सिंक करने की प्रोसेस महंगी हो, तो ऐसा करें:

    1. डेटा सिंक शेड्यूल करें.
    2. 1 से 2 सेकंड का टाइमर शुरू करें.
    3. अगर आपको समय खत्म होने से पहले, रिमोट डेटा सोर्स से अपडेट मिलता है, तो डेटा सिंक से अपडेट की गई वैल्यू दिखाएं. या फिर, कैश मेमोरी में सेव की गई लोकल वैल्यू.