ফোরগ্রাউন্ড পরিষেবা

ফোরগ্রাউন্ড পরিষেবাগুলি এমন ক্রিয়াকলাপ সম্পাদন করে যা ব্যবহারকারীর কাছে লক্ষণীয়।

ফোরগ্রাউন্ড পরিষেবাগুলি একটি স্ট্যাটাস বার বিজ্ঞপ্তি দেখায়, যাতে ব্যবহারকারীদের সচেতন করা যায় যে আপনার অ্যাপ ফোরগ্রাউন্ডে একটি কাজ করছে এবং সিস্টেম রিসোর্স ব্যবহার করছে।

ফোরগ্রাউন্ড পরিষেবাগুলি ব্যবহার করে এমন অ্যাপগুলির উদাহরণগুলির মধ্যে নিম্নলিখিতগুলি অন্তর্ভুক্ত রয়েছে:

  • একটি মিউজিক প্লেয়ার অ্যাপ যা একটি ফোরগ্রাউন্ড সার্ভিসে মিউজিক চালায়। বিজ্ঞপ্তিটি বর্তমান গান বাজানো দেখাতে পারে।
  • একটি ফিটনেস অ্যাপ যা ব্যবহারকারীর কাছ থেকে অনুমতি পাওয়ার পর একটি ফোরগ্রাউন্ড পরিষেবাতে ব্যবহারকারীর দৌড় রেকর্ড করে। বিজ্ঞপ্তিটি বর্তমান ফিটনেস সেশনের সময় ব্যবহারকারী যে দূরত্ব অতিক্রম করেছে তা দেখাতে পারে।

শুধুমাত্র তখনই একটি অগ্রভাগের পরিষেবা ব্যবহার করুন যখন আপনার অ্যাপটি এমন একটি কাজ সম্পাদন করতে হবে যা ব্যবহারকারীর দ্বারা লক্ষ্য করা যায়, এমনকি যখন তারা সরাসরি অ্যাপের সাথে ইন্টারঅ্যাক্ট করছে না। যদি ক্রিয়াটি যথেষ্ট কম গুরুত্বের হয় যে আপনি একটি ন্যূনতম-অগ্রাধিকার বিজ্ঞপ্তি ব্যবহার করতে চান তবে পরিবর্তে একটি পটভূমি কাজ তৈরি করুন৷

এই দস্তাবেজটি ফোরগ্রাউন্ড পরিষেবাগুলি ব্যবহার করার জন্য প্রয়োজনীয় অনুমতি বর্ণনা করে এবং কীভাবে একটি ফোরগ্রাউন্ড পরিষেবা শুরু করতে হয় এবং এটিকে পটভূমি থেকে সরাতে হয়৷ এটি ফোরগ্রাউন্ড পরিষেবার ধরনগুলির সাথে নির্দিষ্ট ব্যবহারের ক্ষেত্রে কীভাবে যুক্ত করা যায় এবং আপনি যখন ব্যাকগ্রাউন্ডে চলমান একটি অ্যাপ থেকে একটি ফোরগ্রাউন্ড পরিষেবা শুরু করেন তখন অ্যাক্সেসের সীমাবদ্ধতাগুলি কার্যকর হয় তাও বর্ণনা করে৷

ব্যবহারকারী ডিফল্টরূপে বিজ্ঞপ্তি খারিজ করতে পারেন

অ্যান্ড্রয়েড 13 (এপিআই স্তর 33) থেকে শুরু করে, ব্যবহারকারীরা ডিফল্টরূপে অগ্রভাগের পরিষেবার সাথে সম্পর্কিত বিজ্ঞপ্তি খারিজ করতে পারেন। এটি করার জন্য, ব্যবহারকারীরা বিজ্ঞপ্তিতে একটি সোয়াইপ অঙ্গভঙ্গি সম্পাদন করে। প্রথাগতভাবে, অগ্রভাগের পরিষেবা বন্ধ বা অগ্রভাগ থেকে সরানো না হলে বিজ্ঞপ্তিটি খারিজ করা হয় না।

আপনি যদি বিজ্ঞপ্তিটি ব্যবহারকারীর দ্বারা খারিজ না করতে চান, তাহলে Notification.Builder ব্যবহার করে আপনার বিজ্ঞপ্তি তৈরি করার সময় setOngoing() পদ্ধতিতে true পাস করুন।

