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

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

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

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

চলমান-আইকন

চিত্র 1. কার্যকলাপ নির্দেশক।

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

লঞ্চার

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

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

টাইমার

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

মানচিত্র

চিত্র 4. পালাক্রমে নেভিগেশন: একটি গন্তব্যের দিকনির্দেশ ঘোষণা করে। ব্যবহারকারী যখন গন্তব্যে পৌঁছায় বা নেভিগেশন বন্ধ করে তখন শেষ হয়।

সঙ্গীত

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

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

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

সেটআপ

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

dependencies {
  implementation "androidx.wear:wear-ongoing:1.1.0"
  implementation "androidx.core:core:1.17.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 : আইডি যা লঞ্চার শর্টকাট বরাদ্দ করে যা চলমান কার্যকলাপের সাথে মিলে যায়। কার্যকলাপ চলমান থাকাকালীন সাম্প্রতিক বিভাগে লঞ্চারে প্রদর্শিত হয়৷ যদি প্রদান না করা হয়, লঞ্চারটি একই প্যাকেজ থেকে সাম্প্রতিক বিভাগে সমস্ত অ্যাপ আইটেম লুকিয়ে রাখে এবং শুধুমাত্র চলমান কার্যকলাপ দেখায়।

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

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

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

অ্যাপটি ব্যাকগ্রাউন্ডে চলমান থাকলে, এটি চলমান কার্যকলাপ API-এ আপডেট পাঠাতে পারে। যাইহোক, এটি খুব ঘন ঘন করবেন না, কারণ আপডেট পদ্ধতিটি একে অপরের খুব কাছাকাছি কলগুলিকে উপেক্ষা করে। প্রতি মিনিটে কয়েকটি আপডেট যুক্তিসঙ্গত।

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

ongoingActivity.update(context, newStatus)

একটি সুবিধা হিসাবে, একটি চলমান কার্যকলাপ তৈরি করার জন্য একটি স্থির পদ্ধতি আছে।

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

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

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

আপনি বিজ্ঞপ্তি বা চলমান কার্যকলাপ বাতিল করতেও বেছে নিতে পারেন যখন এটি অগ্রভাগে আসে, তারপর পটভূমিতে ফিরে যাওয়ার সময় সেগুলি পুনরায় তৈরি করুন, তবে এটির প্রয়োজন নেই৷

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

যদি আপনার অ্যাপে একটি সুস্পষ্ট স্টপ অ্যাকশন থাকে, তাহলে এটি আনপজ করার পরে চলমান অ্যাক্টিভিটি চালিয়ে যান। একটি স্পষ্ট স্টপ অ্যাকশন ছাড়াই একটি অ্যাপের জন্য, ক্রিয়াকলাপটি বন্ধ হয়ে গেলে শেষ করুন৷

সর্বোত্তম অনুশীলন

চলমান কার্যকলাপ API এর সাথে কাজ করার সময় নিম্নলিখিত বিষয়গুলি মনে রাখবেন:

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

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

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

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

Wear OS ডিভাইসে মিডিয়া চালানোর সময় মিডিয়া বিজ্ঞপ্তি প্রকাশ করুন

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

আপনি Media3 ব্যবহার করলে, বিজ্ঞপ্তি স্বয়ংক্রিয়ভাবে প্রকাশিত হয়। আপনি যদি ম্যানুয়ালি আপনার বিজ্ঞপ্তি তৈরি করেন, তাহলে এটি MediaStyleNotificationHelper.MediaStyle ব্যবহার করবে, এবং সংশ্লিষ্ট MediaSession এর সেশন কার্যকলাপ জনবহুল হওয়া উচিত।

{% শব্দার্থে %} {% endverbatim %} {% শব্দার্থে %} {% endverbatim %}