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

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

ন্যাভিগেশন SDK-তে ForegroundServiceManager সিঙ্গেলটন ইনিশিয়ালাইজ এবং পাওয়ার জন্য স্ট্যাটিক পদ্ধতি রয়েছে। এই সিঙ্গেলটনটি নেভিগেশন SDK-এর জীবদ্দশায় শুধুমাত্র একবারই ইনিশিয়ালাইজ করা যেতে পারে। ফলস্বরূপ, যদি আপনি ইনিশিয়ালাইজেশন কলগুলির মধ্যে একটি ( initForegroundServiceManagerMessageAndIntent() অথবা initForegroundServiceManagerProvider() ) ব্যবহার করেন, তাহলে সেই পাথটি পুনরায় প্রবেশ করানোর ক্ষেত্রে আপনার এটিকে একটি try-catch ব্লক দিয়ে ঘিরে রাখা উচিত। যদি আপনি ForegroundServiceManager এর সমস্ত রেফারেন্স মুছে ফেলেন এবং প্রতিটি পরবর্তী কলের আগে clearForegroundServiceManager() কল করেন তবে ন্যাভিগেশন SDK একটি রানটাইম ব্যতিক্রম প্রদান করে।
initForegroundServiceManagerMessageAndIntent() এর চারটি প্যারামিটার হল application , notificationId , defaultMessage , এবং resumeIntent । যদি শেষ তিনটি প্যারামিটার null হয়, তাহলে notification হল স্ট্যান্ডার্ড Navigation SDK notification। এই notification এর পিছনে থাকা অন্যান্য foreground পরিষেবাগুলি এখনও লুকানো সম্ভব। notificationId প্যারামিটারটি বিজ্ঞপ্তির জন্য ব্যবহার করা উচিত এমন notification ID নির্দিষ্ট করে। যদি এটি null হয়, তাহলে একটি ইচ্ছাকৃত মান ব্যবহার করা হয়। আপনি এটিকে স্পষ্টভাবে সেট করতে পারেন যাতে অন্যান্য notifications, যেমন অন্য SDK থেকে আসা notifications এর সাথে দ্বন্দ্ব দূর করা যায়। defaultMessage হল একটি স্ট্রিং যা সিস্টেম নেভিগেট না করার সময় প্রদর্শিত হয়। resumeIntent হল একটি intent যা notification এ ক্লিক করলেই ফায়ার হয়। যদি resumeIntent null হয়, তাহলে notification এর উপর ক্লিকগুলি উপেক্ষা করা হয়।
initForegroundServiceManagerProvider() এর তিনটি প্যারামিটার হল application , notificationId , এবং notificationProvider । যদি শেষ দুটি প্যারামিটার null হয়, তাহলে notification হল স্ট্যান্ডার্ড Navigation SDK notification। notificationId প্যারামিটারটি নোটিফিকেশনের জন্য কোন নোটিফিকেশন আইডি ব্যবহার করা উচিত তা নির্দিষ্ট করে। যদি এটি null হয়, তাহলে একটি ইচ্ছামত মান ব্যবহার করা হয়। আপনি অন্যান্য নোটিফিকেশনের সাথে দ্বন্দ্ব দূর করার জন্য এটি স্পষ্টভাবে সেট করতে পারেন, যেমন অন্য SDK থেকে। যদি notificationProvider সেট করা থাকে, তাহলে রেন্ডার করার জন্য নোটিফিকেশন তৈরি করার জন্য প্রদানকারী সর্বদা দায়ী।
নেভিগেশন SDK getForegroundServiceManager() পদ্ধতিটি ফোরগ্রাউন্ড সার্ভিস ম্যানেজার সিঙ্গেলটন ফেরত দেয়। যদি আপনি এখনও একটি তৈরি না করে থাকেন, তাহলে এটি notificationId , defaultMessage এবং resumeIntent জন্য null প্যারামিটার সহ initForegroundServiceManagerMessageAndIntent() কল করার সমতুল্য।
ForegroundServiceManager তিনটি সহজ পদ্ধতি রয়েছে। প্রথম দুটি হল একটি পরিষেবাকে ফোরগ্রাউন্ডে এবং বাইরে সরানোর জন্য, এবং সাধারণত তৈরি করা পরিষেবার ভেতর থেকে কল করা হয়। এই পদ্ধতিগুলি ব্যবহার করে নিশ্চিত করা হয় যে পরিষেবাগুলি শেয়ার্ড স্থায়ী বিজ্ঞপ্তির সাথে যুক্ত। চূড়ান্ত পদ্ধতি, updateNotification() , ম্যানেজারকে নোটিফিকেশনটি পরিবর্তিত হয়েছে এবং পুনরায় রেন্ডার করা উচিত তা চিহ্নিত করে।
যদি আপনার শেয়ার করা স্থায়ী বিজ্ঞপ্তির সম্পূর্ণ নিয়ন্ত্রণের প্রয়োজন হয়, তাহলে API একটি বিজ্ঞপ্তি প্রদানকারীকে সংজ্ঞায়িত করার জন্য একটি NotificationContentProvider ইন্টারফেস প্রদান করে, যার মধ্যে বর্তমান সামগ্রী সহ একটি বিজ্ঞপ্তি পাওয়ার জন্য একটি একক পদ্ধতি রয়েছে। এটি একটি বেস ক্লাসও প্রদান করে, যা আপনি ঐচ্ছিকভাবে প্রদানকারীকে সংজ্ঞায়িত করতে ব্যবহার করতে পারেন। বেস ক্লাসের একটি প্রধান উদ্দেশ্য হল এটি ForegroundServiceManager অ্যাক্সেস না করেই updateNotification() কল করার একটি উপায় প্রদান করে। আপনি যদি নতুন বিজ্ঞপ্তি বার্তা গ্রহণের জন্য বিজ্ঞপ্তি প্রদানকারীর একটি উদাহরণ ব্যবহার করেন, তাহলে আপনি বিজ্ঞপ্তিতে বার্তাটি রেন্ডার করার জন্য সরাসরি এই অভ্যন্তরীণ পদ্ধতিতে কল করতে পারেন।
ব্যবহারের পরিস্থিতি
এই বিভাগে শেয়ার করা স্থায়ী বিজ্ঞপ্তি ব্যবহারের জন্য ব্যবহারের পরিস্থিতি সম্পর্কে বিস্তারিত বলা হয়েছে।
- অন্যান্য অ্যাপ ফোরগ্রাউন্ড পরিষেবার স্থায়ী বিজ্ঞপ্তি লুকান
- সবচেয়ে সহজ পরিস্থিতি হল বর্তমান আচরণ সংরক্ষণ করা, এবং নেভিগেশন SDK তথ্য রেন্ডার করার জন্য শুধুমাত্র স্থায়ী বিজ্ঞপ্তি ব্যবহার করা। অন্যান্য পরিষেবাগুলি ফোরগ্রাউন্ড পরিষেবা পরিচালক
startForeground()এবংstopForeground()পদ্ধতি ব্যবহার করে এই বিজ্ঞপ্তির আড়ালে লুকিয়ে থাকতে পারে। - অন্যান্য অ্যাপ ফোরগ্রাউন্ড পরিষেবার স্থায়ী বিজ্ঞপ্তিগুলি লুকান, কিন্তু নেভিগেট না করার সময় প্রদর্শিত ডিফল্ট পাঠ্য সেট করুন
- দ্বিতীয় সবচেয়ে সহজ পরিস্থিতি হল বর্তমান আচরণ সংরক্ষণ করা, এবং শুধুমাত্র ন্যাভিগেশন SDK তথ্য রেন্ডার করার জন্য স্থায়ী বিজ্ঞপ্তি ব্যবহার করা, যখন সিস্টেম নেভিগেট করছে না। যখন সিস্টেম নেভিগেট করছে না, তখন
initForegroundServiceManagerMessageAndIntent()এ প্রদত্ত স্ট্রিংটি ডিফল্ট ন্যাভিগেশন SDK স্ট্রিং এর পরিবর্তে প্রদর্শিত হয় যেখানে "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 কোনও সহজ উপায় প্রদান করে না।