যে পরিষেবাগুলি অবিলম্বে একটি বিজ্ঞপ্তি দেখায়৷

যদি একটি ফোরগ্রাউন্ড পরিষেবাতে নিম্নলিখিত বৈশিষ্ট্যগুলির মধ্যে অন্তত একটি থাকে, তবে পরিষেবাটি শুরু হওয়ার সাথে সাথে সিস্টেমটি সংশ্লিষ্ট বিজ্ঞপ্তি দেখায়, এমনকি Android 12 বা উচ্চতর সংস্করণে চালিত ডিভাইসগুলিতেও:

  • পরিষেবাটি একটি বিজ্ঞপ্তির সাথে যুক্ত যা অ্যাকশন বোতামগুলি অন্তর্ভুক্ত করে।
  • পরিষেবাটিতে mediaPlayback , mediaProjection বা phoneCall একটি foregroundServiceType রয়েছে।
  • পরিষেবাটি ফোন কল, নেভিগেশন বা মিডিয়া প্লেব্যাকের সাথে সম্পর্কিত একটি ব্যবহারের ক্ষেত্রে প্রদান করে, যেমনটি বিজ্ঞপ্তির বিভাগের বৈশিষ্ট্যে সংজ্ঞায়িত করা হয়েছে।
  • পরিষেবাটি বিজ্ঞপ্তি সেট আপ করার সময় FOREGROUND_SERVICE_IMMEDIATE setForegroundServiceBehavior() এ পাস করে আচরণ পরিবর্তন থেকে অপ্ট আউট করেছে৷

অ্যান্ড্রয়েড 13 (এপিআই লেভেল 33) বা তার উপরে, ব্যবহারকারী যদি বিজ্ঞপ্তির অনুমতি অস্বীকার করে, তারা এখনও টাস্ক ম্যানেজারে ফোরগ্রাউন্ড পরিষেবা সম্পর্কিত বিজ্ঞপ্তিগুলি দেখতে পায় কিন্তু বিজ্ঞপ্তি ড্রয়ারে সেগুলি দেখতে পায় না৷

আপনার ম্যানিফেস্টে ফোরগ্রাউন্ড পরিষেবাগুলি ঘোষণা করুন

আপনার অ্যাপের ম্যানিফেস্টে, একটি <service> উপাদান সহ আপনার অ্যাপের প্রতিটি অগ্রভাগের পরিষেবা ঘোষণা করুন। প্রতিটি পরিষেবার জন্য, পরিষেবাটি কী ধরনের কাজ করে তা ঘোষণা করতে একটি android:foregroundServiceType বৈশিষ্ট্য ব্যবহার করুন৷

উদাহরণস্বরূপ, যদি আপনার অ্যাপ এমন একটি ফোরগ্রাউন্ড পরিষেবা তৈরি করে যা সঙ্গীত বাজায়, তাহলে আপনি এইরকম পরিষেবা ঘোষণা করতে পারেন:

<manifest xmlns:android="http://schemas.android.com/apk/res/android" ...>
  <application ...>

    <service
        android:name=".MyMediaPlaybackService"
        android:foregroundServiceType="mediaPlayback"
        android:exported="false">
    </service>
  </application>
</manifest>

যদি আপনার একাধিক প্রকার আপনার পরিষেবাতে প্রযোজ্য হয়, সেগুলিকে | দিয়ে আলাদা করুন৷ অপারেটর উদাহরণস্বরূপ, ক্যামেরা এবং মাইক্রোফোন ব্যবহার করে এমন একটি পরিষেবা এটিকে এভাবে ঘোষণা করবে:

android:foregroundServiceType="camera|microphone"

ফোরগ্রাউন্ড পরিষেবা অনুমতির জন্য অনুরোধ করুন

যে অ্যাপগুলি Android 9 (API স্তর 28) বা উচ্চতরকে লক্ষ্য করে এবং ফোরগ্রাউন্ড পরিষেবাগুলি ব্যবহার করে তাদের অ্যাপ ম্যানিফেস্টে FOREGROUND_SERVICE অনুরোধ করতে হবে, যেমনটি নিম্নলিখিত কোড স্নিপেটে দেখানো হয়েছে। এটি একটি স্বাভাবিক অনুমতি , তাই সিস্টেম স্বয়ংক্রিয়ভাবে অনুরোধকারী অ্যাপে এটি মঞ্জুর করে।

