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

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

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

স্থায়ী বিজ্ঞপ্তিগুলিকে একত্রিত করুন

উপাদান

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


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

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

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

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

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

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

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

এই বিভাগে শেয়ার্ড পারসিস্টেন্ট নোটিফিকেশন ব্যবহারের বিভিন্ন পরিস্থিতি বিস্তারিতভাবে বর্ণনা করা হয়েছে।

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

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

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

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 তৈরি করার পরে, আপনি নিম্নলিখিত কোড ব্যবহার করে নেভিগেশন SDK-কে এর সাথে সংযুক্ত করবেন:

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

সতর্কতা এবং ভবিষ্যৎ পরিকল্পনা

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