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