Wear OS-এ, একটি চলমান বিজ্ঞপ্তির সাথে একটি চলমান অ্যাক্টিভিটি যুক্ত করা হলে সেই বিজ্ঞপ্তিটি Wear OS ব্যবহারকারী ইন্টারফেসের মধ্যে অতিরিক্ত সারফেসে যোগ করে। এটি ব্যবহারকারীদের দীর্ঘ-চলমান ক্রিয়াকলাপের সাথে আরও নিযুক্ত থাকতে দেয়।
চলমান বিজ্ঞপ্তিগুলি সাধারণত ইঙ্গিত করতে ব্যবহৃত হয় যে একটি বিজ্ঞপ্তির একটি ব্যাকগ্রাউন্ড টাস্ক রয়েছে যেটির সাথে ব্যবহারকারী সক্রিয়ভাবে জড়িত বা কোনোভাবে মুলতুবি রয়েছে এবং তাই ডিভাইসটি দখল করছে।
উদাহরণস্বরূপ, একজন Wear OS ব্যবহারকারী একটি ক্রিয়াকলাপ থেকে দৌড় রেকর্ড করতে একটি ওয়ার্কআউট অ্যাপ ব্যবহার করতে পারে, তারপর অন্য কিছু কাজ শুরু করতে সেই অ্যাপ থেকে দূরে নেভিগেট করতে পারে। যখন ব্যবহারকারী ওয়ার্কআউট অ্যাপ থেকে দূরে যান, অ্যাপটি একটি চলমান বিজ্ঞপ্তিতে রূপান্তরিত হয় যা ব্যবহারকারীকে তাদের দৌড়ের বিষয়ে অবগত রাখতে কিছু ব্যাকগ্রাউন্ড কাজের সাথে সংযুক্ত থাকে। বিজ্ঞপ্তিটি ব্যবহারকারীর আপডেট এবং অ্যাপে ফিরে ট্যাপ করার একটি সহজ উপায় প্রদান করে।
যাইহোক, বিজ্ঞপ্তিটি দেখতে, ব্যবহারকারীকে ঘড়ির মুখের নীচে বিজ্ঞপ্তি ট্রেতে সোয়াইপ করতে হবে এবং সঠিক বিজ্ঞপ্তিটি খুঁজে বের করতে হবে। এটি অন্যান্য পৃষ্ঠতলের মতো সুবিধাজনক নয়।
চলমান অ্যাক্টিভিটি API-এর সাথে, একটি অ্যাপের চলমান বিজ্ঞপ্তি ব্যবহারকারীকে নিযুক্ত রাখতে Wear OS-এ একাধিক নতুন, সুবিধাজনক সারফেসে তথ্য প্রকাশ করতে পারে।
উদাহরণস্বরূপ, এই ওয়ার্কআউট অ্যাপে, তথ্যটি ব্যবহারকারীর ঘড়ির মুখে একটি ট্যাপযোগ্য চলমান আইকন হিসাবে উপস্থিত হতে পারে:
চিত্র 1. কার্যকলাপ নির্দেশক।
গ্লোবাল অ্যাপ লঞ্চারের সাম্প্রতিক বিভাগে যে কোনো চলমান কার্যকলাপের তালিকাও রয়েছে:
চিত্র 2. গ্লোবাল লঞ্চার।
একটি চলমান ক্রিয়াকলাপের সাথে সংযুক্ত একটি চলমান বিজ্ঞপ্তি ব্যবহার করার জন্য নিম্নলিখিতগুলি ভাল পরিস্থিতিতে রয়েছে:
চিত্র 3. টাইমার: সক্রিয়ভাবে সময় গণনা করে এবং টাইমার থামানো বা বন্ধ হলে শেষ হয়।
চিত্র 4. পালাক্রমে নেভিগেশন: একটি গন্তব্যের দিকনির্দেশ ঘোষণা করে। ব্যবহারকারী যখন গন্তব্যে পৌঁছায় বা নেভিগেশন বন্ধ করে তখন শেষ হয়।
চিত্র 5. মিডিয়া: একটি সেশন জুড়ে সঙ্গীত বাজায়। ব্যবহারকারী অধিবেশন বিরতি সঙ্গে সঙ্গে শেষ হয়.
Wear মিডিয়া অ্যাপের জন্য স্বয়ংক্রিয়ভাবে চলমান কার্যকলাপ তৈরি করে।
অন্যান্য ধরনের অ্যাপের জন্য চলমান ক্রিয়াকলাপ তৈরির একটি গভীর উদাহরণের জন্য চলমান কার্যকলাপ কোডল্যাবটি দেখুন।
সেটআপ
আপনার অ্যাপে চলমান কার্যকলাপ 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"
}
একটি চলমান কার্যকলাপ শুরু করুন
একটি চলমান বিজ্ঞপ্তি এবং তারপর একটি চলমান কার্যকলাপ তৈরি করে শুরু করুন৷
একটি চলমান বিজ্ঞপ্তি তৈরি করুন
একটি চলমান কার্যকলাপ একটি চলমান বিজ্ঞপ্তির সাথে ঘনিষ্ঠভাবে সম্পর্কিত। তারা একত্রে কাজ করে ব্যবহারকারীদেরকে একটি কাজ সম্পর্কে অবহিত করতে যাতে ব্যবহারকারী সক্রিয়ভাবে নিযুক্ত থাকে বা এমন একটি কাজ যা কোনোভাবে মুলতুবি রয়েছে এবং তাই ডিভাইসটি দখল করে।
একটি চলমান বিজ্ঞপ্তির সাথে আপনাকে অবশ্যই একটি চলমান কার্যকলাপ যুক্ত করতে হবে৷ আপনার চলমান ক্রিয়াকলাপকে একটি বিজ্ঞপ্তির সাথে লিঙ্ক করার অনেক সুবিধা রয়েছে, যার মধ্যে নিম্নলিখিতগুলি রয়েছে:
- নোটিফিকেশন হল এমন ডিভাইসের ফলব্যাক যা চলমান ক্রিয়াকলাপগুলিকে সমর্থন করে না৷ বিজ্ঞপ্তিটি হল একমাত্র পৃষ্ঠ যা আপনার অ্যাপটি ব্যাকগ্রাউন্ডে চলাকালীন দেখায়।
- Android 11 এবং উচ্চতর সংস্করণে, Wear OS নোটিফিকেশন ট্রেতে নোটিফিকেশন লুকিয়ে রাখে যখন অ্যাপটি অতিরিক্ত সারফেসে চলমান অ্যাক্টিভিটি হিসেবে দেখা যায়।
- বর্তমান বাস্তবায়ন
Notification
যোগাযোগ ব্যবস্থা হিসেবে ব্যবহার করে।
Notification.Builder.setOngoing ব্যবহার করে একটি চলমান বিজ্ঞপ্তি তৈরি করুন।
একটি চলমান কার্যকলাপ শুরু করুন
একবার আপনার একটি চলমান বিজ্ঞপ্তি আছে, নিম্নলিখিত নমুনায় দেখানো হিসাবে একটি চলমান কার্যকলাপ তৈরি করুন। প্রতিটি সম্পত্তির আচরণ বুঝতে অন্তর্ভুক্ত মন্তব্য চেক করুন.
কোটলিন
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())
জাভা
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());
নিম্নলিখিত পদক্ষেপগুলি পূর্ববর্তী উদাহরণের সবচেয়ে গুরুত্বপূর্ণ অংশটিকে কল করে:
NotificationCompat.Builder
এ.setOngoing(true)
কল করুন এবং যেকোনো ঐচ্ছিক ক্ষেত্র সেট করুন।একটি
OngoingActivityStatus
তৈরি করুন—বা অন্য একটি স্ট্যাটাস বিকল্প, যেমনটি নিম্নলিখিত বিভাগে বর্ণিত হয়েছে—পাঠ্যটি উপস্থাপন করতে।একটি
OngoingActivity
তৈরি করুন এবং একটি বিজ্ঞপ্তি আইডি সেট করুন।প্রসঙ্গ সহ
OngoingActivity
এapply()
কল করুন।notificationManager.notify()
কে কল করুন এবং একই বিজ্ঞপ্তি আইডিতে পাস করুন যা চলমান ক্রিয়াকলাপে সেট করা আছে তাদের একসাথে বাঁধতে।
স্ট্যাটাস
আপনি লঞ্চারের সাম্প্রতিক অংশের মতো নতুন পৃষ্ঠে ব্যবহারকারীর কাছে OngoingActivity
বর্তমান, লাইভ স্থিতি প্রকাশ করতে Status
ব্যবহার করেন। বৈশিষ্ট্যটি ব্যবহার করতে, Status.Builder
সাবক্লাস ব্যবহার করুন।
বেশিরভাগ ক্ষেত্রে, আপনাকে শুধুমাত্র একটি টেমপ্লেট যোগ করতে হবে যা আপনি যে পাঠ্যটিকে অ্যাপ লঞ্চারের সাম্প্রতিক বিভাগে উপস্থিত করতে চান তা প্রতিনিধিত্ব করে।
তারপর addTemplate()
পদ্ধতি ব্যবহার করে এবং Status.Part
হিসেবে টেক্সটের যেকোনো গতিশীল অংশ নির্দিষ্ট করে স্প্যানের সাথে কীভাবে টেক্সট প্রদর্শিত হবে তা আপনি কাস্টমাইজ করতে পারেন।
নিচের উদাহরণটি দেখায় কিভাবে "সময়" শব্দটিকে লাল রঙে দেখাতে হয়। উদাহরণটি অ্যাপ লঞ্চারের সাম্প্রতিক বিভাগে একটি স্টপওয়াচ প্রতিনিধিত্ব করতে Status.StopwatchPart
ব্যবহার করে।
কোটলিন
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()
জাভা
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();
টেমপ্লেট থেকে একটি অংশ উল্লেখ করতে, #
দ্বারা বেষ্টিত নামটি ব্যবহার করুন। আউটপুটে #
তৈরি করতে, টেমপ্লেটে ##
ব্যবহার করুন।
পূর্ববর্তী উদাহরণটি টেমপ্লেটে পাস করার জন্য একটি CharSequence
তৈরি করতে HTMLCompat
ব্যবহার করে, যা একটি Spannable
বস্তুকে ম্যানুয়ালি সংজ্ঞায়িত করার চেয়ে সহজ।
অতিরিক্ত কাস্টমাইজেশন
Status
বাইরে, আপনি নিম্নলিখিত উপায়ে আপনার চলমান কার্যকলাপ বা বিজ্ঞপ্তিগুলি কাস্টমাইজ করতে পারেন৷ যাইহোক, OEM এর বাস্তবায়নের উপর ভিত্তি করে এই কাস্টমাইজেশনগুলি ব্যবহার করা যাবে না।
চলমান বিজ্ঞপ্তি
- বিভাগ সেট চলমান কার্যকলাপের অগ্রাধিকার নির্ধারণ করে।
-
CATEGORY_CALL
: একটি ইনকামিং ভয়েস বা ভিডিও কল বা অনুরূপ সিঙ্ক্রোনাস যোগাযোগের অনুরোধ -
CATEGORY_NAVIGATION
: একটি মানচিত্র বা পালাক্রমে নেভিগেশন -
CATEGORY_TRANSPORT
: প্লেব্যাকের জন্য মিডিয়া পরিবহন নিয়ন্ত্রণ -
CATEGORY_ALARM
: একটি অ্যালার্ম বা টাইমার -
CATEGORY_WORKOUT
: একটি ওয়ার্কআউট (নতুন বিভাগ) -
CATEGORY_LOCATION_SHARING
: অস্থায়ী অবস্থান ভাগ করে নেওয়া (নতুন বিভাগ) -
CATEGORY_STOPWATCH
: স্টপওয়াচ (নতুন বিভাগ)
-
চলমান কার্যকলাপ
অ্যানিমেটেড আইকন: একটি কালো এবং সাদা ভেক্টর, বিশেষত একটি স্বচ্ছ ব্যাকগ্রাউন্ড সহ। সক্রিয় মোডে ঘড়ির মুখে প্রদর্শন করে। অ্যানিমেটেড আইকন প্রদান করা না হলে, ডিফল্ট বিজ্ঞপ্তি আইকন ব্যবহার করা হয়। (প্রতিটি অ্যাপ্লিকেশনের জন্য ডিফল্ট বিজ্ঞপ্তি আইকন আলাদা।)
স্ট্যাটিক আইকন: স্বচ্ছ ব্যাকগ্রাউন্ড সহ একটি ভেক্টর আইকন। পরিবেষ্টিত মোডে ঘড়ির মুখে প্রদর্শন করে। অ্যানিমেটেড আইকন সেট না থাকলে, সক্রিয় মোডে ওয়াচ ফেসে স্ট্যাটিক আইকন ব্যবহার করা হয়। এটি প্রদান না করা হলে, বিজ্ঞপ্তি আইকন ব্যবহার করা হয়। যদি কোনটিই সেট না করা হয়, একটি ব্যতিক্রম নিক্ষেপ করা হয়। (অ্যাপ লঞ্চার এখনও অ্যাপ আইকন ব্যবহার করে।)
চলমান অ্যাক্টিভিটি স্ট্যাটাস: প্লেইন টেক্সট বা একটি
Chronometer
। অ্যাপ লঞ্চারের সাম্প্রতিক বিভাগে প্রদর্শিত হয়। প্রদান না করা হলে, বিজ্ঞপ্তি "প্রসঙ্গ পাঠ" ব্যবহার করা হয়।টাচ ইনটেন্ট: ব্যবহারকারী চলমান অ্যাক্টিভিটি আইকনে ট্যাপ করলে অ্যাপে ফিরে যেতে একটি
PendingIntent
ব্যবহার করা হয়। ঘড়ির মুখে বা লঞ্চার আইটেমে প্রদর্শিত হয়। অ্যাপটি চালু করতে ব্যবহৃত মূল উদ্দেশ্য থেকে এটি ভিন্ন হতে পারে। প্রদান না করা হলে, বিজ্ঞপ্তির বিষয়বস্তুর উদ্দেশ্য ব্যবহার করা হয়। যদি কোনটিই সেট না করা হয় তবে একটি ব্যতিক্রম নিক্ষেপ করা হয়।LocusId
: আইডি যা লঞ্চার শর্টকাট বরাদ্দ করে যা চলমান কার্যকলাপের সাথে মিলে যায়। কার্যকলাপ চলমান থাকাকালীন সাম্প্রতিক বিভাগে লঞ্চারে প্রদর্শিত হয়৷ যদি প্রদান না করা হয়, লঞ্চারটি একই প্যাকেজ থেকে সাম্প্রতিক বিভাগে সমস্ত অ্যাপ আইটেম লুকিয়ে রাখে এবং শুধুমাত্র চলমান কার্যকলাপ দেখায়।চলমান অ্যাক্টিভিটি আইডি: একটি অ্যাপ্লিকেশানের একাধিক চলমান অ্যাক্টিভিটি থাকলে,
fromExistingOngoingActivity()
এ কলগুলিকে দ্ব্যর্থিত করার জন্য ID ব্যবহার করা হয়।
একটি চলমান কার্যকলাপ আপডেট করুন
বেশিরভাগ ক্ষেত্রে, বিকাশকারীরা একটি নতুন চলমান বিজ্ঞপ্তি এবং একটি নতুন চলমান কার্যকলাপ তৈরি করে যখন তাদের স্ক্রিনে ডেটা আপডেট করার প্রয়োজন হয়। যাইহোক, চলমান অ্যাক্টিভিটি এপিআই একটি OngoingActivity
আপডেট করার জন্য সহায়ক পদ্ধতিও অফার করে যদি আপনি এটিকে পুনরায় তৈরি করার পরিবর্তে একটি দৃষ্টান্ত বজায় রাখতে চান।
অ্যাপটি ব্যাকগ্রাউন্ডে চলমান থাকলে, এটি চলমান কার্যকলাপ API-এ আপডেট পাঠাতে পারে। যাইহোক, এটি খুব ঘন ঘন করবেন না, কারণ আপডেট পদ্ধতিটি একে অপরের খুব কাছাকাছি কলগুলিকে উপেক্ষা করে। প্রতি মিনিটে কয়েকটি আপডেট যুক্তিসঙ্গত।
চলমান কার্যকলাপ এবং পোস্ট করা বিজ্ঞপ্তি আপডেট করতে, আপনার আগে তৈরি করা বস্তুটি ব্যবহার করুন এবং update()
কল করুন, যেমনটি নিম্নলিখিত উদাহরণে দেখানো হয়েছে:
কোটলিন
ongoingActivity.update(context, newStatus)
জাভা
ongoingActivity.update(context, newStatus);
একটি সুবিধা হিসাবে, একটি চলমান কার্যকলাপ তৈরি করার জন্য একটি স্থির পদ্ধতি আছে।
কোটলিন
OngoingActivity.recoverOngoingActivity(context) .update(context, newStatus)
জাভা
OngoingActivity.recoverOngoingActivity(context) .update(context, newStatus);
একটি চলমান কার্যকলাপ বন্ধ করুন
অ্যাপটি একটি চলমান কার্যকলাপ হিসাবে চালানো শেষ হলে, এটি শুধুমাত্র চলমান বিজ্ঞপ্তি বাতিল করতে হবে।
আপনি বিজ্ঞপ্তি বা চলমান কার্যকলাপ বাতিল করতেও বেছে নিতে পারেন যখন এটি অগ্রভাগে আসে, তারপর পটভূমিতে ফিরে যাওয়ার সময় সেগুলি পুনরায় তৈরি করুন, তবে এটির প্রয়োজন নেই৷
একটি চলমান কার্যকলাপ বিরতি
যদি আপনার অ্যাপে একটি সুস্পষ্ট স্টপ অ্যাকশন থাকে, তাহলে এটি আনপজ করার পরে চলমান অ্যাক্টিভিটি চালিয়ে যান। একটি স্পষ্ট স্টপ অ্যাকশন ছাড়াই একটি অ্যাপের জন্য, ক্রিয়াকলাপটি বন্ধ হয়ে গেলে শেষ করুন৷
সর্বোত্তম অনুশীলন
চলমান কার্যকলাপ API এর সাথে কাজ করার সময় নিম্নলিখিত বিষয়গুলি মনে রাখবেন:
-
notificationManager.notify(...)
কল করার আগেongoingActivity.apply(context)
কল করুন। আপনার চলমান কার্যকলাপের জন্য একটি স্ট্যাটিক আইকন সেট করুন, হয় স্পষ্টভাবে বা বিজ্ঞপ্তির মাধ্যমে একটি ফলব্যাক হিসাবে। যদি আপনি না করেন, আপনি একটি
IllegalArgumentException
পাবেন।স্বচ্ছ ব্যাকগ্রাউন্ড সহ কালো এবং সাদা ভেক্টর আইকন ব্যবহার করুন।
আপনার চলমান কার্যকলাপের জন্য একটি স্পর্শ অভিপ্রায় সেট করুন, হয় স্পষ্টভাবে বা বিজ্ঞপ্তি ব্যবহার করে একটি ফলব্যাক হিসাবে৷ যদি আপনি না করেন, আপনি একটি
IllegalArgumentException
পাবেন।NotificationCompat
এর জন্য, Core AndroidX লাইব্রেরিcore:1.5.0-alpha05+
ব্যবহার করুন, যার মধ্যেLocusIdCompat
এবং ওয়ার্কআউট, স্টপওয়াচ এবং অবস্থান ভাগ করে নেওয়ার জন্য নতুন বিভাগ অন্তর্ভুক্ত রয়েছে।যদি আপনার অ্যাপের একাধিক
MAIN LAUNCHER
কার্যকলাপ ম্যানিফেস্টে ঘোষিত থাকে, তাহলে একটি গতিশীল শর্টকাট প্রকাশ করুন এবংLocusId
ব্যবহার করে আপনার চলমান কার্যকলাপের সাথে এটিকে যুক্ত করুন।
Wear OS ডিভাইসে মিডিয়া চালানোর সময় মিডিয়া বিজ্ঞপ্তি প্রকাশ করুন
Wear OS ডিভাইসে মিডিয়া কন্টেন্ট চালানো হলে, একটি মিডিয়া বিজ্ঞপ্তি প্রকাশ করুন । এটি সিস্টেমটিকে সংশ্লিষ্ট চলমান কার্যকলাপ তৈরি করতে দেয়।
আপনি Media3 ব্যবহার করলে, বিজ্ঞপ্তি স্বয়ংক্রিয়ভাবে প্রকাশিত হয়। আপনি যদি ম্যানুয়ালি আপনার বিজ্ঞপ্তি তৈরি করেন, তাহলে এটি MediaStyleNotificationHelper.MediaStyle
ব্যবহার করবে, এবং সংশ্লিষ্ট MediaSession
এর সেশন কার্যকলাপ জনবহুল হওয়া উচিত।
আপনার জন্য প্রস্তাবিত
- দ্রষ্টব্য: জাভাস্ক্রিপ্ট বন্ধ থাকলে লিঙ্ক টেক্সট প্রদর্শিত হয়
- একটি বিজ্ঞপ্তি তৈরি করুন {:#notification}
- চলমান অ্যাক্টিভিটি API-এর মাধ্যমে Wear OS ব্যবহারকারীদের নতুন উপায়ে যুক্ত করুন
- একটি প্রসারণযোগ্য বিজ্ঞপ্তি তৈরি করুন {:#expandable-notification}