চলমান কার্যকলাপ প্রদর্শন করুন

Wear OS ডিভাইসগুলো প্রায়শই দীর্ঘ সময় ধরে কাজ করার জন্য ব্যবহৃত হয়, যেমন ওয়ার্কআউট ট্র্যাক করা। এটি ব্যবহারকারীর অভিজ্ঞতার ক্ষেত্রে একটি চ্যালেঞ্জ তৈরি করে: যদি কোনো ব্যবহারকারী কোনো কাজ শুরু করার পর ওয়াচ ফেসে চলে যান, তাহলে তিনি কীভাবে ফিরে আসবেন? লঞ্চার ব্যবহার করে অ্যাপে ফিরে আসা কঠিন হতে পারে, বিশেষ করে চলাচলের সময়, যা অপ্রয়োজনীয় অসুবিধা তৈরি করে।

এর সমাধান হলো একটি চলমান নোটিফিকেশনকে একটি OngoingActivity সাথে যুক্ত করা। এর ফলে ডিভাইসটি ইউজার ইন্টারফেস জুড়ে দীর্ঘক্ষণ ধরে চলা কার্যকলাপ সম্পর্কে তথ্য প্রদর্শন করতে পারে, যা ওয়াচ ফেসের নিচের দিকে ট্যাপযোগ্য আইকনের মতো ফিচারগুলো সক্রিয় করে। এটি ব্যবহারকারীদের ব্যাকগ্রাউন্ড টাস্ক সম্পর্কে অবগত রাখে এবং এক ট্যাপেই অ্যাপে ফিরে আসার সুযোগ করে দেয়।

একটি চলমান কার্যকলাপ আপনার অ্যাপকে দীর্ঘ সময়ের জন্য দৃশ্যমান রাখে, যার ফলে একটি নির্দিষ্ট সময় নিষ্ক্রিয় থাকার পর সিস্টেম আবার ওয়াচ ফেসে ফিরে আসে না। আরও তথ্যের জন্য, Wear-এ আপনার অ্যাপ দৃশ্যমান রাখুন দেখুন।

উদাহরণস্বরূপ, এই ওয়ার্কআউট অ্যাপটিতে, তথ্যটি ব্যবহারকারীর ওয়াচ ফেসে একটি ট্যাপযোগ্য দৌড়ানোর আইকন হিসেবে প্রদর্শিত হতে পারে:

চলমান-আইকন

চিত্র ১. সক্রিয়তা সূচক।

একটি চলমান নোটিফিকেশন গ্লোবাল অ্যাপ লঞ্চারের রিসেন্টস সেকশনেও তথ্য প্রদর্শন করে। এটি ব্যবহারকারীদের তাদের কাজের অবস্থা দেখার এবং অ্যাপটির সাথে পুনরায় যুক্ত হওয়ার জন্য আরও একটি সুবিধাজনক জায়গা প্রদান করে:

লঞ্চার

চিত্র ২. গ্লোবাল লঞ্চার।

নিম্নলিখিত পরিস্থিতিগুলিতে একটি চলমান কার্যকলাপের সাথে সংযুক্ত একটি চলমান বিজ্ঞপ্তি ব্যবহার করা যেতে পারে:

টাইমার

চিত্র ৩. টাইমার: সক্রিয়ভাবে সময় গণনা করে এবং টাইমারটি থামানো বা বন্ধ করা হলে তা শেষ হয়ে যায়।

মানচিত্র

চিত্র ৪। ধাপে ধাপে দিকনির্দেশনা: কোনো গন্তব্যে যাওয়ার পথনির্দেশ ঘোষণা করে। ব্যবহারকারী গন্তব্যে পৌঁছালে বা দিকনির্দেশনা বন্ধ করলে এটি শেষ হয়।

সঙ্গীত

চিত্র ৫. মিডিয়া: একটি সেশন জুড়ে সঙ্গীত বাজায়। ব্যবহারকারী সেশনটি বিরতি দিলেই এটি সঙ্গে সঙ্গে বন্ধ হয়ে যায়।

Wear মিডিয়া অ্যাপগুলির জন্য স্বয়ংক্রিয়ভাবে চলমান কার্যকলাপ তৈরি করে।

অন্যান্য ধরনের অ্যাপের জন্য অনগোয়িং অ্যাক্টিভিটি তৈরির একটি বিশদ উদাহরণের জন্য অনগোয়িং অ্যাক্টিভিটি কোডল্যাবটি দেখুন।

সেটআপ

আপনার অ্যাপে Ongoing Activity API ব্যবহার শুরু করতে, আপনার অ্যাপের build.gradle ফাইলে নিম্নলিখিত ডিপেন্ডেন্সিগুলো যোগ করুন:

dependencies {
  implementation "androidx.wear:wear-ongoing:1.1.0"
  implementation "androidx.core:core:1.18.0"
}

