ব্যাকগ্রাউন্ডের কাজগুলিতে সিস্টেমের সীমাবদ্ধতা

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

সিস্টেমের সীমাবদ্ধতা এড়াতে, আপনার ব্যাকগ্রাউন্ড টাস্কের জন্য সঠিক এপিআই (API) ব্যবহার করা নিশ্চিত করুন। ব্যাকগ্রাউন্ড টাস্ক ওভারভিউ ডকুমেন্টেশনটি আপনার প্রয়োজন অনুযায়ী সঠিক এপিআই বেছে নিতে সাহায্য করে।

ব্যবহারকারী-প্রবর্তিত বিধিনিষেধ

যদি কোনো অ্যাপ অ্যান্ড্রয়েড ভাইটালস- এ বর্ণিত কিছু খারাপ আচরণ প্রদর্শন করে, তাহলে সিস্টেম ব্যবহারকারীকে সেই অ্যাপটির সিস্টেম রিসোর্স ব্যবহারের সুযোগ সীমিত করার জন্য অনুরোধ জানায়।

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

  1. অতিরিক্ত ওয়েক লক : স্ক্রিন বন্ধ থাকা অবস্থায় এক ঘন্টা ধরে একটি আংশিক ওয়েক লক চালু থাকা।
  2. অতিরিক্ত ব্যাকগ্রাউন্ড সার্ভিস : যদি অ্যাপটি ২৬-এর কম এপিআই লেভেলকে টার্গেট করে এবং এতে অতিরিক্ত ব্যাকগ্রাউন্ড সার্ভিস থাকে।

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

নেটওয়ার্ক কার্যকলাপ সম্প্রচার গ্রহণের উপর বিধিনিষেধ

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

মিটারবিহীন সংযোগগুলিতে কাজের সময়সূচী নির্ধারণ করুন।

WorkRequest তৈরি করার সময়, একটি NetworkType.UNMETERED Constraint যোগ করুন।

fun scheduleWork(context: Context) {
    val workManager = WorkManager.getInstance(context)
    val workRequest = OneTimeWorkRequestBuilder<MyWorker>()
       .setConstraints(
           Constraints.Builder()
               .setRequiredNetworkType(NetworkType.UNMETERED)
               .build()
           )
       .build()

    workManager.enqueue(workRequest)
}

আপনার কাজের শর্তগুলো পূরণ হলে, আপনার অ্যাপ নির্দিষ্ট Worker ক্লাসের doWork() মেথডটি চালানোর জন্য একটি কলব্যাক পায়।

অ্যাপটি চলার সময় নেটওয়ার্ক সংযোগ নিরীক্ষণ করুন।

চলমান অ্যাপগুলো একটি নিবন্ধিত BroadcastReceiver ব্যবহার করে CONNECTIVITY_CHANGE জন্য অপেক্ষা করতে পারে। তবে, ConnectivityManager API শুধুমাত্র নির্দিষ্ট নেটওয়ার্ক শর্ত পূরণ হলেই একটি কলব্যাক অনুরোধ করার জন্য আরও শক্তিশালী একটি পদ্ধতি প্রদান করে।

NetworkRequest অবজেক্টগুলো NetworkCapabilities এর ভিত্তিতে নেটওয়ার্ক কলব্যাকের প্যারামিটারগুলো নির্ধারণ করে। আপনি NetworkRequest.Builder ক্লাস ব্যবহার করে NetworkRequest অবজেক্ট তৈরি করেন। এরপর registerNetworkCallback ফাংশনটি NetworkRequest অবজেক্টটিকে সিস্টেমে পাঠিয়ে দেয়। যখন নেটওয়ার্কের শর্তগুলো পূরণ হয়, তখন অ্যাপটি তার ConnectivityManager.NetworkCallback ক্লাসে সংজ্ঞায়িত onAvailable() মেথডটি কার্যকর করার জন্য একটি কলব্যাক পায়।

অ্যাপটি বন্ধ না হওয়া পর্যন্ত অথবা unregisterNetworkCallback() কল না করা পর্যন্ত কলব্যাক পেতে থাকে।

ছবি এবং ভিডিও সম্প্রচার গ্রহণের উপর বিধিনিষেধ

