报告工作状态

本指南介绍如何将后台服务中运行的工作请求的状态报告给发送请求的组件。 例如,这允许您在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");
        ...

要向系统注册BroadcastReceiverIntentFilter,请获取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对象,但不会强制您的应用程序到达前台。 如果您想要在应用程序不可见时通知用户有关在后台发生的事件,请使用通知。 永远不要启动活动以响应传入的广播意图。

你可能感兴趣的:(报告工作状态)