একটি চলমান কার্যকলাপ তৈরি করুন

এই প্রক্রিয়ায় তিনটি ধাপ রয়েছে:

  1. একটি স্ট্যান্ডার্ড NotificationCompat.Builder তৈরি করুন এবং এটিকে চলমান হিসেবে কনফিগার করুন।
  2. একটি OngoingActivity অবজেক্ট তৈরি ও কনফিগার করুন এবং এতে নোটিফিকেশন বিল্ডারটি পাস করুন।
  3. নোটিফিকেশন বিল্ডারে চলমান কার্যকলাপটি প্রয়োগ করুন এবং ফলস্বরূপ নোটিফিকেশনটি পোস্ট করুন।

বিজ্ঞপ্তি তৈরি এবং কনফিগার করুন

প্রথমে একটি 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.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 ডাইনামিক হতে পারে, যেমন একটি স্টপওয়াচ বা টাইমার।

নিম্নলিখিত উদাহরণটি দেখায় কিভাবে "[একটি স্টপওয়াচ টাইমারের জন্য] চালান" প্রদর্শন করে এমন একটি স্ট্যাটাস তৈরি করতে হয়:

// 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.BuildersetStatus() কল করে এই 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 : স্টপওয়াচ

চলমান কার্যকলাপ

  • অ্যানিমেটেড আইকন: একটি সাদা-কালো ভেক্টর, বিশেষত স্বচ্ছ পটভূমিসহ। সক্রিয় মোডে এটি ওয়াচ ফেসে প্রদর্শিত হয়। যদি অ্যানিমেটেড আইকন প্রদান করা না হয়, তবে ডিফল্ট নোটিফিকেশন আইকনটি ব্যবহৃত হয়। প্রতিটি অ্যাপ্লিকেশনের জন্য ডিফল্ট নোটিফিকেশন আইকন ভিন্ন ভিন্ন হয়।

  • স্ট্যাটিক আইকন: একটি স্বচ্ছ ব্যাকগ্রাউন্ডসহ ভেক্টর আইকন। এটি অ্যাম্বিয়েন্ট মোডে ওয়াচ ফেসে প্রদর্শিত হয়। যদি অ্যানিমেটেড আইকন সেট করা না থাকে, তাহলে অ্যাক্টিভ মোডে ওয়াচ ফেসে স্ট্যাটিক আইকনটি ব্যবহৃত হয়। যদি এটিও প্রদান করা না হয়, তাহলে নোটিফিকেশন আইকনটি ব্যবহৃত হয়। যদি কোনোটিই সেট করা না থাকে, তাহলে একটি এক্সেপশন থ্রো করা হয়। (অ্যাপ লঞ্চারটি অ্যাপ আইকনই ব্যবহার করে।)

  • চলমান কার্যকলাপের অবস্থা: সাধারণ টেক্সট অথবা একটি Chronometer । অ্যাপ লঞ্চারের রিসেন্টস বিভাগে প্রদর্শিত হয়। এটি প্রদান করা না হলে, নোটিফিকেশনের 'কন্টেক্সট টেক্সট' ব্যবহৃত হয়।

  • টাচ ইন্টেন্ট: একটি PendingIntent ব্যবহারকারী 'অনগোয়িং অ্যাক্টিভিটি' আইকনে ট্যাপ করলে অ্যাপে ফিরে যাওয়ার জন্য ব্যবহৃত হয়। এটি ওয়াচ ফেসে বা লঞ্চার আইটেমে প্রদর্শিত হয়। এটি অ্যাপটি চালু করার জন্য ব্যবহৃত মূল ইন্টেন্ট থেকে ভিন্ন হতে পারে। যদি এটি প্রদান করা না হয়, তাহলে নোটিফিকেশনের কন্টেন্ট ইন্টেন্ট ব্যবহৃত হয়। যদি কোনোটিই সেট করা না থাকে, তাহলে একটি এক্সেপশন থ্রো করা হয়।

  • LocusId : এই আইডিটি চলমান অ্যাক্টিভিটির সাথে সম্পর্কিত লঞ্চার শর্টকাটটি নির্ধারণ করে। অ্যাক্টিভিটি চলাকালীন এটি লঞ্চারের Recents সেকশনে প্রদর্শিত হয়। এটি প্রদান করা না হলে, লঞ্চার Recents সেকশনে থাকা একই প্যাকেজের সমস্ত অ্যাপ আইটেম লুকিয়ে ফেলে এবং শুধুমাত্র চলমান অ্যাক্টিভিটিটি দেখায়।

  • চলমান কার্যকলাপ আইডি: যখন কোনো অ্যাপ্লিকেশনে একাধিক চলমান কার্যকলাপ থাকে, তখন fromExistingOngoingActivity() কলগুলোকে আলাদা করতে এই আইডি ব্যবহার করা হয়।

