আপনার অ্যাপ থেকে একটি ফোরগ্রাউন্ড সার্ভিস চালু করার দুটি ধাপ রয়েছে। প্রথমত, আপনাকে context.startForegroundService() কল করে সার্ভিসটি শুরু করতে হবে। তারপর, সার্ভিসটিকে দিয়ে ServiceCompat.startForeground() কল করিয়ে সেটিকে একটি ফোরগ্রাউন্ড সার্ভিসে উন্নীত করতে হবে।
পূর্বশর্ত
আপনার অ্যাপটি কোন এপিআই লেভেলকে টার্গেট করছে তার উপর নির্ভর করে, একটি অ্যাপ কখন ফোরগ্রাউন্ড সার্ভিস চালু করতে পারবে তার উপর কিছু সীমাবদ্ধতা রয়েছে।
অ্যান্ড্রয়েড ১২ (এপিআই লেভেল ৩১) বা তার উচ্চতর সংস্করণকে লক্ষ্য করে তৈরি অ্যাপগুলো ব্যাকগ্রাউন্ডে থাকা অবস্থায় ফোরগ্রাউন্ড সার্ভিস চালু করতে পারে না, তবে কিছু নির্দিষ্ট ব্যতিক্রম রয়েছে। আরও তথ্যের জন্য এবং এই নিয়মের ব্যতিক্রমগুলো সম্পর্কে জানতে, “ব্যাকগ্রাউন্ড থেকে ফোরগ্রাউন্ড সার্ভিস চালু করার উপর বিধিনিষেধ” দেখুন।
যেসব অ্যাপ অ্যান্ড্রয়েড ১৪ (এপিআই লেভেল ৩৪) বা তার উচ্চতর সংস্করণকে টার্গেট করে, সেগুলোকে অবশ্যই ফোরগ্রাউন্ড সার্ভিস টাইপের জন্য উপযুক্ত পারমিশনের অনুরোধ করতে হবে। যখন অ্যাপটি কোনো সার্ভিসকে ফোরগ্রাউন্ডে আনার চেষ্টা করে, তখন সিস্টেম উপযুক্ত পারমিশনগুলো পরীক্ষা করে এবং কোনো পারমিশন না থাকলে
SecurityExceptionথ্রো করে। উদাহরণস্বরূপ, আপনি যদি 'locationটাইপের কোনো ফোরগ্রাউন্ড সার্ভিস চালু করার চেষ্টা করেন, তাহলে সিস্টেম পরীক্ষা করে নিশ্চিত করে যে আপনার অ্যাপের কাছে আগে থেকেইACCESS_COARSE_LOCATIONঅথবাACCESS_FINE_LOCATIONপারমিশনটি আছে। ফোরগ্রাউন্ড সার্ভিস টাইপের ডকুমেন্টেশনে প্রতিটি ফোরগ্রাউন্ড সার্ভিস টাইপের জন্য প্রয়োজনীয় পূর্বশর্তগুলোর তালিকা দেওয়া থাকে।
একটি পরিষেবা চালু করুন
একটি ফোরগ্রাউন্ড সার্ভিস চালু করার জন্য, আপনাকে প্রথমে এটিকে একটি সাধারণ (নন-ফোরগ্রাউন্ড) সার্ভিস হিসেবে চালু করতে হবে:
কোটলিন
val intent = Intent(...) // Build the intent for the service context.startForegroundService(intent)
জাভা
Context context = getApplicationContext(); Intent intent = new Intent(...); // Build the intent for the service context.startForegroundService(intent);
কোড সম্পর্কে মূল বিষয়গুলো
- কোড স্নিপেটটি একটি সার্ভিস চালু করে। কিন্তু, সার্ভিসটি এখনও ফোরগ্রাউন্ডে চলছে না। সার্ভিসটিকে ফোরগ্রাউন্ড সার্ভিসে উন্নীত করার জন্য, সার্ভিসটির ভেতরেই আপনাকে
ServiceCompat.startForeground()কল করতে হবে।
একটি পরিষেবাকে সামনে তুলে ধরুন
একবার কোনো সার্ভিস চালু হয়ে গেলে, সেটিকে ফোরগ্রাউন্ডে চালানোর অনুরোধ জানাতে আপনাকে ServiceCompat.startForeground() কল করতে হবে। সাধারণত এই মেথডটি সার্ভিসের onStartCommand() মেথডের মধ্যে কল করা হয়।
ServiceCompat.startForeground() নিম্নলিখিত প্যারামিটারগুলো গ্রহণ করে:
- পরিষেবাটি।
- একটি ধনাত্মক পূর্ণসংখ্যা যা স্ট্যাটাস বারে পরিষেবাটির নোটিফিকেশনকে অনন্যভাবে শনাক্ত করে।
-
Notificationঅবজেক্টটি নিজেই। - ফোরগ্রাউন্ড সার্ভিস টাইপ বা টাইপগুলো যা সার্ভিস দ্বারা সম্পাদিত কাজকে শনাক্ত করে।
নির্দিষ্ট ব্যবহারের ধরনের ওপর নির্ভর করে, আপনি startForeground() ফাংশনে যে ফোরগ্রাউন্ড সার্ভিস টাইপগুলো পাস করেন, সেগুলো ম্যানিফেস্টে ঘোষিত থাকে । এরপর, যদি আপনার আরও সার্ভিস টাইপ যোগ করার প্রয়োজন হয়, তাহলে আপনি আবার startForeground() কল করতে পারেন।
উদাহরণস্বরূপ, ধরুন একটি ফিটনেস অ্যাপ একটি রানিং-ট্র্যাকার সার্ভিস চালায় যার জন্য সবসময় location তথ্যের প্রয়োজন হয়, কিন্তু মিডিয়া চালানোর প্রয়োজন হতেও পারে বা নাও হতে পারে। সেক্ষেত্রে আপনাকে ম্যানিফেস্টে location এবং mediaPlayback উভয়ই ডিক্লেয়ার করতে হবে। যদি কোনো ব্যবহারকারী দৌড় শুরু করে এবং শুধু তার লোকেশন ট্র্যাক করতে চায়, তাহলে আপনার অ্যাপকে startForeground() কল করতে হবে এবং শুধু ACCESS_FINE_LOCATION পারমিশনটি পাস করতে হবে। এরপর, যদি ব্যবহারকারী অডিও চালানো শুরু করতে চায়, তাহলে আবার startForeground() কল করুন এবং সমস্ত ফোরগ্রাউন্ড সার্ভিস টাইপের বিটওয়াইজ কম্বিনেশন (এই ক্ষেত্রে, ACCESS_FINE_LOCATION|FOREGROUND_SERVICE_MEDIA_PLAYBACK ) পাস করুন।
নিম্নলিখিত উদাহরণটি দেখায় যে একটি ক্যামেরা পরিষেবা নিজেকে ফোরগ্রাউন্ড পরিষেবাতে উন্নীত করতে কী ধরনের কোড ব্যবহার করবে:
কোটলিন
class MyCameraService: Service() { private fun startForeground() { // Before starting the service as foreground check that the app has the // appropriate runtime permissions. In this case, verify that the user has // granted the CAMERA permission. val cameraPermission = PermissionChecker.checkSelfPermission(this, Manifest.permission.CAMERA) if (cameraPermission != PermissionChecker.PERMISSION_GRANTED) { // Without camera permissions the service cannot run in the foreground // Consider informing user or updating your app UI if visible. stopSelf() return } try { val notification = NotificationCompat.Builder(this, "CHANNEL_ID") // Create the notification to display while the service is running .build() ServiceCompat.startForeground( /* service = */ this, /* id = */ 100, // Cannot be 0 /* notification = */ notification, /* foregroundServiceType = */ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { ServiceInfo.FOREGROUND_SERVICE_TYPE_CAMERA } else { 0 }, ) } catch (e: Exception) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S && e is ForegroundServiceStartNotAllowedException) { // App not in a valid state to start foreground service // (e.g. started from bg) } // ... } } }
জাভা
public class MyCameraService extends Service { private void startForeground() { // Before starting the service as foreground check that the app has the // appropriate runtime permissions. In this case, verify that the user // has granted the CAMERA permission. int cameraPermission = ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA); if (cameraPermission == PackageManager.PERMISSION_DENIED) { // Without camera permissions the service cannot run in the // foreground. Consider informing user or updating your app UI if // visible. stopSelf(); return; } try { Notification notification = new NotificationCompat.Builder(this, "CHANNEL_ID") // Create the notification to display while the service // is running .build(); int type = 0; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { type = ServiceInfo.FOREGROUND_SERVICE_TYPE_CAMERA; } ServiceCompat.startForeground( /* service = */ this, /* id = */ 100, // Cannot be 0 /* notification = */ notification, /* foregroundServiceType = */ type ); } catch (Exception e) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S && e instanceof ForegroundServiceStartNotAllowedException ) { // App not in a valid state to start foreground service // (e.g started from bg) } // ... } } //... }
কোড সম্পর্কে মূল বিষয়গুলো
- অ্যাপটি তার ম্যানিফেস্টে আগেই ঘোষণা করেছে যে এটির
CAMERAপারমিশন প্রয়োজন। তবে, ব্যবহারকারী সেই পারমিশনটি দিয়েছেন কিনা, তা নিশ্চিত করার জন্য অ্যাপটিকে রানটাইমেও যাচাই করতে হবে। যদি অ্যাপটির কাছে প্রকৃতপক্ষে সঠিক পারমিশন না থাকে, তবে সমস্যাটি সম্পর্কে ব্যবহারকারীকে জানিয়ে দেওয়া উচিত। - অ্যান্ড্রয়েড প্ল্যাটফর্মের বিভিন্ন সংস্করণের সাথে বিভিন্ন ধরণের ফোরগ্রাউন্ড সার্ভিস চালু করা হয়েছিল। এই কোডটি পরীক্ষা করে দেখে যে এটি অ্যান্ড্রয়েডের কোন সংস্করণে চলছে এবং সেই অনুযায়ী উপযুক্ত অনুমতির জন্য অনুরোধ করে।
- কোডটি
ForegroundServiceStartNotAllowedExceptionএর জন্য পরীক্ষা করে, যদি এটি এমন কোনো পরিস্থিতিতে একটি ফোরগ্রাউন্ড সার্ভিস শুরু করার চেষ্টা করে যা অনুমোদিত নয় (উদাহরণস্বরূপ, যদি অ্যাপটি ব্যাকগ্রাউন্ডে থাকা অবস্থায় সার্ভিসটিকে ফোরগ্রাউন্ডে নিয়ে আসার চেষ্টা করা হয়)।