অ্যান্ড্রয়েড এপিআই লেভেল 26 থেকে শুরু করে, ফোরগ্রাউন্ড পরিষেবাগুলির জন্য অবিরাম বিজ্ঞপ্তিগুলির প্রয়োজন৷ বিশেষ করে ব্যাটারি সহ সিস্টেম সংস্থানগুলিতে অতিরিক্ত চাহিদা রাখতে পারে এমন পরিষেবাগুলিকে লুকিয়ে রাখা থেকে আপনাকে প্রতিরোধ করার জন্য এই প্রয়োজনীয়তাটি বোঝানো হয়েছে৷ এই প্রয়োজনীয়তা একটি সম্ভাব্য সমস্যা তৈরি করে: যদি একাধিক ফোরগ্রাউন্ড পরিষেবা সহ একটি অ্যাপ সতর্কতার সাথে বিজ্ঞপ্তিটি পরিচালনা না করে যাতে এটি সমস্ত পরিষেবা জুড়ে শেয়ার করা হয়, তাহলে একাধিক অবিরাম বাতিলযোগ্য বিজ্ঞপ্তি থাকবে, যার ফলে বিজ্ঞপ্তিগুলির সক্রিয় তালিকায় অনাকাঙ্ক্ষিত বিশৃঙ্খলা দেখা দেবে।
এই সমস্যাটি আরও চ্যালেঞ্জিং হয়ে ওঠে যখন আপনি SDK যেমন ন্যাভিগেশন SDK ব্যবহার করেন, যেগুলি অ্যাপ থেকে স্বাধীন ফোরগ্রাউন্ড পরিষেবাগুলি চালায়, যেগুলির নিজস্ব স্বাধীন অবিরাম বিজ্ঞপ্তি থাকতে পারে, তাদের একত্রিত করা কঠিন করে তোলে৷ এই সমস্যাগুলির সমাধান করার জন্য, নেভিগেশন SDK v1.11 একটি সাধারণ API চালু করেছে যাতে SDK-এর মধ্যে সহ অ্যাপ জুড়ে অবিরাম বিজ্ঞপ্তিগুলি পরিচালনা করতে সহায়তা করে৷
উপাদান
ফোরগ্রাউন্ড সার্ভিস ম্যানেজার অ্যান্ড্রয়েড ফোরগ্রাউন্ড সার্ভিস ক্লাস এবং ক্রমাগত বিজ্ঞপ্তি ক্লাসের চারপাশে একটি মোড়ক প্রদান করে। এই মোড়কের প্রধান কাজ হল নোটিফিকেশন আইডির পুনঃব্যবহার জোরদার করা যাতে ম্যানেজার ব্যবহার করে সমস্ত ফোরগ্রাউন্ড পরিষেবা জুড়ে বিজ্ঞপ্তি শেয়ার করা হয়।
ন্যাভিগেশনএপিআইতে ForegroundServiceManager
সিঙ্গলটন শুরু করার এবং পাওয়ার জন্য স্ট্যাটিক পদ্ধতি রয়েছে। এই সিঙ্গেলটনটি নেভিগেশন SDK-এর জীবদ্দশায় শুধুমাত্র একবার শুরু করা যেতে পারে। ফলস্বরূপ, আপনি যদি ইনিশিয়ালাইজেশন কলগুলির একটি ব্যবহার করেন ( initForegroundServiceManagerMessageAndIntent()
বা initForegroundServiceManagerProvider()
), তাহলে সেই পথটি পুনরায় প্রবেশ করানো হলে আপনার এটিকে একটি চেষ্টা/ক্যাচ ব্লক দিয়ে ঘিরে রাখা উচিত। অসামঞ্জস্যতা সমস্যা প্রতিরোধ করার জন্য, ন্যাভিগেশন SDK একটি রানটাইম ব্যতিক্রম ছুঁড়ে দেয় যদি আপনি যেকোন একটি পদ্ধতিকে একাধিকবার কল করেন যদি না আপনি প্রথমে ForegroundServiceManager
এর সমস্ত রেফারেন্স পরিষ্কার করেন এবং প্রতিটি পরবর্তী কলের আগে clearForegroundServiceManager()
কল করেন। নেভিগেশন SDK-এর v2.0-এ, এই উদ্দেশ্যে API-এ একটি চেক করা ব্যতিক্রম যোগ করা হয়েছে।
initForegroundServiceManagerMessageAndIntent()
এর চারটি প্যারামিটার হল application
, notificationId
, defaultMessage
এবং resumeIntent
। যদি চূড়ান্ত তিনটি পরামিতি শূন্য হয়, তাহলে বিজ্ঞপ্তিটি হল আদর্শ নেভিগেশন SDK বিজ্ঞপ্তি। এই বিজ্ঞপ্তির পিছনে অ্যাপে অন্যান্য ফোরগ্রাউন্ড পরিষেবাগুলি লুকানো এখনও সম্ভব। notificationId
প্যারামিটারটি বিজ্ঞপ্তি আইডি নির্দিষ্ট করে যা বিজ্ঞপ্তির জন্য ব্যবহার করা উচিত। যদি এটি শূন্য হয়, তাহলে একটি নির্বিচারে মান ব্যবহার করা হয়। আপনি অন্য SDK-এর মতো অন্যান্য বিজ্ঞপ্তিগুলির সাথে দ্বন্দ্বগুলির সাথে কাজ করার জন্য এটি স্পষ্টভাবে সেট করতে পারেন৷ defaultMessage
হল একটি স্ট্রিং যা প্রদর্শিত হয় যখন সিস্টেমটি নেভিগেট না করে। resumeIntent
হল একটি উদ্দেশ্য যা বিজ্ঞপ্তিতে ক্লিক করার সময় বহিস্কার করা হয়। যদি resumeIntent
নাল থাকে, তাহলে বিজ্ঞপ্তিতে ক্লিক করা উপেক্ষা করা হয়।
initForegroundServiceManagerProvider()
এর তিনটি প্যারামিটার হল application
, notificationId
এবং notificationProvider
। যদি চূড়ান্ত দুটি প্যারামিটার শূন্য হয়, তাহলে বিজ্ঞপ্তিটি হল আদর্শ নেভিগেশন SDK বিজ্ঞপ্তি। notificationId
প্যারামিটারটি বিজ্ঞপ্তি আইডি নির্দিষ্ট করে যা বিজ্ঞপ্তির জন্য ব্যবহার করা উচিত। যদি এটি শূন্য হয়, তাহলে একটি নির্বিচারে মান ব্যবহার করা হয়। আপনি অন্য SDK-এর মতো অন্যান্য বিজ্ঞপ্তিগুলির সাথে দ্বন্দ্বগুলির সাথে কাজ করার জন্য এটি স্পষ্টভাবে সেট করতে পারেন৷ যদি notificationProvider
সেট করা থাকে, তাহলে প্রদানকারী সর্বদা রেন্ডার করা বিজ্ঞপ্তি তৈরি করার জন্য দায়ী।
নেভিগেশন SDK-এর getForegroundServiceManager()
পদ্ধতি ফোরগ্রাউন্ড সার্ভিস ম্যানেজার সিঙ্গলটন ফেরত দেয়। আপনি যদি এখনও একটি তৈরি না করে থাকেন, তাহলে এটি notificationId
, defaultMessage
এবং resumeIntent
এর জন্য নাল প্যারামিটার সহ initForegroundServiceManagerMessageAndIntent()
কল করার সমতুল্য।
ForegroundServiceManager
তিনটি সহজ পদ্ধতি আছে। প্রথম দুটি একটি পরিষেবাকে অগ্রভাগের মধ্যে এবং বাইরে নিয়ে যাওয়ার জন্য এবং সাধারণত তৈরি করা পরিষেবার মধ্যে থেকে ডাকা হয়৷ এই পদ্ধতিগুলি ব্যবহার করা নিশ্চিত করে যে পরিষেবাগুলি ভাগ করা অবিরাম বিজ্ঞপ্তির সাথে যুক্ত। চূড়ান্ত পদ্ধতি, updateNotification()
, ম্যানেজারকে ফ্ল্যাগ করে যে বিজ্ঞপ্তিটি পরিবর্তিত হয়েছে এবং পুনরায় রেন্ডার করা উচিত।
যদি শেয়ার করা ক্রমাগত বিজ্ঞপ্তির সামগ্রীর সম্পূর্ণ নিয়ন্ত্রণ চান, তাহলে নতুন API একটি বিজ্ঞপ্তি প্রদানকারীকে সংজ্ঞায়িত করার জন্য একটি NotificationContentProvider
ইন্টারফেস প্রদান করে, যা বর্তমান সামগ্রীর সাথে একটি বিজ্ঞপ্তি পাওয়ার জন্য একটি একক পদ্ধতি ধারণ করে। এটি একটি বেস ক্লাসও প্রদান করে, যা আপনি ঐচ্ছিকভাবে প্রদানকারীকে সংজ্ঞায়িত করতে সাহায্য করতে ব্যবহার করতে পারেন। বেস ক্লাসের অন্যতম প্রধান উদ্দেশ্য হল এটি ForegroundServiceManager
অ্যাক্সেস করার প্রয়োজন ছাড়াই updateNotification()
কল করার একটি সহজ উপায় প্রদান করে। এই সহায়ক পদ্ধতিটি কার্যকর হতে পারে যদি আপনি নতুন বিজ্ঞপ্তি বার্তা পেতে বিজ্ঞপ্তি প্রদানকারীর একটি উদাহরণ ব্যবহার করেন, এই ক্ষেত্রে আপনি বিজ্ঞপ্তিতে বার্তা রেন্ডার করতে সরাসরি এই অভ্যন্তরীণ পদ্ধতিতে কল করতে পারেন।
ব্যবহারের পরিস্থিতি
এই বিভাগটি শেয়ার করা অবিরাম বিজ্ঞপ্তিগুলি ব্যবহার করার জন্য ব্যবহারের পরিস্থিতিগুলির বিবরণ দেয়৷
- অন্যান্য অ্যাপ ফোরগ্রাউন্ড পরিষেবাগুলির অবিরাম বিজ্ঞপ্তিগুলি লুকান৷
- সবচেয়ে সহজ দৃশ্য হল বর্তমান আচরণ সংরক্ষণ করা, এবং শুধুমাত্র ন্যাভিগেশন SDK তথ্য রেন্ডার করার জন্য অবিরাম বিজ্ঞপ্তি ব্যবহার করুন। ফোরগ্রাউন্ড সার্ভিস ম্যানেজার
startForeground()
এবংstopForeground()
পদ্ধতি ব্যবহার করে অন্যান্য পরিষেবাগুলি এই বিজ্ঞপ্তির পিছনে লুকিয়ে থাকতে পারে। - অন্যান্য অ্যাপ ফোরগ্রাউন্ড পরিষেবাগুলির অবিরাম বিজ্ঞপ্তিগুলি লুকান, কিন্তু নেভিগেট না করার সময় দেখানো ডিফল্ট পাঠ্য সেট করুন
- দ্বিতীয় সহজতম দৃশ্যকল্প হল বর্তমান আচরণ সংরক্ষণ করা, এবং সিস্টেমটি নেভিগেট না করা ছাড়া, ন্যাভিগেশন SDK তথ্য রেন্ডার করার জন্য শুধুমাত্র স্থায়ী বিজ্ঞপ্তি ব্যবহার করুন। যখন সিস্টেমটি নেভিগেট করছে না,
initForegroundServiceManagerMessageAndIntent()
তে প্রদত্ত স্ট্রিংটি ডিফল্ট নেভিগেশন SDK স্ট্রিংয়ের পরিবর্তে প্রদর্শিত হয় যা "গুগল মানচিত্র" উল্লেখ করে। এই কলটি সারসংকলনের অভিপ্রায় সেট করতেও ব্যবহার করা যেতে পারে যা বিজ্ঞপ্তিতে ক্লিক করা হলে ফায়ার হবে। - ক্রমাগত বিজ্ঞপ্তির রেন্ডারিংয়ের সম্পূর্ণ নিয়ন্ত্রণ নিন
- চূড়ান্ত দৃশ্যের জন্য একটি বিজ্ঞপ্তি প্রদানকারীকে সংজ্ঞায়িত করা এবং তৈরি করা এবং এটি
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 "";
}
}
}
সতর্কতা এবং ভবিষ্যৎ পরিকল্পনা
-
initForegroundServiceManagerMessageAndIntent()
বাinitForegroundServiceManagerProvider()
কে তাড়াতাড়ি কল করতে ভুলবেন না যাতে প্রত্যাশিত ব্যবহারের দৃশ্যকল্পটি ভালভাবে সংজ্ঞায়িত হয়। একটি নতুন ন্যাভিগেটর তৈরি করার আগে আপনাকে অবশ্যই এই পদ্ধতিতে কল করতে হবে। - কোড পাথওয়ে একাধিকবার প্রবেশ করানো হলে
initForegroundServiceManagerMessageAndIntent()
বাinitForegroundServiceManagerProvider()
কল থেকে ব্যতিক্রমগুলি ধরা নিশ্চিত করুন৷ ন্যাভিগেশন SDK v2.0-এ, এই পদ্ধতিটিকে একাধিকবার কল করা রানটাইম ব্যতিক্রমের পরিবর্তে একটি চেক করা ব্যতিক্রম ফেলে দেয়। - হেডার স্টাইলিংয়ের সাথে মেলে এমন বিজ্ঞপ্তির জীবনকাল ধরে ধারাবাহিক স্টাইলিং পেতে Google-এর এখনও কিছু কাজ থাকতে পারে।
- আপনি যখন একটি বিজ্ঞপ্তি প্রদানকারীকে সংজ্ঞায়িত করেন, তখন আপনি অগ্রাধিকার দিয়ে হেড-আপ আচরণ নিয়ন্ত্রণ করতে পারেন।
- Google এখনও পালাক্রমে তথ্য পুনরুদ্ধারের জন্য একটি সহজ উপায় প্রদান করে না যা একটি বিজ্ঞপ্তি প্রদানকারী বিজ্ঞপ্তিতে সন্নিবেশ করতে পারে।