گزارش وضعیت کار

این راهنما به شما نشان می دهد که چگونه وضعیت درخواست کاری اجرا شده در یک سرویس پس زمینه را به مؤلفه ای که درخواست را ارسال کرده است گزارش دهید. این به شما امکان می دهد، برای مثال، وضعیت درخواست را در رابط کاربری یک شی Activity گزارش دهید. روش توصیه شده برای ارسال و دریافت وضعیت استفاده از LocalBroadcastManager است که اشیاء Intent را به اجزای برنامه خود محدود می کند.

گزارش وضعیت از JobIntentService

برای ارسال وضعیت یک درخواست کاری در JobIntentService به سایر مؤلفه‌ها، ابتدا یک Intent ایجاد کنید که شامل وضعیت در داده‌های توسعه‌یافته آن باشد. به عنوان یک گزینه، می‌توانید یک Action و URI داده به این Intent اضافه کنید.

سپس، Intent را با تماس با LocalBroadcastManager.sendBroadcast() ارسال کنید. این Intent به هر مؤلفه ای در برنامه شما که برای دریافت آن ثبت نام کرده است ارسال می کند. برای دریافت نمونه ای از LocalBroadcastManager ، با getInstance() تماس بگیرید.

به عنوان مثال:

کاتلین

...
// 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)
    ...
}

جاوا

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() ارسال می کند.

به عنوان مثال:

کاتلین

// Broadcast receiver for receiving status updates from the IntentService.
private class DownloadStateReceiver : BroadcastReceiver() {

    override fun onReceive(context: Context, intent: Intent) {
        ...
        /*
         * Handle Intents here.
         */
        ...
    }
}

جاوا

// 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 ایجاد کنید. این قطعه اول نحوه تعریف فیلتر را نشان می دهد:

کاتلین

// 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")
        }
        ...

جاوا

// 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 آن را نشان می دهد:

کاتلین

        // Instantiates a new DownloadStateReceiver
        val downloadStateReceiver = DownloadStateReceiver()
        // Registers the DownloadStateReceiver and its intent filters
        LocalBroadcastManager.getInstance(this)
                .registerReceiver(downloadStateReceiver, statusIntentFilter)
        ...

جاوا

        // 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() تکرار کنید. به عنوان مثال:

کاتلین

        /*
         * 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)

جاوا

        /*
         * 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 پخش ورودی شروع نکنید.