সময়ের সাথে সাথে পরিবর্তিত বিষয়বস্তু সহ টাইলস তৈরি করুন।
টাইমলাইন সঙ্গে কাজ
একটি টাইমলাইনে এক বা একাধিক TimelineEntry
দৃষ্টান্ত থাকে, যার প্রতিটিতে একটি লেআউট থাকে যা একটি নির্দিষ্ট সময়ের ব্যবধানে প্রদর্শিত হয়। সমস্ত টাইলস একটি টাইমলাইন প্রয়োজন.
একক-এন্ট্রি টাইলস
প্রায়শই একটি টাইলকে একটি একক TimelineEntry
দিয়ে বর্ণনা করা যেতে পারে। লেআউট স্থির করা হয়েছে, এবং শুধুমাত্র লেআউটের ভিতরের তথ্য পরিবর্তন হয়। উদাহরণস্বরূপ, একটি টাইল যা আপনার দিনের ফিটনেস অগ্রগতি দেখায় তা সর্বদা একই অগ্রগতি লেআউট দেখায়, যদিও আপনি বিভিন্ন মান দেখানোর জন্য সেই লেআউটটি সামঞ্জস্য করতে পারেন। এই ক্ষেত্রে, কন্টেন্ট কখন পরিবর্তন হতে পারে তা আপনি আগে থেকে জানেন না।
একটি একক TimelineEntry
সহ একটি টাইলের নিম্নলিখিত উদাহরণটি দেখুন:
কোটলিন
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) }
জাভা
@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
ঐচ্ছিকভাবে একটি বৈধতার সময়কাল সংজ্ঞায়িত করতে পারে, একটি টাইলকে একটি নতুন টাইল পুশ করার জন্য অ্যাপের প্রয়োজন ছাড়াই একটি পরিচিত সময়ে তার বিন্যাস পরিবর্তন করতে দেয়৷
ক্যানোনিকাল উদাহরণ হল একটি এজেন্ডা টাইল যার টাইমলাইনে আসন্ন ইভেন্টগুলির একটি তালিকা রয়েছে৷ প্রতিটি আসন্ন ইভেন্টে এটি কখন দেখাতে হবে তা নির্দেশ করার জন্য একটি বৈধতা সময় থাকে৷
টাইলস API ওভারল্যাপিং বৈধতা সময়কালের জন্য অনুমতি দেয়, যেখানে সবচেয়ে কম সময় বাকি থাকা স্ক্রীনটি দেখানো হয়। একটি সময়ে শুধুমাত্র একটি ইভেন্ট প্রদর্শিত হয়.
বিকাশকারীরা একটি ডিফল্ট ফলব্যাক এন্ট্রি প্রদান করতে পারে। উদাহরণ স্বরূপ, এজেন্ডা টাইলে অসীম বৈধতার মেয়াদ সহ একটি টাইল থাকতে পারে, যা ব্যবহার করা হয় যদি অন্য কোনো টাইমলাইন এন্ট্রি বৈধ না হয়, যেমনটি নিম্নলিখিত কোড নমুনায় দেখানো হয়েছে:
কোটলিন
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) }
জাভা
@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); }
একটি টালি রিফ্রেশ করুন
একটি টাইলে দেখানো তথ্য কিছু সময়ের পরে মেয়াদ শেষ হতে পারে। উদাহরণস্বরূপ, একটি আবহাওয়া টাইল যা সারা দিন একই তাপমাত্রা দেখায় তা সঠিক নয়।
মেয়াদোত্তীর্ণ ডেটা মোকাবেলা করতে, একটি টালি তৈরি করার সময় একটি নতুনত্বের ব্যবধান সেট করুন, যা নির্দিষ্ট করে কতক্ষণ টাইলটি বৈধ। আবহাওয়া টাইলের উদাহরণে, আপনি প্রতি ঘন্টায় এর সামগ্রী আপডেট করতে পারেন, যেমনটি নিম্নলিখিত কোড নমুনায় দেখানো হয়েছে:
কোটলিন
override fun onTileRequest(requestParams: RequestBuilders.TileRequest) = Futures.immediateFuture(Tile.Builder() .setResourcesVersion(RESOURCES_VERSION) .setFreshnessIntervalMillis(60 * 60 * 1000) // 60 minutes .setTileTimeline(Timeline.fromLayoutElement( getWeatherLayout()) ).build() )
জাভা
@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()
কল করবে না।
একটি বাহ্যিক ইভেন্টের কারণে একটি টালির মেয়াদও শেষ হতে পারে৷ উদাহরণস্বরূপ, একজন ব্যবহারকারী তাদের ক্যালেন্ডার থেকে একটি মিটিং সরিয়ে ফেলতে পারে এবং যদি টাইলটি রিফ্রেশ না করা হয়, তাহলে টাইলটি এখনও সেই মুছে ফেলা মিটিংটি দেখাবে৷ এই ক্ষেত্রে, আপনার অ্যাপ্লিকেশন কোডের যেকোনো স্থান থেকে একটি রিফ্রেশের অনুরোধ করুন, যেমনটি নিম্নলিখিত কোড নমুনায় দেখানো হয়েছে:
কোটলিন
fun eventDeletedCallback() { TileService.getUpdater(context) .requestUpdate(MyTileService::class.java) }
জাভা
public void eventDeletedCallback() { TileService.getUpdater(context) .requestUpdate(MyTileService.class); }
একটি আপডেট কর্মপ্রবাহ চয়ন করুন
আপনার টাইল আপডেটগুলি কীভাবে কনফিগার করবেন তা নির্ধারণ করতে এই সেরা অনুশীলনগুলি ব্যবহার করুন:
- যদি আপডেটটি অনুমানযোগ্য হয় - উদাহরণস্বরূপ, যদি এটি ব্যবহারকারীর ক্যালেন্ডারে পরবর্তী ইভেন্টের জন্য হয় - একটি টাইমলাইন ব্যবহার করুন৷
- যখন আপনি প্ল্যাটফর্ম ডেটা আনেন, ডেটা বাইন্ডিং ব্যবহার করুন যাতে সিস্টেম স্বয়ংক্রিয়ভাবে ডেটা আপডেট করে।
যদি আপডেটটি ডিভাইসে অল্প সময়ের মধ্যে গণনা করা যায় - যেমন একটি সূর্যোদয়ের টাইলে একটি চিত্রের অবস্থান আপডেট করা -
onTileRequest()
ব্যবহার করুন।এটি বিশেষভাবে উপযোগী যখন আপনাকে সময়ের আগে সমস্ত ছবি তৈরি করতে হবে। আপনি যদি ভবিষ্যতে একটি নতুন ছবি তৈরি করতে চান,
setFreshnessIntervalMillis()
কে কল করুন।আপনি যদি বারবার আরও নিবিড় ব্যাকগ্রাউন্ডের কাজ করছেন, যেমন আবহাওয়া ডেটার জন্য পোলিং,
WorkManager
ব্যবহার করুন এবং আপনার টাইলে আপডেটগুলি পুশ করুন।যদি আপডেটটি একটি বাহ্যিক ইভেন্টের প্রতিক্রিয়া হিসাবে হয়—যেমন লাইট অন করা, একটি ইমেল পাওয়া, বা একটি নোট আপডেট করা—আপনার অ্যাপকে আবার সক্রিয় করতে একটি Firebase ক্লাউড মেসেজিং (FCM) বার্তা পাঠান, তারপর টাইলে আপডেটগুলি পুশ করুন৷
যদি টাইল ডেটা সিঙ্ক প্রক্রিয়া ব্যয়বহুল হতে পারে তবে নিম্নলিখিতগুলি করুন:
- একটি ডেটা সিঙ্ক শিডিউল করুন।
- 1-2 সেকেন্ডের জন্য একটি টাইমার শুরু করুন।
- সময় ফুরিয়ে যাওয়ার আগে আপনি যদি দূরবর্তী ডেটা উত্স থেকে একটি আপডেট পান তবে ডেটা সিঙ্ক থেকে আপডেট করা মান দেখান৷ অন্যথায়, একটি ক্যাশে স্থানীয় মান দেখান।
আপনার জন্য প্রস্তাবিত
- দ্রষ্টব্য: জাভাস্ক্রিপ্ট বন্ধ থাকলে লিঙ্ক টেক্সট প্রদর্শিত হয়
- নিয়মিত আপডেটের প্রভাব কমিয়ে দিন
- ব্যাকগ্রাউন্ডে অবস্থান অ্যাক্সেস করুন
- WorkManager দিয়ে শুরু করা