2

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

回答