উপরন্তু, যদি অ্যাপটি API লেভেল 34 বা তার বেশি লক্ষ্য করে, তাহলে ফোরগ্রাউন্ড পরিষেবাটি যে ধরনের কাজ করবে তার জন্য এটি অবশ্যই উপযুক্ত অনুমতির প্রকারের অনুরোধ করবে। প্রতিটি ফোরগ্রাউন্ড পরিষেবার একটি সংশ্লিষ্ট অনুমতি প্রকার আছে। উদাহরণস্বরূপ, যদি একটি অ্যাপ ক্যামেরা ব্যবহার করে এমন একটি ফোরগ্রাউন্ড পরিষেবা চালু করে, তাহলে আপনাকে অবশ্যই FOREGROUND_SERVICE এবং FOREGROUND_SERVICE_CAMERA উভয় অনুমতির জন্য অনুরোধ করতে হবে৷ এগুলি সবই স্বাভাবিক অনুমতি, তাই ম্যানিফেস্টে তালিকাভুক্ত থাকলে সিস্টেম স্বয়ংক্রিয়ভাবে সেগুলি মঞ্জুর করে৷

<manifest xmlns:android="http://schemas.android.com/apk/res/android" ...>

    <uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>
    <uses-permission android:name="android.permission.FOREGROUND_SERVICE_CAMERA"/>

    <application ...>
        ...
    </application>
</manifest>

ফোরগ্রাউন্ড পরিষেবার পূর্বশর্ত

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

এই কারণে, আপনাকে অবশ্যই নিশ্চিত করতে হবে যে আপনি একটি ফোরগ্রাউন্ড পরিষেবা শুরু করার আগে প্রয়োজনীয় পূর্বশর্তগুলি পূরণ করেছেন৷ ফোরগ্রাউন্ড সার্ভিস টাইপ ডকুমেন্টেশন প্রতিটি ফোরগ্রাউন্ড সার্ভিস টাইপের জন্য প্রয়োজনীয় পূর্বশর্ত তালিকা করে।

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

ফোরগ্রাউন্ড পরিষেবা হিসাবে কোনও পরিষেবা চালানোর জন্য আপনি সিস্টেমকে অনুরোধ করার আগে, পরিষেবাটি নিজেই শুরু করুন:

কোটলিন

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);

পরিষেবার ভিতরে, সাধারণত onStartCommand() তে, আপনি অনুরোধ করতে পারেন যে আপনার পরিষেবাটি অগ্রভাগে চালানো হবে। এটি করতে, ServiceCompat.startForeground() কল করুন (androidx-core 1.12 এবং উচ্চতর সংস্করণে উপলব্ধ)। এই পদ্ধতি নিম্নলিখিত পরামিতি লাগে:

এই প্রকারগুলি নির্দিষ্ট ব্যবহারের ক্ষেত্রে নির্ভর করে ম্যানিফেস্টে ঘোষিত প্রকারগুলির একটি উপসেট হতে পারে৷ তারপর, আপনি যদি আরও পরিষেবার ধরন যোগ করতে চান, আপনি আবার 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)
            }
            // ...
        }
    }

    //...
}

অগ্রভাগ থেকে একটি পরিষেবা সরান৷

অগ্রভাগ থেকে পরিষেবাটি সরাতে, stopForeground() কল করুন। এই পদ্ধতিটি একটি বুলিয়ান নেয়, যা নির্দেশ করে যে স্ট্যাটাস বার বিজ্ঞপ্তিটিও সরানো হবে কিনা। উল্লেখ্য যে পরিষেবাটি চলতে থাকে।

ফোরগ্রাউন্ডে চলাকালীন আপনি পরিষেবাটি বন্ধ করলে, এর বিজ্ঞপ্তি মুছে ফেলা হবে।

ফোরগ্রাউন্ড পরিষেবাগুলিতে চলমান অ্যাপগুলির ব্যবহারকারীর সূচনা বন্ধ করা পরিচালনা করুন

