我非常绝望。情况就是这样:我有一项活动和一项服务。从服务到活动的通信依赖于一个非常简单的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丢失了,我对此很满意,问题是我创建并向服务发送一个新的。我在创建:上这样做
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,所以我相信这会在配置更改后发生),当我尝试发送东西时,我会获得一个nullpointereException,所以我猜它实际上会得到更新(即从新活动中获得"新"ResultReceiver)。
我不想"保存"旧的ResultReceiver,并在重新创建活动时"重新布线"它;我可以创建一个新的ResultReceiver,并将其传递给服务onRebind(),后者将更新其。但它不起作用。
在屏幕旋转和重新绑定之后,"新"ResultReceiver的onReceiveResult()无法访问UI——它更改的内容不会显示。我不知道在哪里可以找到错误:在屏幕旋转之前,一切都正常,所以我想它一定与服务有关,它引用了一些旧的东西。
请参阅以下答案:https://stackoverflow.com/a/23059313/3075340
你必须实现一个接口,但如果你实现了,你的UI就会发生变化。