نظرة عامة على عمليات البث

يمكن لتطبيقات Android إرسال رسائل الإعلان أو تلقّيها من نظام Android. تطبيقات Android الأخرى، على غرار النشر-الاشتراك نمط التصميم. يتم إرسال عمليات البث هذه عند وقوع حدث هام. فعلى سبيل المثال، يرسل نظام Android عمليات بث عند حدوث أحداث نظام متعددة تحدث مثلاً عند تشغيل النظام أو بدء شحن الجهاز. حملة التطبيقات إرسال رسائل بث مخصّصة، مثلاً، لإعلام التطبيقات الأخرى شيئًا قد يهتم به (على سبيل المثال، تحتوي بعض البيانات الجديدة تم تنزيله).

يحسّن النظام تقديم عمليات البث للحفاظ على الحالة المثلى للنظام. لذلك، لا ترتبط أوقات تسليم البث مضمون. يجب على التطبيقات التي تحتاج إلى اتصال سريع بيني للعمليات يمكن مثلاً الاطّلاع على الخدمات المرتبطة.

يمكن للتطبيقات التسجيل لتلقّي رسائل بث محدّدة. عند إرسال بث، يوجِّه النظام عمليات البث تلقائيًا إلى التطبيقات التي اشتركت في تتلقى هذا النوع الخاص من البث.

بشكل عام، يمكن استخدام رسائل البث كنظام مراسلة على مختلف التطبيقات. وخارج تدفق المستخدم العادي. ومع ذلك، يجب توخي الحذر من إساءة استخدام الفرصة للرد على عمليات البث وتشغيل الوظائف في الخلفية يمكن أن تساهم في بطء أداء النظام.

لمحة عن عمليات بث النظام

يرسل النظام البث تلقائيًا عند وقوع أحداث متنوعة في النظام، على سبيل المثال، عند دخول النظام إلى وضع الطيران والخروج منه. النظام يتم إرسال رسائل البث إلى جميع التطبيقات التي اشتركت فيها لتلقّي فعالية.

رسالة البث نفسها مغلفة في Intent كائن تحدد سلسلة الإجراء الخاصة به الحدث الذي وقع (على سبيل المثال android.intent.action.AIRPLANE_MODE). قد يتضمن القصد أيضًا معلومات إضافية مجمعة في حقلها الإضافي. على سبيل المثال، تستخدم الطائرة يتضمن نية الوضع قيمة إضافية منطقية تشير إلى ما إذا كانت عبارة "طائرة" أم لا الوضع مفعّل.

لمزيد من المعلومات حول كيفية قراءة عناصر intent والحصول على سلسلة الإجراء من هدفًا، يُرجى الاطّلاع على القسم الأغراض والغايات الفلاتر:

للحصول على قائمة كاملة بإجراءات بث النظام، يمكنك الاطلاع على ملف BROADCAST_ACTIONS.TXT في حزمة تطوير البرامج (SDK) لنظام التشغيل Android. لكل إجراء بث المجال الثابت المرتبط بها. على سبيل المثال، قيمة العدد الثابت ACTION_AIRPLANE_MODE_CHANGED هو android.intent.action.AIRPLANE_MODE وثائق لكل إجراء بث متوفرًا في الحقل الثابت المرتبط بها.

التغييرات على عمليات بث النظام

مع تطوّر نظام Android الأساسي، تتغيّر طريقة بث النظام بشكل دوري. سلوكه. يجب مراعاة التغييرات التالية لإتاحة جميع إصدارات Android.

Android 14

عندما تكون التطبيقات في ذاكرة التخزين المؤقت الحالة، وتسليم البث هو محسَّنة لسلامة النظام. على سبيل المثال، عمليات بث النظام الأقل أهمية مثل نظرًا لأن ACTION_SCREEN_ON هي يمكن تأجيله عندما يكون التطبيق في حالة التخزين المؤقت. بعد انتقال التطبيق من ذاكرة التخزين المؤقت الحالة إلى عملية نشطة مراحل النشاط، يوفّر النظام أي عمليات بث مؤجلة

أحداث البث المهمة المعلَن عنها في البيان إزالة التطبيقات مؤقتًا من النسخة المخزنة مؤقتًا الولاية للتسليم.

الإصدار 9 من نظام التشغيل Android

بدءًا من نظام التشغيل Android 9 (المستوى 28 من واجهة برمجة التطبيقات)، NETWORK_STATE_CHANGED_ACTION لا يتلقى البث معلومات عن الموقع الجغرافي للمستخدم أو البيانات التعريفية.

