我很绝望。情况就是这样:我有一项活动和一项服务。从服务到活动的通信依赖于一个非常简单的 ResultReceiver。
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 丢失了,我很好,问题是我创建了一个新的 ResultReceiver 并将其发送到服务。我在创建时这样做:
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 - 它更改的内容不会显示。我不知道在哪里寻找错误:在屏幕旋转之前一切正常,所以它必须与服务持有对旧事物的引用有关,我猜。