Wear OS ডিভাইস প্রায়ই দীর্ঘ সময় ধরে চলা অভিজ্ঞতার জন্য ব্যবহার করা হয়, যেমন ওয়ার্কআউট ট্র্যাক করা। এছাড়াও, এই অভিজ্ঞতাগুলি গুরুত্বপূর্ণ তথ্য প্রদান করতে পারে যা ব্যবহারকারী গুরুত্ব দেন এবং দ্রুত অ্যাক্সেস করতে চান।
এটি ব্যবহারকারীর অভিজ্ঞতা সংক্রান্ত একটি চ্যালেঞ্জ তৈরি করে: কোনও ব্যবহারকারী যদি কোনও টাস্ক শুরু করেন এবং তারপরে নেভিগেট করে ওয়াচ ফেসে চলে যান, তাহলেও তাকে নিম্নলিখিত প্রতিটি কাজ করতে দিতে হবে:
- গুরুত্বপূর্ণ আপডেট পাওয়া চালিয়ে যেতে পারবেন।
- একবার ট্যাপ করে টাস্কে ফিরে যান।
লঞ্চার ব্যবহার করে অ্যাপে ফিরে আসা কঠিন হতে পারে, বিশেষ করে যখন আপনি চলছেন, যা অপ্রয়োজনীয় সমস্যা তৈরি করে।
Wear OS 7 ভার্সন অনুযায়ী, এর সমাধান হল একটি চলমান বিজ্ঞপ্তি
OngoingActivity অথবা লাইভ আপডেট বিজ্ঞপ্তি-এর সাথে পেয়ার করা। এর ফলে, ডিভাইসটি
ব্যবহারকারীর ইন্টারফেস জুড়ে দীর্ঘক্ষণ ধরে চলা অ্যাক্টিভিটি সম্পর্কে তথ্য দেখাতে পারে।
এর ফলে, ওয়াচ
ফেসের নিচে ট্যাপ করা যায় এমন আইকনের মতো ফিচার চালু করা যায়। এই ইন্ডিকেটর ব্যবহারকারীদের ব্যাকগ্রাউন্ড টাস্ক সম্পর্কে সচেতন রাখে এবং এটি অ্যাপে ফিরে আসার জন্য
এক-ট্যাপ উপায় প্রদান করে।
এছাড়াও, কোনও অ্যাক্টিভিটি বা লাইভ আপডেট চলতে থাকলে, আপনার অ্যাপ আরও বেশি সময় ধরে দেখা যায়। এর ফলে, কিছু সময় ধরে কোনও অ্যাক্টিভিটি না থাকলে সিস্টেম ওয়াচ ফেসে ফিরে যেতে পারে না। আরও তথ্যের জন্য, Wear-এ আপনার অ্যাপ দৃশ্যমান রাখুন দেখুন।
এক মিনিটের বেশি সময় ধরে চলতে পারে এমন অভিজ্ঞতা অথবা ব্যবহারকারী টাস্ক সম্পূর্ণ হওয়ার আগে আপনার অ্যাপ থেকে নেভিগেট করে বেরিয়ে যেতে পারেন এমন ক্ষেত্রে, চলমান অ্যাক্টিভিটি বা লাইভ আপডেট বিজ্ঞপ্তি ব্যবহার করুন।
উপযুক্ত ব্যবহার: ট্র্যাক করা ওয়ার্কআউট; টাইমার; অ্যাক্টিভ রাইডশেয়ার ট্র্যাকিং; দীর্ঘ ভয়েস রেকর্ডিং, যেমন মিটিং; এবং কেনাকাটার তালিকা যা ব্যবহারকারী স্টোরে থাকাকালীন উপলভ্য থাকতে হবে
অনুপযুক্ত ব্যবহার: ছোট ভয়েস মেসেজ, প্রচার, আপডেট করা অ্যাপের স্ট্যাটাস এবং আসন্ন ক্যালেন্ডার ইভেন্ট রেকর্ড করা।
গুরুত্বপূর্ণ: এইসব পরিস্থিতিতে
OngoingActivityবা লাইভ আপডেট ব্যবহার করা Wear OS অ্যাপ কোয়ালিটি সংক্রান্ত নির্দেশিকা WO-V4 অনুযায়ী বাধ্যতামূলক।
যেমন, এই ওয়ার্কআউট অ্যাপে, ব্যবহারকারীর ওয়াচ ফেসে ট্যাপ করা যায় এমন রানিং আইকন হিসেবে তথ্য দেখানো হতে পারে:
ছবি ১. অ্যাক্টিভিটি ইন্ডিকেটর।
এছাড়াও, গ্লোবাল অ্যাপ লঞ্চারের সাম্প্রতিক বিভাগে চলমান বিজ্ঞপ্তি সংক্রান্ত তথ্য দেখানো হয়। এটি ব্যবহারকারীদের জন্য তাদের টাস্কের স্ট্যাটাস দেখার এবং অ্যাপের সাথে আবার ইন্ট্যার্যাক্ট করার জন্য আরেকটি সুবিধাজনক জায়গা প্রদান করে:
ছবি ২. গ্লোবাল লঞ্চার।
চলমান অ্যাক্টিভিটির সাথে যুক্ত থাকা চলমান বিজ্ঞপ্তি ব্যবহার করার জন্য নিম্নলিখিত পরিস্থিতিগুলি উপযুক্ত:
ছবি ৩. টাইমার: অ্যাক্টিভভাবে সময় কাউন্টডাউন করে এবং টাইমার পজ বা বন্ধ করা হলে শেষ হয়।
ছবি ৪. এক এক করে নেভিগেশন: গন্তব্যের দিকনির্দেশ ঘোষণা করে। ব্যবহারকারী গন্তব্যে পৌঁছে গেলে বা নেভিগেশন বন্ধ করে দিলে এটি শেষ হয়ে যায়।
ছবি ৫. মিডিয়া: সেশন জুড়ে মিউজিক চালায়। ব্যবহারকারী সেশন পজ করার সাথে সাথেই শেষ হয়ে যায়।
Wear মিডিয়া অ্যাপের জন্য অটোমেটিক চলমান অ্যাক্টিভিটি তৈরি করে।
অন্যান্য ধরনের অ্যাপের জন্য চলমান অ্যাক্টিভিটি তৈরি করার ব্যাপারে বিস্তারিত উদাহরণ পেতে, চলমান অ্যাক্টিভিটি কোডল্যাব দেখুন।
সেট-আপ করুন
আপনার অ্যাপে 'চলমান অ্যাক্টিভিটি API' ব্যবহার করা শুরু করতে, আপনার অ্যাপের build.gradle ফাইলে নিম্নলিখিত
ডিপেন্ডেন্সি যোগ করুন:
dependencies {
implementation "androidx.wear:wear-ongoing:1.1.0"
implementation "androidx.core:core:1.19.1"
}
অনগোয়িং অ্যাক্টিভিটি তৈরি করা
এই প্রসেসে তিনটি ধাপ রয়েছে:
- একটি স্ট্যান্ডার্ড
NotificationCompat.Builderতৈরি করুন এবং এটিকে চলমান হিসেবে কনফিগার করুন। OngoingActivityঅবজেক্ট তৈরি ও কনফিগার করুন, এর মধ্যে নোটিফিকেশন বিল্ডার পাস করুন।- বিজ্ঞপ্তি বিল্ডারে চলমান অ্যাক্টিভিটি প্রয়োগ করুন এবং ফলাফল স্বরূপ বিজ্ঞপ্তি পোস্ট করুন।
বিজ্ঞপ্তি তৈরি ও কনফিগার করা
NotificationCompat.Builder তৈরি করার মাধ্যমে শুরু করুন। গুরুত্বপূর্ণ ধাপ হল, এটিকে একটি চলমান বিজ্ঞপ্তি হিসেবে চিহ্নিত করতে
setOngoing(true)-এ কল করা। এছাড়াও, এই পর্যায়ে আপনি
ছোট আইকন ও বিভাগের মতো অন্যান্য বিজ্ঞপ্তি প্রপার্টি সেট করতে পারবেন।
// Create a PendingIntent to pass to the notification builder val pendingIntent = PendingIntent.getActivity( this, 0, Intent(this, AlwaysOnActivity::class.java).apply { flags = Intent.FLAG_ACTIVITY_SINGLE_TOP }, PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE, ) val notificationBuilder = NotificationCompat.Builder(this, CHANNEL_ID) .setContentTitle("Always On Service") .setContentText("Service is running in background") .setSmallIcon(R.drawable.animated_walk) // Category helps the system prioritize the ongoing activity .setCategory(NotificationCompat.CATEGORY_WORKOUT) .setContentIntent(pendingIntent) .setVisibility(NotificationCompat.VISIBILITY_PUBLIC) .setOngoing(true) // Important!
OngoingActivity তৈরি করা
এরপরে, বিল্ডার ব্যবহার করে OngoingActivity-এর একটি ইনস্ট্যান্স তৈরি করুন। OngoingActivity.Builder-এর জন্য Context, বিজ্ঞপ্তি আইডি এবং
NotificationCompat.Builder প্রয়োজন যা আপনি আগের ধাপে তৈরি করেছেন।
নতুন UI সারফেসে দেখানো হবে এমন মূল প্রপার্টি কনফিগার করুন:
- অ্যানিমেটেড ও স্ট্যাটিক আইকন: অ্যাক্টিভ ও অ্যাম্বিয়েন্ট মোডে ওয়াচ ফেসে দেখানো আইকন দিন।
- টাচ ইনটেন্ট: একটি
PendingIntentযা ব্যবহারকারীকে আপনার অ্যাপে ফিরিয়ে আনে যখন তারা 'চলমান অ্যাক্টিভিটি' আইকনে ট্যাপ করেন। আপনি আগের ধাপে তৈরি করাpendingIndentআবার ব্যবহার করতে পারবেন।
val ongoingActivity = OngoingActivity.Builder(applicationContext, NOTIFICATION_ID, notificationBuilder) // Sets the icon that appears on the watch face in active mode. .setAnimatedIcon(R.drawable.animated_walk) // Sets the icon that appears on the watch face in ambient mode. .setStaticIcon(R.drawable.ic_walk) // Sets the tap target to bring the user back to the app. .setTouchIntent(pendingIntent) .build()
বিজ্ঞপ্তি ও পোস্টে প্রয়োগ করুন
শেষ ধাপ হল, OngoingActivity-এর সাথে বিজ্ঞপ্তি লিঙ্ক করা এবং তারপরে
সেটি পোস্ট করা। ongoingActivity.apply() পদ্ধতিটি মূল
বিজ্ঞপ্তি বিল্ডারকে পরিবর্তন করে, প্রয়োজনীয় ডেটা যোগ করে যাতে সিস্টেমটি
অতিরিক্ত সারফেসে এটি দেখাতে পারে। এটি প্রয়োগ করার পরে, আপনি যথারীতি বিজ্ঞপ্তি তৈরি ও পোস্ট করতে
পারবেন।
// This call modifies notificationBuilder to include the ongoing activity data. ongoingActivity.apply(applicationContext) // Post the notification. startForeground(NOTIFICATION_ID, notificationBuilder.build())
লঞ্চারে ডায়নামিক স্ট্যাটাস টেক্সট যোগ করা
পূর্ববর্তী কোডটি ওয়াচ ফেসে ট্যাপ করা যায় এমন আইকন যোগ করে। লঞ্চারের সাম্প্রতিক বিভাগে আরও
সমৃদ্ধ, রিয়েল-টাইম আপডেট প্রদান করতে, একটি
Status অবজেক্ট তৈরি করুন এবং এটিকে আপনার OngoingActivity-এর সাথে অ্যাটাচ করুন। আপনি কাস্টম Status
প্রদান না করলে, সিস্টেম ডিফল্ট হিসেবে বিজ্ঞপ্তির
কন্টেন্ট টেক্সট (setContentText() ব্যবহার করে সেট করা) ব্যবহার করে। ডায়নামিক টেক্সট দেখাতে, একটি
Status.Builder ব্যবহার করুন। আপনি প্লেসহোল্ডার সহ একটি টেমপ্লেট স্ট্রিং ডিফাইন করতে এবং সেইসব প্লেসহোল্ডার পূরণ করার জন্য
Status.Part অবজেক্ট প্রদান করতে পারবেন। Status.Part হতে পারে
ডায়নামিক, যেমন স্টপওয়াচ বা টাইমার।
"[a স্টপওয়াচ টাইমার]-এর জন্য রান করুন" দেখায় এমন স্ট্যাটাস কীভাবে তৈরি করতে হয় তা নিম্নলিখিত উদাহরণ থেকে দেখুন:
// Define a template with placeholders for the activity type and the timer. val statusTemplate = "#type# for #time#" // Set the start time for a stopwatch. // Use SystemClock.elapsedRealtime() for time-based parts. val runStartTime = SystemClock.elapsedRealtime() val ongoingActivityStatus = Status.Builder() // Sets the template string. .addTemplate(statusTemplate) // Fills the #type# placeholder with a static text part. .addPart("type", Status.TextPart("Run")) // Fills the #time# placeholder with a stopwatch part. .addPart("time", Status.StopwatchPart(runStartTime)) .build()
সবশেষে, OngoingActivity.Builder-এ setStatus() নম্বরে কল করে এই Status-কে আপনার OngoingActivity-এর সাথে লিঙ্ক করুন।
val ongoingActivity = OngoingActivity.Builder(applicationContext, NOTIFICATION_ID, notificationBuilder) // ... // Add the status to the OngoingActivity. .setStatus(ongoingActivityStatus) .build()
অতিরিক্ত কাস্টমাইজেশন
Status-এর বাইরে, আপনি নিম্নলিখিত উপায়ে নিজের চলমান অ্যাক্টিভিটি বা বিজ্ঞপ্তি কাস্টমাইজ করতে পারেন।
তবে, OEM-এর প্রয়োগের উপর ভিত্তি করে এইসব কাস্টমাইজেশন ব্যবহার করা নাও হতে পারে।
চলমান বিজ্ঞপ্তি
- সেট করা বিভাগ থেকে চলমান অ্যাক্টিভিটির অগ্রাধিকার নির্ধারণ করা হয়।
CATEGORY_CALL: ইনকামিং ভয়েস বা ভিডিও কল অথবা একই ধরনের সিনক্রোনাস কমিউনিকেশন অনুরোধCATEGORY_NAVIGATION: ম্যাপ বা ধাপে ধাপে নেভিগেশনCATEGORY_TRANSPORT: প্লেব্যাকের জন্য মিডিয়া ট্রান্সপোর্ট কন্ট্রোলCATEGORY_ALARM: অ্যালার্ম বা টাইমারCATEGORY_WORKOUT: ওয়ার্কআউটCATEGORY_LOCATION_SHARING: সাময়িক লোকেশন শেয়ারিং বিভাগCATEGORY_STOPWATCH: স্টপওয়াচ
চলমান অ্যাক্টিভিটি
অ্যানিমেটেড আইকন: একটি সাদা-কালো ভেক্টর, যার ব্যাকগ্রাউন্ড স্বচ্ছ হলে ভালো হয়। অ্যাক্টিভ মোডে ওয়াচফেসে দেখানো হয়। অ্যানিমেটেড আইকন প্রদান করা না হলে, ডিফল্ট নোটিফিকেশন আইকন ব্যবহার করা হয়। প্রতিটি অ্যাপ্লিকেশনের জন্য ডিফল্ট বিজ্ঞপ্তির আইকন আলাদা আলাদা হয়।
স্ট্যাটিক আইকন: স্বচ্ছ ব্যাকগ্রাউন্ড সহ ভেক্টর আইকন। অ্যাম্বিয়েন্ট মোডে ওয়াচফেসে ডিসপ্লে করে। অ্যানিমেটেড আইকন সেট করা না থাকলে, অ্যাক্টিভ মোডে ওয়াচফেসে স্ট্যাটিক আইকন ব্যবহার করা হয়। এটি প্রদান করা না হলে, বিজ্ঞপ্তি আইকন ব্যবহার করা হয়। দুটিই সেট করা না থাকলে, ব্যতিক্রম ঘটে। (অ্যাপ লঞ্চার এখনও অ্যাপ আইকন ব্যবহার করে।)
OngoingActivityStatus: সাধারণ টেক্সট বা
Chronometer। অ্যাপ লঞ্চারের সাম্প্রতিক বিভাগে দেখানো হয়। এটি প্রদান করা না হলে, বিজ্ঞপ্তি "প্রসঙ্গ টেক্সট" ব্যবহার করা হয়।টাচ ইনটেন্ট:
PendingIntentব্যবহারকারী চলমান অ্যাক্টিভিটি আইকনে ট্যাপ করলে অ্যাপে ফিরে যাওয়ার জন্য ব্যবহার করা হয়। ওয়াচফেসে বা লঞ্চার আইটেমে দেখানো হয়। অ্যাপ লঞ্চ করার জন্য ব্যবহৃত আসল ইনটেন্ট থেকে এটি আলাদা হতে পারে। এটি প্রদান করা না হলে, বিজ্ঞপ্তির কন্টেন্ট ইনটেন্ট ব্যবহার করা হয়। দুটিই সেট করা না থাকলে ব্যতিক্রম ঘটে।LocusId: লঞ্চার শর্টকাট অ্যাসাইন করা আইডি যা চলমান অ্যাক্টিভিটির সাথে সম্পর্কিত। অ্যাক্টিভিটি চলাকালীন লঞ্চারের সাম্প্রতিক বিভাগে দেখানো হয় । এটি প্রদান করা না হলে, লঞ্চার একই প্যাকেজের সাম্প্রতিক বিভাগে থাকা সব অ্যাপ আইটেম লুকায় এবং শুধুমাত্র চলমান অ্যাক্টিভিটি দেখায়।চলমান অ্যাক্টিভিটি আইডি: কোনও অ্যাপ্লিকেশনে একাধিক চলমান অ্যাক্টিভিটি থাকলে
fromExistingOngoingActivity()-এর কল ডিসঅ্যাম্বিগুয়েট করতে ব্যবহৃত আইডি।
চলমান অ্যাক্টিভিটি আপডেট করা
আপনাকে নতুন বিজ্ঞপ্তি ও চলমান
অ্যাক্টিভিটি তৈরি করার পরিবর্তে, স্ট্যাটাস পরিবর্তন করার প্রয়োজন হলে, আগে থেকে থাকা বিজ্ঞপ্তির জন্য চলমান
অ্যাক্টিভিটি আপডেট করতে হবে। চলমান অ্যাক্টিভিটি ও পোস্ট করা বিজ্ঞপ্তি আপডেট করতে, আগে তৈরি করা
অবজেক্ট ব্যবহার করুন এবং নিম্নলিখিত
উদাহরণে দেখানো update() কল করুন:
ongoingActivity.update(context, newStatus)
যেসব ক্ষেত্রে Ongoing Activity-এর রেফারেন্স সেভ করা সম্ভব নয়, সেখানে Ongoing Activity রিকভার করার জন্য একটি স্ট্যাটিক পদ্ধতি আছে। তবে, এটি কম পছন্দ করা হয়:
OngoingActivity.recoverOngoingActivity(context) ?.update(context, newStatus)
চলমান অ্যাক্টিভিটি বন্ধ করা
চলমান অ্যাক্টিভিটি হিসেবে অ্যাপের কাজ শেষ হয়ে গেলে, শুধু চলমান বিজ্ঞপ্তিটি বাতিল করতে হবে।
এছাড়াও, বিজ্ঞপ্তি বা চলমান অ্যাক্টিভিটি ফোরগ্রাউন্ডে এলে আপনি সেটি বাতিল করে দিতে পারেন এবং ব্যাকগ্রাউন্ডে ফিরে গেলে আবার তৈরি করতে পারেন, তবে এটি করার প্রয়োজন নেই।
চলমান অ্যাক্টিভিটি পজ করা
আপনার অ্যাপে যদি স্পষ্টত বন্ধ করার অ্যাকশন থাকে, তাহলে এটি আনপজ করার পরে চলমান অ্যাক্টিভিটি চালিয়ে যান । যেসব অ্যাপের জন্য কোনও স্পষ্ট স্টপ অ্যাকশন নেই, সেগুলির অ্যাক্টিভিটি পজ করা হলে সেটি বন্ধ করে দিন।
গুরুত্বপূর্ণ বিষয়
Ongoing Activity API-এর সাথে কাজ করার সময় নিম্নলিখিত বিষয়গুলি মনে রাখবেন:
আপনার চলমান অ্যাক্টিভিটির জন্য একটি স্ট্যাটিক আইকন সেট করুন, স্পষ্টভাবে অথবা বিজ্ঞপ্তি ব্যবহার করে ফলব্যাক হিসেবে। না পেলে, আপনি একটি
IllegalArgumentExceptionপাবেন।স্বচ্ছ ব্যাকগ্রাউন্ড সহ সাদা-কালো ভেক্টর আইকন ব্যবহার করুন।
আপনার চলমান অ্যাক্টিভিটির জন্য স্পষ্টভাবে অথবা বিজ্ঞপ্তি ব্যবহার করে ফলব্যাক হিসেবে টাচ ইনটেন্ট সেট করুন। না পেলে, আপনি একটি
IllegalArgumentExceptionপাবেন।আপনার অ্যাপের ম্যানিফেস্টে একাধিক
MAIN LAUNCHERঅ্যাক্টিভিটি ঘোষণা করা থাকলে, ডায়নামিক শর্টকাট প্রকাশ করুন এবংLocusIdব্যবহার করে আপনার চলমান অ্যাক্টিভিটির সাথে সেটি অ্যাসোসিয়েট করুন।
Wear OS ডিভাইসে মিডিয়া চালানোর সময় মিডিয়া বিজ্ঞপ্তি প্রকাশ করা
Wear OS ডিভাইসে মিডিয়া কন্টেন্ট চললে, মিডিয়া বিজ্ঞপ্তি প্রকাশ করুন। এর ফলে সিস্টেম সংশ্লিষ্ট চলমান অ্যাক্টিভিটি তৈরি করতে পারে।
আপনি Media3 ব্যবহার করলে, বিজ্ঞপ্তি অটোমেটিক প্রকাশিত হয়। আপনি
ম্যানুয়ালি বিজ্ঞপ্তি তৈরি করলে, সেটিতে
MediaStyleNotificationHelper.MediaStyle ব্যবহার করতে হবে এবং সংশ্লিষ্ট
MediaSession-এ সেশন অ্যাক্টিভিটি থাকতে হবে।
আপনার জন্য সাজেস্ট করা হয়েছে
- মনে রাখবেন: জাভাস্ক্রিপ্ট বন্ধ থাকলে লিঙ্ক টেক্সট দেখানো হয়
- বিজ্ঞপ্তি তৈরি করো {:#notification}
- Ongoing Activity API-এর মাধ্যমে Wear OS ব্যবহারকারীদের সাথে নতুন উপায়ে এনগেজ হওয়া
- প্রসারিত করা যায় এমন বিজ্ঞপ্তি তৈরি করা {:#expandable-notification}