মোবাইল বিজ্ঞপ্তি একত্রিত করুন

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

আপনি যখন নেভিগেশন SDK-এর মতো SDK ব্যবহার করেন তখন এই সমস্যাটি আরও চ্যালেঞ্জিং হয়ে ওঠে, যা অ্যাপ থেকে স্বাধীনভাবে ফোরগ্রাউন্ড পরিষেবাগুলি চালায় যার নিজস্ব স্বাধীন স্থায়ী বিজ্ঞপ্তি রয়েছে, যা তাদের একত্রিত করা কঠিন করে তোলে। এইসব সমস্যার সমাধান করতে, Navigation SDK v1.11 একটি সহজ API নিয়ে এসেছে যা SDK সহ অ্যাপ জুড়ে স্থায়ী বিজ্ঞপ্তি ম্যানেজ করতে সাহায্য করে।

ধারাবাহিক বিজ্ঞপ্তি একত্রিত করুন

উপাদানগুলি

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


Navigation SDK-তে ForegroundServiceManager সিঙ্গলটন শুরু করা এবং পাওয়ার জন্য স্ট্যাটিক পদ্ধতি রয়েছে। এই সিঙ্গলটন শুধুমাত্র একবারই শুরু করা যাবে Navigation SDK-এর লাইফটাইমে। ফলস্বরূপ, আপনি যদি ইনিশিয়ালাইজেশন কল (initForegroundServiceManagerMessageAndIntent() বা initForegroundServiceManagerProvider()) ব্যবহার করেন, তাহলে সেই পাথ আবার ব্যবহার করা হলে আপনাকে এটি try-catch ব্লকের মধ্যে রাখতে হবে। আপনি যদি কোনও একটি পদ্ধতি একাধিকবার কল করেন, তাহলে Navigation SDK রানটাইম এক্সেপশন থ্রো করে, যদি না আপনি প্রথমে ForegroundServiceManager-এর সব রেফারেন্স মুছে দেন এবং পরবর্তী প্রতিটি কলের আগে clearForegroundServiceManager() কল করেন।

initForegroundServiceManagerMessageAndIntent()-এর চারটি প্যারামিটার হল application, notificationId, defaultMessage এবং resumeIntent। শেষ তিনটি প্যারামিটার নাল হলে, বিজ্ঞপ্তিটি স্ট্যান্ডার্ড Navigation SDK বিজ্ঞপ্তি। এই বিজ্ঞপ্তির পিছনে অ্যাপে অন্যান্য ফোরগ্রাউন্ড পরিষেবা লুকানো এখনও সম্ভব। notificationId প্যারামিটার বিজ্ঞপ্তির জন্য ব্যবহার করা উচিত এমন বিজ্ঞপ্তি আইডি নির্দিষ্ট করে। এটি null হলে, একটি ইচ্ছামত মান ব্যবহার করা হয়। অন্যান্য বিজ্ঞপ্তির সাথে দ্বন্দ্ব এড়াতে আপনি এটি স্পষ্টভাবে সেট করতে পারেন, যেমন অন্য SDK থেকে আসা বিজ্ঞপ্তি। defaultMessage হল একটি স্ট্রিং যা সিস্টেম নেভিগেট না করলে দেখানো হয়। resumeIntent হল একটি ইনটেন্ট যা বিজ্ঞপ্তিতে ক্লিক করা হলে ট্রিগার হয়। resumeIntent নাল হলে, বিজ্ঞপ্তিতে ক্লিক উপেক্ষা করা হয়।

initForegroundServiceManagerProvider()-এর তিনটি প্যারামিটার হল application, notificationId এবং notificationProvider। শেষের দুটি প্যারামিটার নাল হলে, বিজ্ঞপ্তিটি স্ট্যান্ডার্ড নেভিগেশন SDK বিজ্ঞপ্তি হিসেবে বিবেচিত হয়। notificationId প্যারামিটার বিজ্ঞপ্তির আইডি নির্দিষ্ট করে যা বিজ্ঞপ্তির জন্য ব্যবহার করা উচিত। এটি নাল হলে, একটি ইচ্ছামত ভ্যালু ব্যবহার করা হয়। অন্যান্য বিজ্ঞপ্তির সাথে বিরোধ এড়াতে আপনি এটি স্পষ্টভাবে সেট করতে পারেন, যেমন অন্য SDK থেকে আসা বিজ্ঞপ্তি। notificationProvider সেট করা থাকলে, প্রোভাইডার সবসময় বিজ্ঞপ্তি রেন্ডার করার জন্য দায়বদ্ধ থাকে।

Navigation SDK getForegroundServiceManager() পদ্ধতি ফোরগ্রাউন্ড সার্ভিস ম্যানেজার সিঙ্গলটন রিটার্ন করে। আপনি এখনও কোনওটি জেনারেট না করে থাকলে, notificationId, defaultMessage এবং resumeIntent-এর জন্য নাল প্যারামিটার সহ initForegroundServiceManagerMessageAndIntent() কল করার সমতুল্য।