চলমান কার্যকলাপ আপডেট করুন

যখন স্ট্যাটাস পরিবর্তন করার প্রয়োজন হয়, তখন নতুন নোটিফিকেশন এবং Ongoing Activity তৈরি করার পরিবর্তে বিদ্যমান নোটিফিকেশনটির জন্য Ongoing Activity আপডেট করা উচিত। Ongoing Activity এবং পোস্ট করা নোটিফিকেশনটি আপডেট করতে, পূর্বে তৈরি করা অবজেক্টটি ব্যবহার করুন এবং update() কল করুন, যেমনটি নিম্নলিখিত উদাহরণে দেখানো হয়েছে:

ongoingActivity.update(context, newStatus)

যেসব ক্ষেত্রে Ongoing Activity-র রেফারেন্স সংরক্ষণ করা সম্ভব হয় না, সেখানে Ongoing Activity পুনরুদ্ধার করার জন্য একটি স্ট্যাটিক মেথড রয়েছে। তবে, এটি কম পছন্দনীয়:

OngoingActivity.recoverOngoingActivity(context)
    ?.update(context, newStatus)

চলমান কার্যকলাপ বন্ধ করুন

যখন অ্যাপটি একটি চলমান কার্যকলাপ হিসাবে চলা শেষ করে, তখন শুধু চলমান নোটিফিকেশনটি বাতিল করলেই চলে।

আপনি চাইলে ফোরগ্রাউন্ডে আসার সময় নোটিফিকেশন বা চলমান কার্যকলাপটি বাতিল করে দিতে পারেন এবং আবার ব্যাকগ্রাউন্ডে ফিরে গেলে সেগুলোকে পুনরায় তৈরি করতে পারেন, কিন্তু এটি আবশ্যক নয়।

চলমান কার্যকলাপ বিরতি দিন

আপনার অ্যাপে যদি একটি সুস্পষ্ট স্টপ অ্যাকশন থাকে, তাহলে অ্যাপটি আনপজ করার পর অনগোয়িং অ্যাক্টিভিটিটি চালিয়ে যান। সুস্পষ্ট স্টপ অ্যাকশনবিহীন অ্যাপের ক্ষেত্রে, অ্যাপটি পজ করা হলে অ্যাক্টিভিটিটি শেষ করে দিন।

মূল বিবেচ্য বিষয়

Ongoing Activity API নিয়ে কাজ করার সময় নিম্নলিখিত বিষয়গুলো মনে রাখবেন:

  • আপনার চলমান অ্যাক্টিভিটির জন্য একটি স্থির আইকন সেট করুন, হয় স্পষ্টভাবে অথবা নোটিফিকেশন ব্যবহার করে একটি ফলব্যাক হিসেবে। যদি আপনি তা না করেন, তাহলে আপনি একটি IllegalArgumentException পাবেন।

  • স্বচ্ছ ব্যাকগ্রাউন্ডসহ সাদা-কালো ভেক্টর আইকন ব্যবহার করুন।

  • আপনার চলমান অ্যাক্টিভিটির জন্য একটি টাচ ইন্টেন্ট সেট করুন, হয় স্পষ্টভাবে অথবা নোটিফিকেশন ব্যবহার করে একটি ফলব্যাক হিসেবে। যদি আপনি তা না করেন, তাহলে আপনি একটি IllegalArgumentException পাবেন।

  • আপনার অ্যাপের ম্যানিফেস্টে যদি একাধিক MAIN LAUNCHER অ্যাক্টিভিটি ঘোষিত থাকে, তাহলে একটি ডাইনামিক শর্টকাট পাবলিশ করুন এবং LocusId ব্যবহার করে সেটিকে আপনার চলমান অ্যাক্টিভিটির (Ongoing Activity) সাথে যুক্ত করুন।

Wear OS ডিভাইসে মিডিয়া চালানোর সময় মিডিয়া নোটিফিকেশন প্রকাশ করুন

যদি কোনো Wear OS ডিভাইসে মিডিয়া কন্টেন্ট চলতে থাকে, তাহলে একটি মিডিয়া নোটিফিকেশন প্রকাশ করুন । এর ফলে সিস্টেম সংশ্লিষ্ট চলমান অ্যাক্টিভিটিটি তৈরি করতে পারে।

আপনি যদি Media3 ব্যবহার করেন, তাহলে নোটিফিকেশনটি স্বয়ংক্রিয়ভাবে প্রকাশিত হয়। যদি আপনি ম্যানুয়ালি আপনার নোটিফিকেশন তৈরি করেন, তবে তাতে MediaStyleNotificationHelper.MediaStyle ব্যবহার করতে হবে এবং সংশ্লিষ্ট MediaSession এর সেশন অ্যাক্টিভিটি পূরণ করা থাকতে হবে।

{% হুবহু %} {% endverbatim %} {% হুবহু %} {% endverbatim %}