2

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

4

1 回答 1

0

看到这个答案:https ://stackoverflow.com/a/23059313/3075340

你必须实现一个接口,但如果你这样做了,你的 UI 就会发生变化。

于 2016-05-20T20:05:33.140 回答