बैकग्राउंड में होने वाले काम के लिए सिस्टम से जुड़ी पाबंदियां

बैकग्राउंड में होने वाली प्रोसेस में मेमोरी और बैटरी की ज़्यादा खपत हो सकती है. उदाहरण के लिए, इंप्लिसिट ब्रॉडकास्ट शुरू होने वाली कई बैकग्राउंड प्रक्रियाएं यह सुन लें, भले ही इन प्रोसेस से कोई खास फ़ायदा न मिले. इसमें कोई डिवाइस की परफ़ॉर्मेंस और उपयोगकर्ता अनुभव, दोनों पर काफ़ी असर पड़ सकता है.

सिस्टम की पाबंदियों से बचने के लिए, पक्का करें कि आप अपने बैकग्राउंड में चलने वाले टास्क. कॉन्टेंट बनाने बैकग्राउंड टास्क के बारे में खास जानकारी वाले दस्तावेज़ से, आपको यह चुनने में मदद मिलती है कि आपकी ज़रूरत के हिसाब से सही एपीआई है.

उपयोगकर्ता की ओर से लगाई गई पाबंदियां

अगर कोई ऐप्लिकेशन Android की ज़रूरी जानकारी में बताई गई खराब गतिविधियां दिखाता है, तो सिस्टम, उपयोगकर्ता से उस ऐप्लिकेशन के सिस्टम के संसाधनों का ऐक्सेस प्रतिबंधित करने के लिए कहता है.

अगर सिस्टम को पता चलता है कि कोई ऐप्लिकेशन बहुत ज़्यादा संसाधनों का इस्तेमाल कर रहा है, तो वह और उपयोगकर्ता को ऐप्लिकेशन की कार्रवाइयों को सीमित करने का विकल्प देता है. इन गतिविधियों की वजह से सूचना दिख सकती है:

  1. बहुत ज़्यादा वेक लॉक: स्क्रीन चालू होने पर, एक घंटे के लिए एक पार्शियल वेक लॉक को रोका गया बंद है
  2. बैकग्राउंड में काम करने वाली बहुत ज़्यादा सेवाएं: अगर ऐप्लिकेशन, 26 से कम एपीआई लेवल को टारगेट करता है साथ ही, बैकग्राउंड में बहुत ज़्यादा सेवाएं दी गई हों

डिवाइस बनाने वाली कंपनी तय करती है कि कौनसी पाबंदियां लगाई गई हैं. इसके लिए उदाहरण के लिए, एओएसपी बिल्ड पर प्रतिबंधित ऐप्लिकेशन काम नहीं कर सकते, अलार्म ट्रिगर नहीं कर सकते या इस्तेमाल नहीं कर सकते नेटवर्क, सिर्फ़ तब, जब ऐप्लिकेशन फ़ोरग्राउंड में हो.

नेटवर्क गतिविधि के ब्रॉडकास्ट पाने से जुड़ी पाबंदियां

अगर किसी ऐप्लिकेशन के लिए रजिस्टर किया जाता है, तो उसे 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() तरीका.

ऐप्लिकेशन के चलने के दौरान, नेटवर्क कनेक्टिविटी पर नज़र रखें

चल रहे ऐप्लिकेशन, अब भी CONNECTIVITY_CHANGE की आवाज़ सुन सकते हैं. BroadcastReceiver को रजिस्टर किया गया. हालांकि, ConnectivityManager API सिर्फ़ किसी नेटवर्क के होने पर कॉलबैक का अनुरोध करने के लिए, ज़्यादा बेहतर तरीका उपलब्ध कराता है शर्तें पूरी होती हैं.

NetworkRequest ऑब्जेक्ट, नेटवर्क कॉलबैक के पैरामीटर को NetworkCapabilities की शर्तें. NetworkRequest ऑब्जेक्ट बनाए जाते हैं आपको NetworkRequest.Builder क्लास का इस्तेमाल करना है. registerNetworkCallback फिर NetworkRequest ऑब्जेक्ट को सिस्टम में पास करता है. जब नेटवर्क शर्तों को पूरा करते हैं, तो onAvailable() तरीका ConnectivityManager.NetworkCallback क्लास.

