我正在编写一个简单的应用程序,将公共照片从Dropbox公共文件夹发送到Chromecast。
而不是CastCompanion库我决定编写自己的东西来更好地理解API。
根据Google指南:
如果发件人应用程序与媒体路由断开连接,例如当用户或操作系统杀死应用程序而用户未首先从Cast设备断开连接时,则应用程序必须在发送者应用程序时恢复与接收者的会话再次开始。
在我看来,相同的解决方案应该适用于方向更改时的Activity娱乐,因为它从头开始重新创建活动。
我的第一个问题:我的假设是否正确?两种情况,方向改变和系统终止都可以使用相同的解决方案吗?
根据这个假设,我写了一些代码来恢复活动恢复时的会话。
我正在考虑方向更改方案,当从头开始重新创建Activity时,我应该恢复路由ID,会话ID并尝试重新连接(我正在存储并从共享首选项中检索这两个值)。
我一直在测试,它工作正常。
这就是我所做的(基于Google Sender指南代码):
在发现正在进行的路线ID并找到演员装置后,我称之为:
private void connectToDevice(CastDevice castDevice) {
Log.d(TAG, "connecting to " + castDevice);
Cast.CastOptions.Builder apiOptionsBuilder = Cast.CastOptions
.builder(castDevice, new CastListener());
Log.d(TAG, "apiClient is null ? " + (apiClient == null));
apiClient = new GoogleApiClient.Builder(this)
.addApi(Cast.API, apiOptionsBuilder.build())
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this)
.build();
Log.d(TAG, "apiClient connected? " + apiClient.isConnected());
Log.d(TAG, "apiClient connecting? " + apiClient.isConnecting());
apiClient.connect();
}
private class CastListener extends Cast.Listener {
@Override
public void onApplicationStatusChanged() {
if (apiClient != null) {
Log.d(TAG, "callback => " + this);
}
}
@Override
public void onVolumeChanged() {
}
@Override
public void onApplicationDisconnected(int errorCode) {
teardown();
}
}
在此方法之后,如果我识别出重新连接,我会调用Cast.CastApi.joinApplication
。
但是一旦重新连接到Chromecast,onApplicationStatusChanged
的日志会为每个手机的轮换打印一个不同的实例。例如:如果我旋转手机3次,则日志打印3次,使用3个不同的指针地址。这让我相信它在内部持有所有回调实例。
我是如何处理这种情况的,因为正在重新创建Activity并且我需要创建另一个GoogleApiClient实例来保持会话?
完整来源:
答案 0 :(得分:3)
恕我直言,我认为采用这种方式(或至少是更好的方法)是以下之一:
如果您只有一个活动而且您只关心它,那么使用一个在配置更改中保留的片段,并将您想要的内容无缝地保存在那里。这样,手机的旋转不会对你的演员阵容造成任何影响。
如果您有多个活动,请考虑创建一个持续所有活动的对象,并将转换内容放在那里,然后在需要时向该对象询问CastApi实例等。
在您的情况下,旋转手机时是否真的断开连接?由于您要设置一个全新的连接,因此您可能希望在配置更改时首先断开连接(假设您不想使用我之前提出的(1)或(2))。