ForegroundServiceManager-এর তিনটি সহজ পদ্ধতি আছে। প্রথম দুটি হল ফোরগ্রাউন্ডে কোনও পরিষেবা সরানো এবং সেখান থেকে বের করে আনার জন্য এবং সাধারণত তৈরি করা পরিষেবার মধ্যে থেকে কল করা হয়। এইসব পদ্ধতি ব্যবহার করলে, পরিষেবাগুলি যে শেয়ার করা স্থায়ী বিজ্ঞপ্তির সাথে যুক্ত তা নিশ্চিত করা যায়। চূড়ান্ত পদ্ধতি, updateNotification(), ম্যানেজারকে ফ্ল্যাগ করে যে বিজ্ঞপ্তি পরিবর্তন হয়েছে এবং আবার রেন্ডার করতে হবে।

শেয়ার করা স্থায়ী বিজ্ঞপ্তির সম্পূর্ণ কন্ট্রোল আপনার প্রয়োজন হলে, API একটি NotificationContentProvider ইন্টারফেস প্রদান করে যা বিজ্ঞপ্তি প্রদানকারীকে সংজ্ঞায়িত করে, এতে বর্তমান কন্টেন্ট সহ বিজ্ঞপ্তি পাওয়ার জন্য একটি পদ্ধতি থাকে। এটি একটি মূল ক্লাসও প্রদান করে, যা আপনি প্রদানকারীকে সংজ্ঞায়িত করতে সাহায্য করার জন্য ঐচ্ছিকভাবে ব্যবহার করতে পারেন। মূল ক্লাসের অন্যতম প্রধান উদ্দেশ্য হল, এটি ForegroundServiceManager অ্যাক্সেস করার প্রয়োজন ছাড়াই updateNotification() কল করার উপায় প্রদান করে। নতুন বিজ্ঞপ্তি মেসেজ পাওয়ার জন্য আপনি বিজ্ঞপ্তি প্রদানকারীর ইনস্ট্যান্স ব্যবহার করলে, বিজ্ঞপ্তিতে মেসেজ দেখানোর জন্য আপনি সরাসরি এই ইন্টার্নাল পদ্ধতি কল করতে পারেন।

ব্যবহারের পরিস্থিতি

এই বিভাগে শেয়ার করা পারসিস্টেন্ট বিজ্ঞপ্তি ব্যবহারের পরিস্থিতি সম্পর্কে বিস্তারিত বিবরণ দেওয়া হয়েছে।

অন্য অ্যাপের ফোরগ্রাউন্ড পরিষেবার স্থায়ী বিজ্ঞপ্তি লুকান
সবচেয়ে সহজ উপায় হল বর্তমান আচরণ বজায় রাখা এবং Navigation SDK তথ্য দেখানোর জন্য শুধুমাত্র স্থায়ী বিজ্ঞপ্তি ব্যবহার করা। অন্যান্য পরিষেবা ফোরগ্রাউন্ড সার্ভিস ম্যানেজার startForeground() এবং stopForeground() পদ্ধতি ব্যবহার করে এই বিজ্ঞপ্তির পিছনে লুকাতে পারে।
অন্য অ্যাপের ফোরগ্রাউন্ড পরিষেবার স্থায়ী বিজ্ঞপ্তি লুকান, তবে নেভিগেট না করার সময় ডিফল্ট টেক্সট দেখানোর জন্য সেট করুন
দ্বিতীয় সবচেয়ে সহজ উপায় হল বর্তমান আচরণ বজায় রাখা এবং শুধুমাত্র Navigation SDK তথ্য রেন্ডার করার জন্য স্থায়ী বিজ্ঞপ্তি ব্যবহার করা, তবে সিস্টেম নেভিগেট না করলে এটি প্রযোজ্য নয়। সিস্টেম নেভিগেট না করলে, ডিফল্ট Navigation SDK স্ট্রিংয়ের পরিবর্তে initForegroundServiceManagerMessageAndIntent()-এ প্রদান করা স্ট্রিং দেখানো হয়, যেখানে "Google Maps" উল্লেখ করা থাকে। এছাড়াও, আপনি এই কল ব্যবহার করে বিজ্ঞপ্তি ক্লিক করা হলে আবার চালু করার ইনটেন্ট সেট করতে পারবেন।
ধারাবাহিক বিজ্ঞপ্তির রেন্ডারিংয়ের উপর সম্পূর্ণ নিয়ন্ত্রণ নিন
চূড়ান্ত পরিস্থিতিতে, বিজ্ঞপ্তি প্রদানকারীকে সংজ্ঞায়িত ও তৈরি করতে হবে এবং initForegroundServiceManagerProvider() ব্যবহার করে ForegroundServiceManager-এ পাস করতে হবে। এই বিকল্পটি আপনাকে বিজ্ঞপ্তিতে কী দেখানো হবে তার সম্পূর্ণ নিয়ন্ত্রণ দেয়, তবে এটি বিজ্ঞপ্তি থেকে নেভিগেশন SDK বিজ্ঞপ্তির তথ্যও ডিসকানেক্ট করে, যার ফলে বিজ্ঞপ্তিতে দেখানো সহায়ক এক এক করে প্রম্পটগুলি সরিয়ে দেয়। Google এই তথ্য ফিরিয়ে আনার এবং বিজ্ঞপ্তিতে এটি যোগ করার সহজ উপায় প্রদান করে না।

