این راهنما به شما نشان می دهد که چگونه وضعیت درخواست کاری اجرا شده در یک سرویس پس زمینه را به مؤلفه ای که درخواست را ارسال کرده است گزارش دهید. این به شما امکان می دهد، برای مثال، وضعیت درخواست را در رابط کاربری یک شی 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 پخش ورودی شروع نکنید.