বিজ্ঞপ্তি ড্রয়ারের নীচে একটি বোতাম রয়েছে যা বর্তমানে ব্যাকগ্রাউন্ডে চলমান অ্যাপের সংখ্যা নির্দেশ করে। আপনি যখন এই বোতাম টিপবেন, একটি ডায়ালগ প্রদর্শিত হবে, যা বিভিন্ন অ্যাপের নাম তালিকাভুক্ত করে। স্টপ বোতামটি প্রতিটি অ্যাপের ডানদিকে রয়েছে
চিত্র 1. Android 13 বা উচ্চতর সংস্করণে চালিত ডিভাইসগুলিতে টাস্ক ম্যানেজার ওয়ার্কফ্লো৷

অ্যান্ড্রয়েড 13 (এপিআই স্তর 33) থেকে শুরু করে, ব্যবহারকারীরা সেই অ্যাপের টার্গেট SDK সংস্করণ নির্বিশেষে একটি চলমান ফোরগ্রাউন্ড পরিষেবা রয়েছে এমন একটি অ্যাপ বন্ধ করতে বিজ্ঞপ্তি ড্রয়ার থেকে একটি ওয়ার্কফ্লো সম্পূর্ণ করতে পারেন। টাস্ক ম্যানেজার নামে পরিচিত এই সামর্থ্যটি বর্তমানে একটি ফোরগ্রাউন্ড পরিষেবা চালাচ্ছে এমন অ্যাপগুলির একটি তালিকা দেখায়৷

এই তালিকাটিকে অ্যাক্টিভ অ্যাপস লেবেল করা হয়েছে। প্রতিটি অ্যাপের পাশে একটি স্টপ বোতাম রয়েছে। চিত্র 1 Android 13 চালিত একটি ডিভাইসে টাস্ক ম্যানেজার ওয়ার্কফ্লোকে চিত্রিত করে৷

যখন ব্যবহারকারী টাস্ক ম্যানেজারে আপনার অ্যাপের পাশে স্টপ বোতাম টিপে, তখন নিম্নলিখিত ক্রিয়াগুলি ঘটবে:

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

ব্যবহারকারী আপনার অ্যাপ বন্ধ করার সময় এবং পরে আপনার অ্যাপটি প্রত্যাশিতভাবে আচরণ করে কিনা তা পরীক্ষা করতে, একটি টার্মিনাল উইন্ডোতে নিম্নলিখিত ADB কমান্ডটি চালান:

adb shell cmd activity stop-app PACKAGE_NAME

ছাড়

সিস্টেমটি নির্দিষ্ট ধরণের অ্যাপের জন্য বিভিন্ন স্তরের ছাড় প্রদান করে, যা নিম্নলিখিত বিভাগগুলি বর্ণনা করে৷

ছাড়গুলি অ্যাপ্লিকেশন প্রতি, প্রক্রিয়ার প্রতি নয়। যদি সিস্টেমটি একটি অ্যাপে একটি প্রক্রিয়াকে ছাড় দেয়, তবে সেই অ্যাপের অন্যান্য সমস্ত প্রক্রিয়াও অব্যাহতিপ্রাপ্ত।

টাস্ক ম্যানেজারে উপস্থিত হওয়া থেকে অব্যাহতি

নিম্নলিখিত অ্যাপগুলি একটি ফোরগ্রাউন্ড পরিষেবা চালাতে পারে এবং টাস্ক ম্যানেজারে মোটেও প্রদর্শিত হবে না:

  • সিস্টেম-স্তরের অ্যাপ
  • নিরাপত্তা অ্যাপ্লিকেশন; অর্থাৎ, ROLE_EMERGENCY ভূমিকা আছে এমন অ্যাপ
  • ডেমো মোডে থাকা ডিভাইস

ব্যবহারকারীদের দ্বারা বন্ধ করা থেকে অব্যাহতি

যখন নিম্নলিখিত ধরণের অ্যাপগুলি একটি ফোরগ্রাউন্ড পরিষেবা চালায়, তখন সেগুলি টাস্ক ম্যানেজারে উপস্থিত হয়, কিন্তু ব্যবহারকারীর ট্যাপ করার জন্য অ্যাপের নামের পাশে কোনও স্টপ বোতাম নেই:

ফোরগ্রাউন্ড পরিষেবার পরিবর্তে উদ্দেশ্য-নির্মিত API ব্যবহার করুন

