الإبلاغ عن حالة العمل

يوضّح لك هذا الدليل كيفية الإبلاغ عن حالة طلب عمل يتم تنفيذه في خدمة تُشغَّل في الخلفية. إلى المكون الذي أرسل الطلب. يتيح لك ذلك، على سبيل المثال، الإبلاغ عن حالة طلب في واجهة مستخدم عنصر 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.