1

我有一个 Activity 类,它正在调用 IntentService 类来做一些工作

Intent intent = new Intent(this, NetworkHandler.class);

PendingIntent pendingIntent = createPendingResult(1, intent, PendingIntent.FLAG_ONE_SHOT);
intent.putExtra(NetworkHandler.REFRESH_CONTENT, NetworkHandler.GRO);
intent.putExtra("pendingIntent", pendingIntent);

startService(intent);

IntentService 完成后,我触发对 Activity 的回调

pendingIntent.send();

但是,如果用户在 IntentService 仍在后台运行时按下后退按钮,当待处理的意图尝试触发回调时,我会收到 NullPointException。

处理这种情况的正确方法是什么?

4

2 回答 2

0

我最终为这个问题使用了一个私有的 BroadcastReceiver 类。

private class RefreshStatusReceiver extends BroadcastReceiver {
    private RefreshStatusReceiver() {

    }

    @Override
    public void onReceive(Context context, Intent intent) {
        int requestType = intent.getBundleExtra("bundle").getInt(NetworkHandler.REQUEST_TYPE);

        if (requestType == NetworkHandler.FLY) {
            configHandler();
        }
    }
}

并在我的 onPause 和 onResume 方法中注册和注销它们

@Override
protected void onResume() {
    super.onResume();
    mRefreshStatusReceiver = new RefreshStatusReceiver();
    IntentFilter mStatusIntentFilter = new IntentFilter(NetworkHandler.REFRESH_COMPLETED_ACTION);
    mStatusIntentFilter.addCategory(Intent.CATEGORY_DEFAULT);
    LocalBroadcastManager.getInstance(this).registerReceiver(mRefreshStatusReceiver, mStatusIntentFilter);
}

@Override
protected void onPause() {
    super.onPause();
    LocalBroadcastManager.getInstance(this).unregisterReceiver(mRefreshStatusReceiver);
}

在我的 IntentService 我开始回调如下

    Bundle bundle = new Bundle();
    bundle.putInt(CONNECTION_STATE, connectionState);
    bundle.putInt(REQUEST_TYPE, requestType);
    Intent localIntent = new Intent(REFRESH_COMPLETED_ACTION).putExtra("bundle",bundle);
    LocalBroadcastManager.getInstance(this).sendBroadcast(localIntent);

我不能使用 Otto 总线类,因为它仅在调用者和被调用者都在主线程上时才有效(如果你想要不同的线程,请使用 greenbot 的 Eventbus)。此外,回调是在不同的上下文中调用的,这不会让我从原始活动的上下文等中烤面包。

于 2013-03-17T23:13:28.203 回答
0

createPendingResult(),虽然很容易,但确实假设原件Activity仍然存在 - 它在那里支持startActivityForResult(). 我建议使用从服务到活动的其他一些通信路径,例如:

  • LocalBroadcastManager
  • 奥托
  • Messenger
于 2013-03-14T00:13:58.153 回答