我非常绝望。情况就是这样:我有一项活动和一项服务。从服务到活动的通信依赖于一个非常简单的ResultReceiver。屏幕旋转后无法从新的ResultReceiver修改UI
public class ServiceReceiver extends ResultReceiver {
public ServiceReceiver(android.os.Handler handler) {
super(handler);
}
@Override
protected void onReceiveResult(int resultCode, Bundle resultData) {
//do stuff, update UI using runOnUIThread()
}
}
一切工作正常:活动接收异步消息并成功更新UI。但是,如果我旋转屏幕,我失去了连接:我知道“旧”的ResultReceiver丢失了,我很好,事情是我创建并发送一个新的服务。 我这样做的onCreate:
Intent sIntent = new Intent(this, ConnectionService.class);
serviceReceiver = new ServiceReceiver(new Handler());
sIntent.putExtra("receiver", serviceReceiver);
bindService(sIntent, mConnection, Context.BIND_AUTO_CREATE);
和服务:
public void onRebind(Intent intent) {
serviceReceiver = intent.getParcelableExtra("receiver");
Log.e("SERVICE", "REBIND");
}
成功打印 “REBIND” 每当屏幕旋转时间。 serviceReceiver是我发送东西的地方:如果我将它设置为null onRebind(但不是onStartCommand或onBind,所以我确信这发生在配置更改后),当我尝试发送内容时我获得nullpointerexception,所以我猜它实际上获取更新(即从新活动中获取“新”ResultReceiver)。
我不想“保存”旧的ResultReceiver,并在重新创建活动时“重新连接”它;我可以创建一个新的ResultReceiver并将其传递给服务onRebind(),该服务将更新其服务。但它不起作用。
屏幕旋转和重新绑定后,“新”ResultReceiver的onReceiveResult()无法访问UI - 它所更改的内容不显示。我不知道在哪里寻找一个错误:所有东西都可以运行,直到屏幕旋转,所以它必须与服务持有引用旧的东西有关,我猜。