بالإضافة إلى ذلك، إذا كان تطبيقك مُثبَّتًا على جهاز يعمل بالإصدار 9 من نظام التشغيل Android أو إصدار أحدث، لا تحتوي عمليات بث النظام من شبكة Wi-Fi على معرِّفات مجموعة الخدمات (SSID) أو معرِّفات مجموعة الخدمات الأساسية (BSSID) أو اتصال أو المعلومات أو نتائج الفحص. للحصول على هذه المعلومات، يُرجى الاتصال getConnectionInfo() بدلاً من ذلك.

Android 8.0

بدءًا من Android 8.0 (المستوى 26 من واجهة برمجة التطبيقات)، يفرض النظام القيود المفروضة على المستلِمين الذين أفصحوا عنهم في البيان.

إذا كان تطبيقك يستهدف الإصدار 8.0 من نظام التشغيل Android أو إصدارًا أحدث، لا يمكنك استخدام ملف البيان للقيام بذلك. تعريف جهاز استقبال لمعظم عمليات البث الضمنية (عمليات البث التي لا تستهدف تطبيقك على وجه التحديد). لا يزال بإمكانك استخدام المُسجّل في السياق عند مستخدم نشط لتطبيقك.

الإصدار 7.0 من نظام التشغيل Android

لا يتم إرسال النظام التالي من نظام التشغيل Android 7.0 (المستوى 24 من واجهة برمجة التطبيقات) والإصدارات الأحدث البث:

على التطبيقات التي تستهدف الإصدار 7.0 من نظام التشغيل Android والإصدارات الأحدث أيضًا أن تسجّل بث CONNECTIVITY_ACTION. باستخدام registerReceiver(BroadcastReceiver, IntentFilter). لا يعمل إعلان المُستلِم في البيان.

تلقّي أحداث البث

هناك طريقتان يمكن للتطبيقات تلقّي البث: من خلال أجهزة الاستقبال المعرَّفة في البيان. والمستلمين المسجَّلين استنادًا إلى سياقهم

المستلِمون الذين تم الإفصاح عنهم في ملف البيان

إذا ذكرت جهاز استقبال بث في البيان، سيشغِّل النظام التطبيق (إذا لم يكن التطبيق قيد التشغيل) عند إرسال البث.

للإشارة إلى مستقبِل البث في البيان، يُرجى اتّباع الخطوات التالية:

  1. تحديد <receiver> في بيان التطبيق.

    <!-- If this receiver listens for broadcasts sent from the system or from
         other apps, even other apps that you own, set android:exported to "true". -->
    <receiver android:name=".MyBroadcastReceiver" android:exported="false">
        <intent-filter>
            <action android:name="APP_SPECIFIC_BROADCAST" />
        </intent-filter>
    </receiver>
    

    تحدّد فلاتر الأهداف إجراءات البث التي يشترك فيها جهاز المُستلِم.

  2. الفئة الفرعية BroadcastReceiver وتنفيذ onReceive(Context, Intent). تشير رسالة الأشكال البيانية مستقبل البث في السجلات التالية ويعرض المحتوى من البث:

    Kotlin

    private const val TAG = "MyBroadcastReceiver"
    
    class MyBroadcastReceiver : BroadcastReceiver() {
    
        override fun onReceive(context: Context, intent: Intent) {
            StringBuilder().apply {
                append("Action: ${intent.action}\n")
                append("URI: ${intent.toUri(Intent.URI_INTENT_SCHEME)}\n")
                toString().also { log ->
                    Log.d(TAG, log)
    
                    val binding = ActivityNameBinding.inflate(layoutInflater)
                    val view = binding.root
                    setContentView(view)
    
                    Snackbar.make(view, log, Snackbar.LENGTH_LONG).show()
                }
            }
        }
    }
    

    Java

    public class MyBroadcastReceiver extends BroadcastReceiver {
            private static final String TAG = "MyBroadcastReceiver";
            @Override
            public void onReceive(Context context, Intent intent) {
                StringBuilder sb = new StringBuilder();
                sb.append("Action: " + intent.getAction() + "\n");
                sb.append("URI: " + intent.toUri(Intent.URI_INTENT_SCHEME).toString() + "\n");
                String log = sb.toString();
                Log.d(TAG, log);
    
                ActivityNameBinding binding =
                        ActivityNameBinding.inflate(layoutInflater);
                val view = binding.root;
                setContentView(view);
    
                Snackbar.make(view, log, Snackbar.LENGTH_LONG).show();
            }
        }
    

    لتفعيل ربط العرض، قم بتهيئة viewBinding في مستوى الوحدة Build.gradle.