অ্যাপগুলো ACTION_NEW_PICTURE বা ACTION_NEW_VIDEO ব্রডকাস্ট পাঠাতে বা গ্রহণ করতে পারে না। যখন একটি নতুন ছবি বা ভিডিও প্রসেস করার জন্য একাধিক অ্যাপকে জেগে উঠতে হয়, তখন পারফরম্যান্স এবং ব্যবহারকারীর অভিজ্ঞতার উপর যে প্রভাব পড়ে, এই সীমাবদ্ধতা তা কমাতে সাহায্য করে।

কোন বিষয়বস্তু কর্তৃপক্ষ কাজ শুরু করেছে তা নির্ধারণ করুন

WorkerParameters আপনার অ্যাপকে এই বিষয়ে দরকারি তথ্য পেতে সাহায্য করে যে, কোন কন্টেন্ট অথরিটি এবং URI-গুলো কাজটি শুরু করেছে:

List<Uri> getTriggeredContentUris()

যেসব URI কাজটি শুরু করেছে, সেগুলোর একটি তালিকা ফেরত দেয়। যদি কোনো URI কাজটি শুরু না করে (যেমন, কোনো ডেডলাইন বা অন্য কোনো কারণে কাজটি শুরু হয়েছে), অথবা পরিবর্তিত URI-এর সংখ্যা ৫০-এর বেশি হয়, তাহলে এই তালিকাটি খালি থাকে।

List<String> getTriggeredContentAuthorities()

যেসব কন্টেন্ট অথরিটি কাজটি শুরু করেছে, তাদের একটি স্ট্রিং তালিকা ফেরত দেয়। যদি ফেরত আসা তালিকাটি খালি না হয়, তাহলে কোন কোন URI পরিবর্তিত হয়েছে তার বিস্তারিত জানতে getTriggeredContentUris() ব্যবহার করুন।

নিম্নলিখিত নমুনা কোডটি CoroutineWorker.doWork() মেথডকে ওভাররাইড করে এবং যে কন্টেন্ট অথরিটি ও URI-গুলো জবটি ট্রিগার করেছে, সেগুলোকে রেকর্ড করে:

class MyWorker(
    appContext: Context,
    params: WorkerParameters
): CoroutineWorker(appContext, params)
    override suspend fun doWork(): Result {
        StringBuilder().apply {
            append("Media content has changed:\n")
            params.triggeredContentAuthorities
                .takeIf { it.isNotEmpty() }
                ?.let { authorities ->
                    append("Authorities: ${authorities.joinToString(", ")}\n")
                    append(params.triggeredContentUris.joinToString("\n"))
                } ?: append("(No content)")
            Log.i(TAG, toString())
        }
        return Result.success()
    }
}

সিস্টেমের সীমাবদ্ধতার অধীনে অ্যাপটি পরীক্ষা করুন

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

কিছু অতিরিক্ত অ্যান্ড্রয়েড ডিবাগ ব্রিজ (ADB) কমান্ড আপনাকে ওই ব্যাকগ্রাউন্ড প্রসেসগুলো নিষ্ক্রিয় রেখে অ্যাপের আচরণ পরীক্ষা করতে সাহায্য করতে পারে:

  • ইমপ্লিসিট ব্রডকাস্ট এবং ব্যাকগ্রাউন্ড সার্ভিস অনুপলব্ধ থাকার পরিস্থিতি অনুকরণ করতে, নিম্নলিখিত কমান্ডটি প্রবেশ করান:

    $ adb shell cmd appops set <package_name> RUN_IN_BACKGROUND ignore

  • অন্তর্নিহিত সম্প্রচার এবং ব্যাকগ্রাউন্ড পরিষেবাগুলি পুনরায় সক্রিয় করতে, নিম্নলিখিত কমান্ডটি প্রবেশ করান:

    $ adb shell cmd appops set <package_name> RUN_IN_BACKGROUND allow

আপনার অ্যাপটিকে আরও অপ্টিমাইজ করুন

আপনার ব্যাকগ্রাউন্ড টাস্কগুলোর আচরণ অপ্টিমাইজ করার অন্যান্য ভালো উপায় জানতে, টাস্ক শিডিউলিং এপিআই-এর জন্য ব্যাটারির ব্যবহার অপ্টিমাইজ করুন ডকুমেন্টেশনটি দেখুন।