我有一个调用IntentService类的Activity类来做一些工作
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后,我通过
触发回调活动pendingIntent.send();
但是,如果用户在后台运行IntentService时按下了Back按钮,当挂起的intent尝试触发回调时,我会收到NullPointException。
处理这种情况的正确方法是什么?
答案 0 :(得分:0)
createPendingResult()
,虽然简单,但确实假设原始Activity
仍然存在 - 它支持startActivityForResult()
。我建议使用从服务到活动的其他通信路径,例如:
LocalBroadcastManager
Messenger
答案 1 :(得分: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)。此外,回调是在不同的上下文中调用的,这不会让我从原始活动的上下文中进行干杯等。