ويسجِّل مدير حزم النظام المُستلِم عند تثبيت التطبيق. ويصبح المستلِم نقطة دخول منفصلة إلى تطبيقك، ما يعني أن يبدأ النظام تشغيل التطبيق ويعرض البث إذا لم يكن التطبيق قيد التشغيل حاليًا.

ينشئ النظام مكوّن BroadcastReceiver جديدًا. للتعامل مع كل بث يتلقاه. هذا الكائن صالح فقط طوال مدة المكالمة إلى onReceive(Context, Intent). بعد إدخال الرمز من هذه الطريقة، فسيعتبر النظام أن المكون لم يعد نشطة.

المستلِمون المسجّلون للسياق

يتلقّى المستلِمون المسجّلون للسياق البث طالما أنّهم مسجّلون في السياق يكون السياق صالحًا. على سبيل المثال، إذا سجّلت في Activity سياقًا، ستتلقى عمليات بث طالما لم يتم التخلص من النشاط. إذا كنت التسجيل في سياق التطبيق، ستتلقى مجموعات رسائل ما دام التطبيق قيد التشغيل.

لتسجيل مستلِم من خلال سياق، اتّبِع الخطوات التالية:

  1. أدرِج الإصدار 1.9.0 أو إصدارًا أحدث من ملف الإصدار على مستوى الوحدة في تطبيقك. مكتبة AndroidX Core:

    رائع

    dependencies {
        def core_version = "1.13.1"
    
        // Java language implementation
        implementation "androidx.core:core:$core_version"
        // Kotlin
        implementation "androidx.core:core-ktx:$core_version"
    
        // To use RoleManagerCompat
        implementation "androidx.core:core-role:1.0.0"
    
        // To use the Animator APIs
        implementation "androidx.core:core-animation:1.0.0"
        // To test the Animator APIs
        androidTestImplementation "androidx.core:core-animation-testing:1.0.0"
    
        // Optional - To enable APIs that query the performance characteristics of GMS devices.
        implementation "androidx.core:core-performance:1.0.0"
    
        // Optional - to use ShortcutManagerCompat to donate shortcuts to be used by Google
        implementation "androidx.core:core-google-shortcuts:1.1.0"
    
        // Optional - to support backwards compatibility of RemoteViews
        implementation "androidx.core:core-remoteviews:1.1.0"
    
        // Optional - APIs for SplashScreen, including compatibility helpers on devices prior Android 12
        implementation "androidx.core:core-splashscreen:1.2.0-alpha01"
    }
    

    Kotlin

    dependencies {
        val core_version = "1.13.1"
    
        // Java language implementation
        implementation("androidx.core:core:$core_version")
        // Kotlin
        implementation("androidx.core:core-ktx:$core_version")
    
        // To use RoleManagerCompat
        implementation("androidx.core:core-role:1.0.0")
    
        // To use the Animator APIs
        implementation("androidx.core:core-animation:1.0.0")
        // To test the Animator APIs
        androidTestImplementation("androidx.core:core-animation-testing:1.0.0")
    
        // Optional - To enable APIs that query the performance characteristics of GMS devices.
        implementation("androidx.core:core-performance:1.0.0")
    
        // Optional - to use ShortcutManagerCompat to donate shortcuts to be used by Google
        implementation("androidx.core:core-google-shortcuts:1.1.0")
    
        // Optional - to support backwards compatibility of RemoteViews
        implementation("androidx.core:core-remoteviews:1.1.0")
    
        // Optional - APIs for SplashScreen, including compatibility helpers on devices prior Android 12
        implementation("androidx.core:core-splashscreen:1.2.0-alpha01")
    }
    
  2. إنشاء مثيل BroadcastReceiver:

    Kotlin

    val br: BroadcastReceiver = MyBroadcastReceiver()
    

    Java

    BroadcastReceiver br = new MyBroadcastReceiver();
    
  3. إنشاء مثيل IntentFilter:

    Kotlin

    val filter = IntentFilter(APP_SPECIFIC_BROADCAST)
    

    Java

    IntentFilter filter = new IntentFilter(APP_SPECIFIC_BROADCAST);
    
  4. اختيار ما إذا كان يجب تصدير مستقبل البث ورؤيته إلى التطبيقات الأخرى على الجهاز. ما إذا كان هذا المُستلِم يستمع إلى عمليات البث المُرسَلة من النظام أو من تطبيقات أخرى، بما في ذلك التطبيقات الأخرى التي تملكها، والتي تستخدم علم واحد (RECEIVER_EXPORTED) إذا كان هذا المُستلِم يستمع فقط إلى عمليات البث التي أرسلها تطبيقك، استخدِم العلامة RECEIVER_NOT_EXPORTED.

    Kotlin

    val listenToBroadcastsFromOtherApps = false
    val receiverFlags = if (listenToBroadcastsFromOtherApps) {
        ContextCompat.RECEIVER_EXPORTED
    } else {
        ContextCompat.RECEIVER_NOT_EXPORTED
    }
    

    Java

    boolean listenToBroadcastsFromOtherApps = false;
    if (listenToBroadcastsFromOtherApps) {
        receiverFlags = ContextCompat.RECEIVER_EXPORTED;
    } else {
        receiverFlags = ContextCompat.RECEIVER_NOT_EXPORTED;
    }
    
  5. تسجيل المستلِم من خلال الاتصال registerReceiver():

    Kotlin

    ContextCompat.registerReceiver(context, br, filter, receiverFlags)
    

    Java

    ContextCompat.registerReceiver(context, br, filter, receiverFlags);
    
  6. لإيقاف تلقّي رسائل البث، يُرجى الاتصال بالرقم unregisterReceiver(android.content.BroadcastReceiver). احرص على إلغاء تسجيل المُستلِم عند عدم الاحتياج إليه أو لم يعد السياق صالحًا.

    انتبِه إلى المكان الذي يمكنك فيه التسجيل وإلغاء تسجيل المُستلِم، إذا سجّلت مثلاً مستلِمًا في onCreate(Bundle) باستخدام سياق النشاط، سيتم يجب إلغاء تسجيله في onDestroy() وتمنع تسريب المُستلِم من سياق النشاط. في حال التسجيل جهاز استقبال في onResume()، يجب يجب إلغاء تسجيله في onPause() لمنع تسجيله عدة مرات (إذا لم تكن تريد تلقي رسائل بث عند إيقافه مؤقتًا، مما يمكن أن يؤدي إلى خفض النفقات العامة غير الضرورية للنظام). لا تفعل إلغاء التسجيل في onSaveInstanceState(Bundle) لأنه لا يتم استدعاء هذا الإجراء إذا رجع المستخدم مرة أخرى إلى مكدس السجلّ.

