একটি ফোরগ্রাউন্ড পরিষেবা চালু করুন, একটি ফোরগ্রাউন্ড পরিষেবা চালু করুন, একটি ফোরগ্রাউন্ড পরিষেবা চালু করুন

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

পূর্বশর্ত

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

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

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

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