ऐप्लिकेशन के बंद होने या कॉल करने तक, ऐप्लिकेशन को कॉलबैक मिलते रहेंगे unregisterNetworkCallback() का इस्तेमाल करें.

इमेज और वीडियो ब्रॉडकास्ट करने से जुड़ी पाबंदियां

ऐप्लिकेशन, ACTION_NEW_PICTURE या ACTION_NEW_VIDEO ब्रॉडकास्ट. इस प्रतिबंध से कई ऐप्लिकेशन के चालू होने का समय तय करने पर, परफ़ॉर्मेंस और उपयोगकर्ता अनुभव पर असर पड़ता है नई इमेज या वीडियो प्रोसेस करने के लिए.

यह पता लगाएं कि किस कॉन्टेंट अथॉरिटी ने आपके कॉन्टेंट को ट्रिगर किया

WorkerParameters की मदद से, आपका ऐप्लिकेशन इन चीज़ों के बारे में काम की जानकारी पा सकता है कॉन्टेंट अथॉरिटी और यूआरआई ने इस काम को ट्रिगर किया:

List<Uri> getTriggeredContentUris()

उन यूआरआई की सूची दिखाता है जिन्होंने काम ट्रिगर किया है. यह खाली होता है, अगर या तो किसी भी यूआरआई ने काम को ट्रिगर नहीं किया है (उदाहरण के लिए, काम इस वजह से ट्रिगर हुआ था या कोई अन्य वजह तय की गई है) या बदली गई यूआरआई की संख्या इससे ज़्यादा है 50 के बराबर है.

List<String> getTriggeredContentAuthorities()

उन कॉन्टेंट अथॉरिटी की स्ट्रिंग की सूची दिखाता है जिन्होंने कॉन्टेंट को ट्रिगर किया है. अगर आपने दी गई सूची खाली नहीं है, वापस पाने के लिए 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()
    }
}

सिस्टम की पाबंदियों के तहत, ऐप्लिकेशन की जांच करें

अपने ऐप्लिकेशन को कम मेमोरी वाले डिवाइसों पर या कम मेमोरी वाली स्थितियों में चलाने के लिए ऑप्टिमाइज़ करना, से परफ़ॉर्मेंस और उपयोगकर्ता अनुभव को बेहतर बनाया जा सकता है. बैकग्राउंड पर डिपेंडेंसी हटाना सेवाएं और मेनिफ़ेस्ट में रजिस्टर किए गए इंप्लिसिट ब्रॉडकास्ट रिसीवर, आपके ऐप्लिकेशन को बेहतर बनाने में मदद कर सकते हैं ये ऐसे डिवाइसों पर बेहतर ढंग से काम करते हैं. हमारा सुझाव है कि आप अपने ऐप्लिकेशन को बेहतर तरीके से चलाने के लिए उसे ऑप्टिमाइज़ करें इसके लिए, इन बैकग्राउंड प्रोसेस का पूरी तरह से इस्तेमाल नहीं किया जाता.

कुछ अन्य Android डीबग ब्रिज (ADB) निर्देशों की मदद से, ऐप्लिकेशन की जांच की जा सकती है बंद की गई बैकग्राउंड प्रक्रियाओं का इस्तेमाल करने पर:

  • ऐसी स्थितियों को सिम्युलेट करने के लिए जहां इंप्लिसिट ब्रॉडकास्ट और बैकग्राउंड सेवाएं मौजूद हों अनुपलब्ध है, तो निम्न आदेश दर्ज करें:

    $ adb shell cmd appops set <package_name> RUN_IN_BACKGROUND ignore

  • इंप्लिसिट ब्रॉडकास्ट और बैकग्राउंड सेवाओं को फिर से चालू करने के लिए, यह जानकारी डालें आदेश:

    $ adb shell cmd appops set <package_name> RUN_IN_BACKGROUND allow

अपने ऐप्लिकेशन को और बेहतर बनाएं

बैकग्राउंड में होने वाले टास्क को ऑप्टिमाइज़ करने के लिए, व्यवहार, देखें टास्क शेड्यूलिंग एपीआई के लिए, बैटरी के इस्तेमाल को ऑप्टिमाइज़ करना दस्तावेज़.