التأثيرات على حالة العملية

ما إذا كان BroadcastReceiver تعمل أم لا تؤثر في العملية المضمنة بها، مما قد يؤدي إلى تغيير لاحتمالية قتل النظام. تنفِّذ عملية تعمل في المقدّمة طريقة onReceive() للمستلِم. تشير رسالة الأشكال البيانية نظام تشغيل هذه العملية إلا تحت ضغط شديد للذاكرة.

يتم إيقاف جهاز BroadcastRECEIVEr بعد onReceive(). مضيف المُستلِم عملية لا تقل أهمية إلا عن مكونات التطبيق. إذا كانت هذه العملية تستضيف فقط مستلِم أعلن عن بيان الإفصاح (يحدث ذلك بشكل متكرر في تطبيقات لم يسبق للمستخدم أو لم يتم التفاعل معها مؤخرًا)، فقد يوقفها النظام بعد onReceive() والموارد المتاحة للعمليات الأخرى الأكثر أهمية.

وبالتالي، يجب ألا يبدأ مستلمو البث في بدء سلاسل محادثات طويلة الأمد في الخلفية. يمكن للنظام إيقاف العملية في أي وقت بعد onReceive() لاسترداد الحساب. جارٍ إنهاء سلسلة المحادثات التي تم إنشاؤها. للحفاظ على استمرارية العملية، حدد موعدًا JobService من المستلِم باستخدام JobScheduler حتى يعرف النظام أن العملية لا تزال تعمل. توفّر صفحة نظرة عامة على المهام في الخلفية مزيدًا من التفاصيل.

جارٍ إرسال رسائل بث