উদাহরণ বিজ্ঞপ্তি প্রদানকারী

নিম্নলিখিত কোডের উদাহরণ থেকে বোঝা যায় যে কীভাবে একটি সাধারণ বিজ্ঞপ্তি কন্টেন্ট প্রোভাইডার ব্যবহার করে বিজ্ঞপ্তি তৈরি করা ও ফিরিয়ে আনা যায়।

public class NotificationContentProviderImpl
   extends NotificationContentProviderBase
   implements NotificationContentProvider {
 private String channelId;
 private Context context;
 private String message;

 /** Constructor */
 public NotificationContentProviderImpl(Application application) {
   super(application);
   message = "-- uninitialized --";
   channelId = null;
   this.context = application;
 }

 /**
  * Sets message to display in the notification. Calls updateNotification
  * to display the message immediately.
  *
  * @param msg The message to display in the notification.
  */
 public void setMessage(String msg) {
   message = msg;
   updateNotification();
 }

 /**
  * Returns the notification as it should be rendered.
  */
 @Override
 public Notification getNotification() {
   Notification notification;

   if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
     Spanned styledText = Html.fromHtml(message, FROM_HTML_MODE_LEGACY);
     String channelId = getChannelId(context);
     notification =
         new Notification.Builder(context, channelId)
             .setContentTitle("Notifications Demo")
             .setStyle(new Notification.BigTextStyle()
                 .bigText(styledText))
             .setSmallIcon(R.drawable.ic_navigation_white_24dp)
             .setTicker("ticker text")
             .build();
   } else {
     notification = new Notification.Builder(context)
         .setContentTitle("Notification Demo")
         .setContentText("testing non-O text")
         .build();
   }

   return notification;
 }

 // Helper to set up a channel ID.
 private String getChannelId(Context context) {
   if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
     if (channelId == null) {
       NotificationManager notificationManager =
           (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
       NotificationChannel channel = new NotificationChannel(
           "default", "navigation", NotificationManager.IMPORTANCE_DEFAULT);
       channel.setDescription("For navigation persistent notification.");
       notificationManager.createNotificationChannel(channel);
       channelId = channel.getId();
     }
     return channelId;
   } else {
     return "";
   }
 }
}

NotificationContentProviderImpl তৈরি করার পরে, আপনি নিম্নলিখিত কোড ব্যবহার করে এটির সাথে Navigation SDK কানেক্ট করেন:

ForegroundServiceManager f = NavigationApi.getForegroundServiceManager(getApplication());
mNotification = new NotificationContentProviderImpl(getApplication());
NavigationApi.clearForegroundServiceManager();
NavigationApi.initForegroundServiceManagerProvider(getApplication(), null, mNotification);

সতর্কতা ও ভবিষ্যতের পরিকল্পনা

  • initForegroundServiceManagerMessageAndIntent() বা initForegroundServiceManagerProvider()-কে আগে কল করতে ভুলবেন না যাতে প্রত্যাশিত ব্যবহারের পরিস্থিতি ভালভাবে সংজ্ঞায়িত করা যায়। নতুন নেভিগেটর তৈরি করার আগে আপনাকে অবশ্যই এই পদ্ধতিটি কল করতে হবে।
  • কোড পাথওয়েতে একাধিকবার প্রবেশ করা হলে, initForegroundServiceManagerMessageAndIntent() বা initForegroundServiceManagerProvider()-এ কল করার সময় ব্যতিক্রমগুলি ধরতে ভুলবেন না। Navigation SDK v2.0-এ, এই পদ্ধতি একাধিকবার কল করলে রানটাইম এক্সেপশনের পরিবর্তে চেক করা এক্সেপশন থ্রো করে।
  • Google-কে এখনও বিজ্ঞপ্তি লাইফটাইম জুড়ে ধারাবাহিক স্টাইলিং পেতে কাজ করতে হতে পারে যা হেডার স্টাইলিংয়ের সাথে ম্যাচ করে।
  • আপনি বিজ্ঞপ্তি প্রদানকারীকে সংজ্ঞায়িত করলে, আপনি অগ্রাধিকারের সাথে হেডস-আপ আচরণ নিয়ন্ত্রণ করতে পারেন।
  • Google এক এক করে তথ্য ফিরিয়ে আনার সহজ উপায় প্রদান করে না যা বিজ্ঞপ্তি প্রদানকারী বিজ্ঞপ্তিতে যোগ করতে পারে।