অনেক ব্যবহারের ক্ষেত্রে, এমন প্ল্যাটফর্ম বা জেটপ্যাক API রয়েছে যা আপনি কাজ করার জন্য ব্যবহার করতে পারেন আপনি অন্যথায় একটি ফোরগ্রাউন্ড পরিষেবা ব্যবহার করতে পারেন। যদি একটি উপযুক্ত উদ্দেশ্য-নির্মিত API থাকে, তাহলে আপনার প্রায় সর্বদা একটি ফোরগ্রাউন্ড পরিষেবা ব্যবহার করার পরিবর্তে এটি ব্যবহার করা উচিত। উদ্দেশ্য-নির্মিত APIগুলি প্রায়শই অতিরিক্ত ব্যবহারের ক্ষেত্রে নির্দিষ্ট ক্ষমতা প্রদান করে যা অন্যথায় আপনাকে নিজেরাই তৈরি করতে হবে। উদাহরণস্বরূপ, বুদবুদ এপিআই মেসেজিং অ্যাপগুলির জন্য জটিল UI লজিক পরিচালনা করে যেগুলি চ্যাট-বাবল বৈশিষ্ট্যগুলি প্রয়োগ করতে হবে৷

ফোরগ্রাউন্ড পরিষেবার প্রকারগুলির জন্য ডকুমেন্টেশন ফোরগ্রাউন্ড পরিষেবাগুলির পরিবর্তে ব্যবহার করার জন্য ভাল বিকল্পগুলি তালিকাভুক্ত করে৷

পটভূমি থেকে একটি ফোরগ্রাউন্ড পরিষেবা শুরু করার উপর নিষেধাজ্ঞা

যে অ্যাপগুলি Android 12 বা উচ্চতরকে টার্গেট করে সেগুলি কয়েকটি বিশেষ ক্ষেত্রে ছাড়া অ্যাপটি ব্যাকগ্রাউন্ডে চলার সময় ফোরগ্রাউন্ড পরিষেবাগুলি শুরু করতে পারে না৷ অ্যাপটি ব্যাকগ্রাউন্ডে চলার সময় যদি কোনও অ্যাপ একটি ফোরগ্রাউন্ড পরিষেবা শুরু করার চেষ্টা করে এবং ফোরগ্রাউন্ড পরিষেবা ব্যতিক্রমী ক্ষেত্রেগুলির একটিকে সন্তুষ্ট না করে, সিস্টেমটি একটি ForegroundServiceStartNotAllowedException নিক্ষেপ করে।

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

ব্যাকগ্রাউন্ড শুরু সীমাবদ্ধতা থেকে ছাড়

