本指南介绍如何将后台服务中运行的工作请求的状态报告给发送请求的组件。 例如,这允许您在Activity
对象的UI
中报告请求的状态。 发送和接收状态的推荐方法是使用LocalBroadcastManager
,它将广播Intent
对象限制为您自己的应用程序中的组件。
一、从JobIntentService报告状态
要将JobIntentService
中的工作请求的状态发送到其他组件,请首先创建一个包含其扩展数据中状态的Intent
。 作为选项,您可以向此Intent
添加操作和数据URI
。
接下来,通过调用LocalBroadcastManager.sendBroadcast()
发送Intent
。 这会将Intent发送到已注册接收它的应用程序中的任何组件。 要获取LocalBroadcastManager
的实例,请调用getInstance()
。
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 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
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
DownloadStateReceiver mDownloadStateReceiver =
new DownloadStateReceiver();
// Registers the DownloadStateReceiver and its intent filters
LocalBroadcastManager.getInstance(this).registerReceiver(
mDownloadStateReceiver,
statusIntentFilter);
...
单个BroadcastReceiver
可以处理多种类型的广播Intent
对象,每个对象都有自己的动作。 此功能允许您为每个操作运行不同的代码,而无需为每个操作定义单独的BroadcastReceiver
。 要为同一个BroadcastReceiver
定义另一个IntentFilter
,请创建IntentFilter并重复调用registerReceiver()
。 例如:
/*
* 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(
mDownloadStateReceiver,
statusIntentFilter);
发送广播Intent
不会启动或恢复活动。 即使您的应用程序在后台,活动的BroadcastReceiver
也会接收并处理Intent
对象,但不会强制您的应用程序到达前台。 如果您想要在应用程序不可见时通知用户有关在后台发生的事件,请使用通知。 永远不要启动活动以响应传入的广播意图。