يوفّر Android ثلاث طرق تتيح للتطبيقات إرسال البث:

  • sendOrderedBroadcast(Intent, String) ترسل مجموعة رسائل بث إلى جهاز استقبال واحد في كل مرة. عندما ينفذ كل مستلم أو يمكنه نشر نتيجة إلى المتلقي التالي أو يمكنه إلغاء البث تمامًا بحيث لا يتم نقله إلى المستلِمين. يمكن التحكم في أجهزة استقبال الطلبات التي يتم تشغيلها من خلال سمة android:priority لـ intent-filter المطابِق؛ المستلِمين مع سيتم تطبيق نفس الأولوية بترتيب عشوائي.
  • ترسل الطريقة sendBroadcast(Intent) عمليات البث إلى جميع أجهزة الاستقبال بترتيب غير محدد. وهذا ما يسمى عرض إعلان الرسائل على جميع الأجهزة وهذه الطريقة أكثر كفاءة، ولكنها تعني أن أجهزة الاستقبال لا يمكنها القراءة نتائج من أجهزة الاستقبال الأخرى أو نشر البيانات الواردة من البث إلغاء البث.

يوضح مقتطف الرمز التالي كيفية إرسال بث من خلال إنشاء نيّة العميل والاتصال بـ "sendBroadcast(Intent)".

Kotlin

Intent().also { intent ->
    intent.setAction("com.example.broadcast.MY_NOTIFICATION")
    intent.putExtra("data", "Nothing to see here, move along.")
    sendBroadcast(intent)
}

Java

Intent intent = new Intent();
intent.setAction("com.example.broadcast.MY_NOTIFICATION");
intent.putExtra("data", "Nothing to see here, move along.");
sendBroadcast(intent);

تكون رسالة البث ملفوفة في كائن Intent. يجب أن توفر سلسلة الإجراء الخاصة بالهدف بنية اسم حزمة Java للتطبيق تحديد حدث البث بشكل فريد. يمكنك إرفاق معلومات إضافية إلى المقصد من خلال putExtra(String, Bundle). يمكنك أيضًا حصر البث على مجموعة من التطبيقات التابعة للمؤسسة نفسها من خلال: يَتِمُّ الْآنْ إِجْرَاءُ الْمُكَالَمَة مَعَ setPackage(String) عَلَى نيّةِ الْمُكَالَمَة.

حظر عمليات البث باستخدام الأذونات

تسمح لك الأذونات بتقييد البث لمجموعة من التطبيقات التي تحتفظ أذونات معينة. يمكنك فرض قيود على المُرسِل أو مستقبِل البث.

الإرسال مع الحصول على أذونات

عند الاتصال بـ sendBroadcast(Intent, String) أو sendOrderedBroadcast(Intent, String, BroadcastReceiver, Handler, int, String, Bundle)، يمكنك تحديد مَعلمة الأذونات. المستلِمون الذين طلبوا هذا الإذن فقط من خلال العلامة في ملف البيان (وتم منحه لاحقًا إذا كان خطيرًا) يمكنك تلقي البث. على سبيل المثال، الرمز التالي الذي يرسل البث:

Kotlin

sendBroadcast(Intent(BluetoothDevice.ACTION_FOUND),
              Manifest.permission.BLUETOOTH_CONNECT)

Java

sendBroadcast(new Intent(BluetoothDevice.ACTION_FOUND),
              Manifest.permission.BLUETOOTH_CONNECT)

لتلقّي البث، يجب أن يطلب التطبيق المستقبِل الإذن على النحو التالي: كما هو موضح أدناه:

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

يمكنك تحديد إما إذن نظام حالي مثل BLUETOOTH_CONNECT أو تحديد إذن مخصّص باستخدام <permission>. بالنسبة معلومات حول الأذونات والأمان بشكل عام، يمكنك مراجعة قسم الأذونات:

الاستلام مع الحصول على أذونات

في حال تحديد مَعلمة إذن عند تسجيل مستقبِل البث (إما مع registerReceiver(BroadcastReceiver, IntentFilter, String, Handler) أو في <receiver> في )، وبالتالي لا يتم عرض هذه البيانات إلا من قِبل المذيعين الذين طلبوا الإذن علامة <uses-permission> في ملف البيان الخاص بهم (وبالتالي تم منحهم الإذن إذا كان خطير) إلى إرسال Intent إلى المتلقي.

على سبيل المثال، لنفترض أنّ تطبيقك المستلِم يتضمن مجموعة أجهزة استقبال تم الإعلان عنها في البيان. كما هو موضح أدناه:

<receiver android:name=".MyBroadcastReceiver"
          android:permission="android.permission.BLUETOOTH_CONNECT">
    <intent-filter>
        <action android:name="android.intent.action.ACTION_FOUND"/>
    </intent-filter>
</receiver>

أو يحتوي التطبيق المستلِم على مستلِم مسجّل حسب السياق كما هو موضّح أدناه:

Kotlin

var filter = IntentFilter(Intent.ACTION_FOUND)
registerReceiver(receiver, filter, Manifest.permission.BLUETOOTH_CONNECT, null )

Java

IntentFilter filter = new IntentFilter(Intent.ACTION_FOUND);
registerReceiver(receiver, filter, Manifest.permission.BLUETOOTH_CONNECT, null );

لتتمكّن بعد ذلك من إرسال رسائل بث إلى هؤلاء المُستلِمين، يجب أن طلب الإذن كما هو موضّح أدناه:

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

اعتبارات الأمان وأفضل الممارسات

في ما يلي بعض اعتبارات الأمان وأفضل الممارسات لإرسال تلقّي رسائل بث:

  • إذا سجّلت العديد من التطبيقات لتلقّي البث نفسه على فقد يتسبب ذلك في تشغيل النظام للعديد من التطبيقات، مما يؤدي إلى تأثير كبير في أداء الجهاز وتجربة المستخدم. لتجنُّب هذا، يفضل استخدام تسجيل السياق عن بيان البيان. في بعض الأحيان، يفرض نظام Android نفسه استخدام محتوى مسجّل حسب السياق. المستلِمين. على سبيل المثال، يتم تسليم بث CONNECTIVITY_ACTION. للمستلمين المسجلين في السياق فقط.

  • لا تنشر معلومات حسّاسة باستخدام نية ضمنية. تشير رسالة الأشكال البيانية يمكن الاطلاع على المعلومات من خلال أي تطبيق يسجل لتلقي البث. تتوفر ثلاث طرق لتحديد الأشخاص الذين يمكنهم استقبال مجموعات البث:

    • يمكنك تحديد إذن عند إرسال البث.
    • في الإصدار Android 4.0 والإصدارات الأحدث، يمكنك تحديد package مع setPackage(String) عند إرسال البث. يقصر النظام البث على مجموعة التطبيقات التي تطابق الحزمة.
  • عند تسجيل جهاز استقبال، يمكن لأي تطبيق إرسال محتوى يُحتمَل أن يكون ضارًا رسائل البث إلى مستقبل تطبيقك. هناك عدة طرق لتقييد عمليات البث التي يتلقّاها تطبيقك:

    • يمكنك تحديد إذن عند تسجيل مستقبِل البث.
    • بالنسبة إلى أجهزة الاستقبال المعلَن عنها في البيان، يمكنك ضبط android:exported السمة إلى "خطأ" في البيان. ولا يتلقّى المستلِم عمليات البث من مصادر خارج التطبيق
  • تكون مساحة الاسم لإجراءات البث عامة. تأكد من أن أسماء الإجراءات والسلاسل الأخرى مكتوبة في مساحة اسم تملكها، وإلا تتعارض مع التطبيقات الأخرى بدون قصد.

  • لأنّ طريقة onReceive(Context, Intent) للمستلِم تعمل في سلسلة التعليمات الرئيسية، فينبغي أن يتم تنفيذها والعودة بسرعة. إذا كنت بحاجة إلى تؤدي مهامًا طويلة الأمد، كن حذرًا بشأن نشر سلاسل المحادثات أو بدء والخدمات التي تعمل في الخلفية لأن النظام يمكنه إنهاء العملية بأكملها بعد يمكن إرجاع المشتريات مقابل onReceive(). لمزيد من المعلومات، يُرجى الاطّلاع على التأثير على العملية. الدولة لإجراء عمل طويل المدى، اقتراح:

    • جارٍ الاتصال بالرقم goAsync() من خلال طريقة onReceive() للمستلِم وتمرير BroadcastReceiver.PendingResult إلى سلسلة محادثات في الخلفية. سيؤدي ذلك إلى إبقاء البث نشطًا بعد العودة من onReceive(). ومع ذلك، حتى مع هذا النهج، يتوقع منك النظام إنهاء البث بسرعة كبيرة (أقل من 10 ثوانٍ). إنها تتيح لك نقل اعمل على سلسلة محادثات أخرى لتجنب تعطُّل سلسلة التعليمات الرئيسية.
    • جدولة مهمة باستخدام "JobScheduler" لمزيد من المعلومات، المعلومات، راجِع الوظيفة الذكية الجدولة:
  • عدم بدء الأنشطة من مستلمي البث بسبب تجربة المستخدم مزعج خاصةً إذا كان هناك أكثر من مستلم واحد بدلاً من ذلك، ضع في اعتبارك عرض إشعار.