নিম্নলিখিত পরিস্থিতিতে, আপনার অ্যাপ ব্যাকগ্রাউন্ডে চলার সময়ও ফোরগ্রাউন্ড পরিষেবা শুরু করতে পারে:

  • আপনার অ্যাপ্লিকেশান একটি ব্যবহারকারী-দৃশ্যমান অবস্থা থেকে রূপান্তরিত হয়, যেমন একটি কার্যকলাপ
  • আপনার অ্যাপটি ব্যাকগ্রাউন্ড থেকে একটি ক্রিয়াকলাপ শুরু করতে পারে, সেই ক্ষেত্রে ব্যতীত যেখানে অ্যাপটির একটি বিদ্যমান টাস্কের ব্যাক স্ট্যাকে একটি কার্যকলাপ রয়েছে৷
  • আপনার অ্যাপ Firebase ক্লাউড মেসেজিং ব্যবহার করে একটি উচ্চ অগ্রাধিকার বার্তা পায়।

  • ব্যবহারকারী আপনার অ্যাপের সাথে সম্পর্কিত একটি UI উপাদানে একটি ক্রিয়া সম্পাদন করে। উদাহরণস্বরূপ, তারা একটি বুদবুদ , বিজ্ঞপ্তি , উইজেট বা কার্যকলাপের সাথে যোগাযোগ করতে পারে।

  • ব্যবহারকারীর অনুরোধ করা একটি ক্রিয়া সম্পূর্ণ করতে আপনার অ্যাপটি একটি সঠিক অ্যালার্ম আহ্বান করে৷

  • আপনার অ্যাপ হল ডিভাইসের বর্তমান ইনপুট পদ্ধতি

  • আপনার অ্যাপ এমন একটি ইভেন্ট পায় যা জিওফেন্সিং বা কার্যকলাপ স্বীকৃতি পরিবর্তনের সাথে সম্পর্কিত।

  • ডিভাইসটি রিবুট হওয়ার পরে এবং একটি সম্প্রচার রিসিভারে ACTION_BOOT_COMPLETED , ACTION_LOCKED_BOOT_COMPLETED , বা ACTION_MY_PACKAGE_REPLACED অভিপ্রায় প্রাপ্তির পরে৷

  • আপনার অ্যাপটি একটি সম্প্রচার রিসিভারে ACTION_TIMEZONE_CHANGED , ACTION_TIME_CHANGED , বা ACTION_LOCALE_CHANGED অভিপ্রায় ক্রিয়া পায়৷

  • আপনার অ্যাপটি NfcService থেকে ACTION_TRANSACTION_DETECTED ইভেন্ট পায়।

  • নির্দিষ্ট সিস্টেমের ভূমিকা বা অনুমতি সহ অ্যাপ, যেমন ডিভাইস মালিক এবং প্রোফাইল মালিক

  • আপনার অ্যাপ কম্প্যানিয়ন ডিভাইস ম্যানেজার ব্যবহার করে এবং REQUEST_COMPANION_START_FOREGROUND_SERVICES_FROM_BACKGROUND অনুমতি বা REQUEST_COMPANION_RUN_IN_BACKGROUND অনুমতি ঘোষণা করে। যখনই সম্ভব, REQUEST_COMPANION_START_FOREGROUND_SERVICES_FROM_BACKGROUND ব্যবহার করুন।

  • আপনার অ্যাপে SYSTEM_ALERT_WINDOW অনুমতি রয়েছে।

  • ব্যবহারকারী আপনার অ্যাপের জন্য ব্যাটারি অপ্টিমাইজেশন বন্ধ করে দেয়।

ফোরগ্রাউন্ড পরিষেবাগুলি শুরু করার উপর নিষেধাজ্ঞা যা ব্যবহারের সময় অনুমতির প্রয়োজন৷

অ্যান্ড্রয়েড 14 (এপিআই লেভেল 34) বা উচ্চতর ক্ষেত্রে, আপনি একটি ফোরগ্রাউন্ড পরিষেবা শুরু করছেন কিনা সে সম্পর্কে সচেতন হওয়ার জন্য বিশেষ পরিস্থিতি রয়েছে যার ব্যবহারের সময় অনুমতি প্রয়োজন৷

যদি আপনার অ্যাপটি Android 14 বা উচ্চতরকে টার্গেট করে, তাহলে অপারেটিং সিস্টেম চেক করে যে আপনি কখন একটি ফোরগ্রাউন্ড পরিষেবা তৈরি করেন তা নিশ্চিত করতে আপনার অ্যাপে সেই পরিষেবার প্রকারের জন্য সমস্ত উপযুক্ত অনুমতি রয়েছে। উদাহরণস্বরূপ, আপনি যখন মাইক্রোফোন টাইপের একটি অগ্রভাগের পরিষেবা তৈরি করেন, তখন অপারেটিং সিস্টেম যাচাই করে যে আপনার অ্যাপটির বর্তমানে RECORD_AUDIO অনুমতি রয়েছে৷ আপনার কাছে সেই অনুমতি না থাকলে, সিস্টেমটি একটি SecurityException নিক্ষেপ করে।

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

একইভাবে, যদি আপনার অ্যাপটি ব্যাকগ্রাউন্ডে থাকে এবং এটি এমন একটি স্বাস্থ্য পরিষেবা তৈরি করে যার BODY_SENSORS_BACKGROUND অনুমতির প্রয়োজন হয়, অ্যাপটির বর্তমানে সেই অনুমতি নেই এবং সিস্টেমটি একটি ব্যতিক্রম ছুঁড়েছে৷ (এটি প্রযোজ্য নয় যদি এটি একটি স্বাস্থ্য পরিষেবা হয় যার জন্য বিভিন্ন অনুমতির প্রয়োজন হয়, যেমন ACTIVITY_RECOGNITION ।) PermissionChecker.checkSelfPermission() কে কল করা এই সমস্যাটিকে প্রতিরোধ করে না । যদি আপনার অ্যাপটির ব্যবহারের সময় অনুমতি থাকে এবং এটি সেই অনুমতি আছে কিনা তা পরীক্ষা করার জন্য এটি checkSelfPermission() কল করে, অ্যাপটি ব্যাকগ্রাউন্ডে থাকলেও পদ্ধতিটি PERMISSION_GRANTED প্রদান করে। যখন পদ্ধতিটি PERMISSION_GRANTED ফেরত দেয়, তখন এটি বলছে " অ্যাপ্লিকেশানটি ব্যবহার করার সময় আপনার অ্যাপটিতে এই অনুমতি রয়েছে।"

