يوضّح لك هذا الدليل كيفية الإبلاغ عن حالة طلب عمل يتم تنفيذه في خدمة تُشغَّل في الخلفية.
إلى المكون الذي أرسل الطلب. يتيح لك ذلك، على سبيل المثال، الإبلاغ عن حالة
طلب في واجهة مستخدم عنصر Activity
. إنّ الطريقة المقترَحة لإرسال الحالة
واستلامها هي استخدام LocalBroadcastManager
، ما
يحدّ من عناصر البث Intent
إلى المكوّنات في تطبيقك.
الإبلاغ عن الحالة من JobIntentService
لإرسال حالة طلب عمل في
JobIntentService
إلى شخص آخر
المكونات، عليك أولاً إنشاء Intent
تحتوي على الحالة في
البيانات الموسّعة. يمكنك إضافة إجراء ومعرّف موارد منتظم (URI) للبيانات إلى هذا الخيار.
Intent
بعد ذلك، يمكنك إرسال Intent
من خلال الاتصال
LocalBroadcastManager.sendBroadcast()
يؤدي هذا الإجراء إلى إرسال "Intent
" إلى أي
المكون في تطبيقك الذي تم تسجيله لاستلامه.
للحصول على نسخة افتراضية من LocalBroadcastManager
، يُرجى الاتصال
getInstance()
مثلاً:
Kotlin
... // Defines a custom Intent action const val BROADCAST_ACTION = "com.example.android.threadsample.BROADCAST" ... // Defines the key for the status "extra" in an Intent const val EXTENDED_DATA_STATUS = "com.example.android.threadsample.STATUS" ... class RSSPullService : JobIntentService() { ... /* * Creates a new Intent containing a Uri object * BROADCAST_ACTION is a custom Intent action */ val localIntent = Intent(BROADCAST_ACTION).apply { // Puts the status into the Intent putExtra(EXTENDED_DATA_STATUS, status) } // Broadcasts the Intent to receivers in this app. LocalBroadcastManager.getInstance(this).sendBroadcast(localIntent) ... }
Java
public final class Constants { ... // Defines a custom Intent action public static final String BROADCAST_ACTION = "com.example.android.threadsample.BROADCAST"; ... // Defines the key for the status "extra" in an Intent public static final String EXTENDED_DATA_STATUS = "com.example.android.threadsample.STATUS"; ... } public class RSSPullService extends JobIntentService { ... /* * Creates a new Intent containing a Uri object * BROADCAST_ACTION is a custom Intent action */ Intent localIntent = new Intent(Constants.BROADCAST_ACTION) // Puts the status into the Intent .putExtra(Constants.EXTENDED_DATA_STATUS, status); // Broadcasts the Intent to receivers in this app. LocalBroadcastManager.getInstance(this).sendBroadcast(localIntent); ... }
الخطوة التالية هي التعامل مع كائنات Intent
الواردة للبث في
المكون الذي أرسل طلب العمل الأصلي.
تلقّي عمليات بث الحالة من JobIntentService
لتلقّي كائنات Intent
للبث، استخدِم فئة فرعية من
BroadcastReceiver
في الفئة الفرعية، نفذ
معاودة الاتصال "BroadcastReceiver.onReceive()
"
الذي يستدعيه LocalBroadcastManager
عند استلامه
Intent
. LocalBroadcastManager
تمرّر Intent
الواردة إلى
BroadcastReceiver.onReceive()
.
مثلاً:
Kotlin
// Broadcast receiver for receiving status updates from the IntentService. private class DownloadStateReceiver : BroadcastReceiver() { override fun onReceive(context: Context, intent: Intent) { ... /* * Handle Intents here. */ ... } }
Java
// Broadcast receiver for receiving status updates from the IntentService. private class DownloadStateReceiver extends BroadcastReceiver { // Called when the BroadcastReceiver gets an Intent it's registered to receive @Override public void onReceive(Context context, Intent intent) { ... /* * Handle Intents here. */ ... } }
بعد تحديد BroadcastReceiver
، يمكنك تحديد فلاتر
له تتطابق مع إجراءات وفئات وبيانات معيّنة. للقيام بذلك، قم بإنشاء
IntentFilter
يوضح المقتطف الأول كيفية تحديد الفلتر:
Kotlin
// Class that displays photos class DisplayActivity : FragmentActivity() { ... override fun onCreate(savedInstanceState: Bundle?) { ... super.onCreate(savedInstanceState) ... // The filter's action is BROADCAST_ACTION var statusIntentFilter = IntentFilter(BROADCAST_ACTION).apply { // Adds a data filter for the HTTP scheme addDataScheme("http") } ...
Java
// Class that displays photos public class DisplayActivity extends FragmentActivity { ... public void onCreate(Bundle stateBundle) { ... super.onCreate(stateBundle); ... // The filter's action is BROADCAST_ACTION IntentFilter statusIntentFilter = new IntentFilter( Constants.BROADCAST_ACTION); // Adds a data filter for the HTTP scheme statusIntentFilter.addDataScheme("http"); ...
لتسجيل BroadcastReceiver
و
IntentFilter
مع النظام، يمكنك الحصول على مثيل
LocalBroadcastManager
والاستدعاء
registerReceiver()
. يوضّح المقتطف التالي كيفية تسجيل BroadcastReceiver
وIntentFilter
:
Kotlin
// Instantiates a new DownloadStateReceiver val downloadStateReceiver = DownloadStateReceiver() // Registers the DownloadStateReceiver and its intent filters LocalBroadcastManager.getInstance(this) .registerReceiver(downloadStateReceiver, statusIntentFilter) ...
Java
// Instantiates a new DownloadStateReceiver DownloadStateReceiver downloadStateReceiver = new DownloadStateReceiver(); // Registers the DownloadStateReceiver and its intent filters LocalBroadcastManager.getInstance(this).registerReceiver( downloadStateReceiver, statusIntentFilter); ...
يمكن أن يتعامل BroadcastReceiver
واحد مع أكثر من نوع واحد من بث
Intent
، ولكلّ نوع إجراء خاص به. تتيح لك هذه الميزة
تشغيل تعليمات برمجية مختلفة لكل إجراء، دون الحاجة إلى تحديد رمز
BroadcastReceiver
لكل إجراء. لتحديد مادة عرض أخرى
IntentFilter
لنفس
BroadcastReceiver
، إنشاء IntentFilter
تكرار المكالمة
registerReceiver()
مثلاً:
Kotlin
/* * Instantiates a new action filter. * No data filter is needed. */ statusIntentFilter = IntentFilter(ACTION_ZOOM_IMAGE) // Registers the receiver with the new filter LocalBroadcastManager.getInstance(this) .registerReceiver(downloadStateReceiver, statusIntentFilter)
Java
/* * Instantiates a new action filter. * No data filter is needed. */ statusIntentFilter = new IntentFilter(Constants.ACTION_ZOOM_IMAGE); // Registers the receiver with the new filter LocalBroadcastManager.getInstance(this).registerReceiver( downloadStateReceiver, statusIntentFilter);
لا يؤدي إرسال بث Intent
إلى بدء أو استئناف
Activity
. BroadcastReceiver
يتلقى Activity
ويعالج Intent
كائن حتى
عندما يكون التطبيق يعمل في الخلفية، بدون أن يتم فرض تشغيله في المقدّمة إذا كنت
تريد إشعار المستخدم بحدث وقع في الخلفية على الرغم من أنّ تطبيقك لم يكُن
مرئية، يُرجى استخدام Notification
. لا تبدأ أبدًا
Activity
استجابةً لبث قادم
Intent
.