ফোরগ্রাউন্ড সার্ভিস চালু করা

আপনার অ্যাপ থেকে ফোরগ্রাউন্ড সার্ভিস চালু করার দুটি ধাপ আছে। প্রথমে, আপনাকে context.startForegroundService() কল করে সার্ভিস চালু করতে হবে। তারপর, পরিষেবাটিকে ফোরগ্রাউন্ড পরিষেবাতে উন্নীত করতে ServiceCompat.startForeground() কল করুন।

পূর্বশর্ত

আপনার অ্যাপ কোন API লেভেলকে টার্গেট করে তার উপর নির্ভর করে, কোনও অ্যাপ কখন ফোরগ্রাউন্ড সার্ভিস চালু করতে পারে তার উপর কিছু বিধিনিষেধ রয়েছে।

  • Android ১২ (API লেভেল ৩১) বা তার পরবর্তী ভার্সনকে টার্গেট করে এমন অ্যাপ, ব্যাকগ্রাউন্ডে থাকাকালীন ফোরগ্রাউন্ড সার্ভিস শুরু করতে পারে না। তবে, কিছু নির্দিষ্ট ব্যতিক্রম আছে। আরও তথ্য এবং এই নিয়মের ব্যতিক্রম সম্পর্কে জানতে, ব্যাকগ্রাউন্ড থেকে ফোরগ্রাউন্ড সার্ভিস শুরু করার ক্ষেত্রে বিধিনিষেধ দেখুন।

  • Android 14 (API লেভেল 34) বা তার পরবর্তী ভার্সনকে টার্গেট করে এমন অ্যাপকে ফোরগ্রাউন্ড পরিষেবার ধরনের জন্য উপযুক্ত অনুমতির অনুরোধ করতে হবে। অ্যাপটি ফোরগ্রাউন্ডে কোনও পরিষেবা প্রোমোট করার চেষ্টা করলে, সিস্টেম উপযুক্ত অনুমতি চেক করে এবং অ্যাপে কোনও অনুমতি না থাকলে SecurityException থ্রো করে। যেমন, আপনি যদি location ধরনের ফোরগ্রাউন্ড সার্ভিস চালু করার চেষ্টা করেন, তাহলে সিস্টেম চেক করে দেখে যে আপনার অ্যাপে আগে থেকেই ACCESS_COARSE_LOCATION বা ACCESS_FINE_LOCATION অনুমতি আছে কিনা। ফোরগ্রাউন্ড পরিষেবার ধরন সংক্রান্ত ডকুমেন্টেশনে প্রতিটি ফোরগ্রাউন্ড পরিষেবার ধরনের জন্য প্রয়োজনীয় পূর্বশর্তের তালিকা দেওয়া আছে।

পরিষেবা চালু করা

ফোরগ্রাউন্ড পরিষেবা চালু করতে, আপনাকে প্রথমে এটি একটি সাধারণ (নন-ফোরগ্রাউন্ড) পরিষেবা হিসেবে চালু করতে হবে:

Kotlin

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() নিম্নলিখিত প্যারামিটার অনুসরণ করে:

আপনি startForeground()-এ যে ফোরগ্রাউন্ড পরিষেবার ধরন পাস করেন, ম্যানিফেস্টে ঘোষিত ধরন, নির্দিষ্ট ব্যবহারের ক্ষেত্রের উপর নির্ভর করে। তারপর, আপনাকে আরও পরিষেবার ধরন যোগ করতে হলে, আপনি আবার startForeground()-এ কল করতে পারবেন।

যেমন, ধরুন কোনও ফিটনেস অ্যাপে রানিং-ট্র্যাকার পরিষেবা চলছে যার জন্য সবসময় location তথ্য প্রয়োজন, কিন্তু মিডিয়া চালানোর প্রয়োজন হতেও পারে আবার নাও হতে পারে। আপনাকে ম্যানিফেস্টে location এবং mediaPlayback দুটিই ঘোষণা করতে হবে। কোনও ব্যবহারকারী দৌড়ানো শুরু করলে এবং শুধু তার লোকেশন ট্র্যাক করতে চাইলে, আপনার অ্যাপের উচিত startForeground()-কে কল করা এবং শুধু ACCESS_FINE_LOCATION অনুমতি পাস করা। তারপর, ব্যবহারকারী অডিও চালানো শুরু করতে চাইলে, আবার startForeground() কল করুন এবং সব ফোরগ্রাউন্ড পরিষেবার ধরনের বিটওয়াইজ কম্বিনেশন পাস করুন (এই ক্ষেত্রে, ACCESS_FINE_LOCATION|FOREGROUND_SERVICE_MEDIA_PLAYBACK)।

নিম্নলিখিত উদাহরণে দেখানো হয়েছে যে ক্যামেরা পরিষেবা নিজেকে ফোরগ্রাউন্ড পরিষেবাতে প্রোমোট করার জন্য কোন কোড ব্যবহার করবে:

Kotlin

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 অনুমতি প্রয়োজন। তবে, ব্যবহারকারী সেই অনুমতি দিয়েছেন কিনা তা রানটাইমেও অ্যাপকে চেক করতে হবে। অ্যাপের কাছে সঠিক অনুমতি না থাকলে, ব্যবহারকারীকে সমস্যা সম্পর্কে জানানো উচিত।
  • Android প্ল্যাটফর্মের বিভিন্ন ভার্সনে বিভিন্ন ধরনের ফোরগ্রাউন্ড সার্ভিস চালু করা হয়েছে। এই কোডটি Android-এর কোন ভার্সন চলছে তা চেক করে এবং উপযুক্ত অনুমতির জন্য অনুরোধ করে।
  • কোডটি ForegroundServiceStartNotAllowedException চেক করে দেখে যে এটি এমন পরিস্থিতিতে ফোরগ্রাউন্ড পরিষেবা শুরু করার চেষ্টা করছে কিনা যা অনুমোদিত নয় (যেমন, অ্যাপটি ব্যাকগ্রাউন্ডে থাকাকালীন পরিষেবাটিকে ফোরগ্রাউন্ডে প্রোমোট করার চেষ্টা করছে কিনা)।