এমন কন্টেন্ট সহ টাইল তৈরি করুন যা সময়ের সাথে সাথে পরিবর্তিত হয়।
টাইমলাইন নিয়ে কাজ করা
টাইমলাইনে এক বা একাধিক TimelineEntry ইনস্ট্যান্স থাকে, যার প্রত্যেকটিতে
একটি লেআউট থাকে যা নির্দিষ্ট সময়সীমার মধ্যে দেখানো হয়। সব টাইল
এর টাইমলাইন থাকতে হবে।
সিঙ্গেল-এন্ট্রি টাইল
প্রায়শই একটি টাইলের বর্ণনা একটি TimelineEntry দিয়ে দেওয়া যায়। লেআউট
নির্দিষ্ট করা আছে এবং শুধুমাত্র লেআউটের মধ্যে থাকা তথ্য পরিবর্তন করা হয়। যেমন, দিনের ফিটনেস সংক্রান্ত অগ্রগতি দেখায় এমন একটি টাইলের
লেআউট সবসময় একই রকম থাকে
যদিও আপনি আলাদা আলাদা ভ্যালু দেখানোর জন্য সেই লেআউট অ্যাডজাস্ট করতে পারেন। এইসব
ক্ষেত্রে, কন্টেন্ট কখন পরিবর্তন হতে পারে তা আপনি আগে থেকে জানেন না।
একটি TimelineEntry সহ টাইলের নিম্নলিখিত উদাহরণ দেখুন:
override fun onTileRequest( requestParams: RequestBuilders.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(simpleLayout(this))) .build() return Futures.immediateFuture(tile) }
সময়সীমা নির্দিষ্ট করা টাইমলাইন এন্ট্রি
TimelineEntry ঐচ্ছিকভাবে বৈধতার মেয়াদ নির্ধারণ করতে পারে, এর ফলে অ্যাপকে নতুন টাইল পুশ করার প্রয়োজন ছাড়াই
একটি টাইল নির্দিষ্ট সময়ে লেআউট পরিবর্তন করতে পারে।
এর সবচেয়ে উপযুক্ত উদাহরণ হল এজেন্ডা টাইল, যার টাইমলাইনে আসন্ন ইভেন্টের তালিকা থাকে। আসন্ন প্রতিটি ইভেন্টে একটি বৈধতার মেয়াদ থাকে যা থেকে বোঝা যায় যে কখন সেটি দেখাতে হবে।
টাইলের API-তে ওভারল্যাপ করা বৈধতার সময়সীমা অনুমোদিত, যেখানে সবচেয়ে কম সময়সীমা বাকি থাকা স্ক্রিনটি দেখানো হয়। একবারে শুধুমাত্র একটি ইভেন্ট দেখানো হয়।
ডেভেলপাররা একটি ডিফল্ট ফলব্যাক এন্ট্রি প্রদান করতে পারেন। যেমন, এজেন্ডা টাইল অসীম বৈধতা সহ টাইল থাকতে পারে, যা অন্য কোনও টাইমলাইন এন্ট্রি বৈধ না হলে ব্যবহার করা হয়, যেমনটি নিম্নলিখিত কোড স্যাম্পেলে দেখানো হয়েছে:
override fun onTileRequest( requestParams: RequestBuilders.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( TimelineBuilders.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( TimelineBuilders.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. TimelineBuilders.TimeInterval.Builder() .setEndMillis(meeting.dateTimeMillis) .build() ) .build() ) } val tile = Tile.Builder() .setResourcesVersion(RESOURCES_VERSION) .setTileTimeline(timeline.build()) .build() return Futures.immediateFuture(tile) }
টাইল রিফ্রেশ করা
টাইল থেকে পাওয়া তথ্যের মেয়াদ কিছু সময় পরে শেষ হয়ে যেতে পারে। যেমন, কোনও আবহাওয়া টাইল যদি সারাদিন একই তাপমাত্রা দেখায়, তাহলে সেটি সঠিক নয়।
মেয়াদ শেষ হয়ে যাওয়া ডেটা ম্যানেজ করতে, কোনও টাইল তৈরি করার সময় ফ্রেশনেস ইন্টারভ্যাল সেট করুন, যা নির্দিষ্ট করে যে টাইল কতদিন বৈধ থাকবে। আবহাওয়া টাইল সংক্রান্ত উদাহরণে, আপনি প্রতি ঘণ্টায় এর কন্টেন্ট আপডেট করতে পারেন, যেমনটি নিম্নলিখিত কোড স্যাম্পেলে দেখানো হয়েছে:
override fun onTileRequest( requestParams: RequestBuilders.TileRequest ): ListenableFuture<Tile?> = Futures.immediateFuture( Tile.Builder() .setResourcesVersion(RESOURCES_VERSION) .setFreshnessIntervalMillis(60 * 60 * 1000) // 60 minutes .setTileTimeline(Timeline.fromLayoutElement(getWeatherLayout())) .build() )
আপনি ফ্রেশনেস ইন্টার্ভাল সেট করলে, ইন্টার্ভাল শেষ হওয়ার কিছুক্ষণের মধ্যেই সিস্টেম onTileRequest()
কল করে। আপনি ফ্রেশনেস ইন্টারভ্যাল সেট না করলে, সিস্টেম onTileRequest() কল করে না।
এছাড়াও, কোনও এক্সটার্নাল ইভেন্টের কারণে টাইলের মেয়াদ শেষ হয়ে যেতে পারে। যেমন, কোনও ব্যবহারকারী তার ক্যালেন্ডার থেকে কোনও মিটিং সরিয়ে দিতে পারেন এবং টাইলের ডেটা রিফ্রেশ করা না হলে, টাইলে মুছে দেওয়া মিটিংটি এখনও দেখা যাবে। এই ক্ষেত্রে, আপনার অ্যাপ্লিকেশন কোডের যেকোনও জায়গা থেকে রিফ্রেশ করার অনুরোধ করুন, যেমন নিম্নলিখিত কোড স্যাম্পেলে দেখানো হয়েছে:
fun eventDeletedCallback() { TileService.getUpdater(context) .requestUpdate(MyTileService::class.java) }
আপডেট ওয়ার্কফ্লো বেছে নিন
আপনার টাইল আপডেট কীভাবে কনফিগার করবেন তা নির্ধারণ করতে এইসব সেরা পদ্ধতি ব্যবহার করুন:
- আপডেটটি যদি অনুমানযোগ্য হয়—যেমন, এটি যদি ব্যবহারকারীর ক্যালেন্ডারে পরবর্তী ইভেন্টের জন্য হয়—তাহলে টাইমলাইন ব্যবহার করুন।
- আপনি প্ল্যাটফর্ম ডেটা ফেচ করলে, ডেটা বাইন্ডিং ব্যবহার করুন যাতে সিস্টেম অটোমেটিক ডেটা আপডেট করে।
যদি আপডেটটি ডিভাইসে অল্প সময়ের মধ্যে গণনা করা যায়—যেমন সূর্যোদয় টাইলসে কোনও ছবির পজিশন আপডেট করা—তাহলে
onTileRequest()ব্যবহার করুন।আপনি যদি আগে থেকেই সব ছবি তৈরি করতে চান, তাহলে এটি বিশেষভাবে কাজে লাগে। ভবিষ্যতে নতুন ছবি তৈরি করার প্রয়োজন হলে,
setFreshnessIntervalMillis()কল করুন।আপনি যদি আবহাওয়ার ডেটা পোল করার মতো আরও বেশি ইনটেনসিভ ব্যাকগ্রাউন্ড কাজ বারবার করেন, তাহলে
WorkManagerব্যবহার করুন এবং আপনার টাইলে আপডেট পুশ করুন।আপডেটটি যদি কোনও এক্সটার্নাল ইভেন্টের প্রতিক্রিয়া হিসেবে হয়—যেমন, লাইট চালু করা, ইমেল পাওয়া বা নোট আপডেট করা—তাহলে আপনার অ্যাপকে আবার অ্যাক্টিভ করতে একটি Firebase Cloud Messaging (FCM) মেসেজ পাঠান, তারপর টাইলে আপডেট পুশ করুন।
টাইল ডেটা সিঙ্ক করার প্রসেসটি যদি খুব বেশি খরচ সাপেক্ষ হয়, তাহলে নিম্নলিখিত কাজগুলি করুন:
- ডেটা সিঙ্ক করার শিডিউল করুন।
- ১-২ সেকেন্ডের জন্য টাইমার শুরু করো।
- সময় শেষ হওয়ার আগে আপনি যদি কোনও রিমোট ডেটা সোর্স থেকে আপডেট পান, ডেটা সিঙ্ক থেকে আপডেট করা ভ্যালু দেখান। অন্যথায়, ক্যাশে করা স্থানীয় ভ্যালু দেখান।
আপনার জন্য সাজেস্ট করা হয়েছে
- মনে রাখবেন: জাভাস্ক্রিপ্ট বন্ধ থাকলে লিঙ্ক টেক্সট দেখানো হয়
- নিয়মিত আপডেটের প্রভাব কমানো
- ব্যাকগ্রাউন্ডে লোকেশন অ্যাক্সেস করা
- WorkManager ব্যবহার করা শুরু করা