এই কারণে, যদি আপনার ফোরগ্রাউন্ড পরিষেবাটি ব্যবহারের সময় অনুমতির প্রয়োজন হয়, তাহলে আপনাকে অবশ্যই Context.startForegroundService() বা Context.bindService() কল করতে হবে যখন আপনার অ্যাপের একটি দৃশ্যমান কার্যকলাপ রয়েছে, যদি না পরিষেবাটি সংজ্ঞায়িত ছাড়গুলির মধ্যে একটির মধ্যে পড়ে৷

ব্যবহারের সময় অনুমতির উপর বিধিনিষেধ থেকে ছাড়

কিছু পরিস্থিতিতে, এমনকি যদি অ্যাপটি ব্যাকগ্রাউন্ডে চলার সময় একটি ফোরগ্রাউন্ড পরিষেবা চালু করা হয়, তবুও অ্যাপটি ফোরগ্রাউন্ডে চলাকালীন ("ব্যবহারের সময়") অবস্থান, ক্যামেরা এবং মাইক্রোফোন তথ্য অ্যাক্সেস করতে পারে।

এই একই পরিস্থিতিতে, যদি পরিষেবাটি ফোরগ্রাউন্ড পরিষেবার প্রকারের location ঘোষণা করে এবং ACCESS_BACKGROUND_LOCATION অনুমতি আছে এমন একটি অ্যাপ দ্বারা শুরু করা হয়, এই পরিষেবাটি সর্বদা অবস্থানের তথ্য অ্যাক্সেস করতে পারে, এমনকি যখন অ্যাপটি ব্যাকগ্রাউন্ডে চলে তখনও৷

নিম্নলিখিত তালিকায় এই পরিস্থিতি রয়েছে:

  • একটি সিস্টেম উপাদান পরিষেবা শুরু করে।
  • অ্যাপ উইজেটগুলির সাথে ইন্টারঅ্যাক্টের মাধ্যমে পরিষেবাটি শুরু হয়৷
  • পরিষেবাটি একটি বিজ্ঞপ্তির সাথে ইন্টারঅ্যাক্ট করে শুরু হয়।
  • পরিষেবাটি একটি PendingIntent হিসাবে শুরু হয় যা একটি ভিন্ন, দৃশ্যমান অ্যাপ থেকে পাঠানো হয়।
  • পরিষেবাটি একটি অ্যাপ দ্বারা শুরু হয় যা একটি ডিভাইস নীতি নিয়ন্ত্রক যা ডিভাইস মালিক মোডে চলে৷
  • পরিষেবাটি একটি অ্যাপের মাধ্যমে শুরু হয় যা VoiceInteractionService প্রদান করে।
  • পরিষেবাটি একটি অ্যাপ দ্বারা শুরু হয় যার START_ACTIVITIES_FROM_BACKGROUND বিশেষাধিকারপ্রাপ্ত অনুমতি রয়েছে৷
আপনার অ্যাপে কোন পরিষেবাগুলি প্রভাবিত হয়েছে তা নির্ধারণ করুন

আপনার অ্যাপটি পরীক্ষা করার সময়, এর ফোরগ্রাউন্ড পরিষেবাগুলি শুরু করুন। যদি একটি শুরু করা পরিষেবার অবস্থান, মাইক্রোফোন এবং ক্যামেরায় অ্যাক্সেস সীমাবদ্ধ থাকে, তাহলে নিম্নলিখিত বার্তা Logcat-এ প্রদর্শিত হবে:

Foreground service started from background can not have \
location/camera/microphone access: service SERVICE_NAME