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

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

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

ব্যবহারকারী-সূচিত বিধিনিষেধ

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

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

  1. অত্যধিক ওয়েক লক : স্ক্রীন বন্ধ থাকলে 1টি আংশিক ওয়েক লক এক ঘন্টা ধরে রাখা হয়
  2. অত্যধিক ব্যাকগ্রাউন্ড পরিষেবা : অ্যাপ যদি 26-এর থেকে কম API স্তরগুলিকে লক্ষ্য করে এবং অত্যধিক ব্যাকগ্রাউন্ড পরিষেবা থাকে

আরোপিত সুনির্দিষ্ট বিধিনিষেধ ডিভাইস প্রস্তুতকারকের দ্বারা নির্ধারিত হয়। উদাহরণস্বরূপ, 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() পদ্ধতিটি কার্যকর করার জন্য একটি কলব্যাক পায়।

অ্যাপটি কলব্যাক গ্রহণ করতে থাকে যতক্ষণ না হয় অ্যাপটি বন্ধ হয়ে যায় বা এটি আনরেজিস্টারনেটওয়ার্ককলব্যাক() কল করে।

ছবি এবং ভিডিও সম্প্রচার প্রাপ্তির উপর নিষেধাজ্ঞা

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

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

WorkerParameters আপনার অ্যাপকে কোন বিষয়বস্তু কর্তৃপক্ষ এবং ইউআরআই কাজটি ট্রিগার করেছে সে সম্পর্কে দরকারী তথ্য পেতে দেয়:

List<Uri> getTriggeredContentUris()

কাজটি ট্রিগার করেছে এমন URI-এর একটি তালিকা প্রদান করে। এটি খালি যদি হয় কোনো ইউআরআই কাজটি ট্রিগার না করে (উদাহরণস্বরূপ, একটি সময়সীমা বা অন্য কোনো কারণে কাজটি ট্রিগার করা হয়েছিল), অথবা পরিবর্তিত URI-এর সংখ্যা 50-এর বেশি হয়।

List<String> getTriggeredContentAuthorities()

বিষয়বস্তু কর্তৃপক্ষের একটি স্ট্রিং তালিকা প্রদান করে যা কাজটি ট্রিগার করেছে। প্রত্যাবর্তিত তালিকা খালি না হলে, কোন URI পরিবর্তিত হয়েছে তার বিবরণ পুনরুদ্ধার করতে getTriggeredContentUris() ব্যবহার করুন।

নিম্নলিখিত নমুনা কোড CoroutineWorker.doWork() পদ্ধতিকে ওভাররাইড করে এবং বিষয়বস্তু কর্তৃপক্ষ এবং ইউআরআইগুলিকে রেকর্ড করে যেগুলি কাজটি ট্রিগার করেছে:

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

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

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