Android 如何在Chromecast应用程序中重新连接活动时处理GoogleAppClient实例?
我正在编写一个简单的应用程序,将公共照片从Dropbox公用文件夹发送到Chromecast 我决定编写自己的东西来更好地理解API,而不是CastCompanion库 根据谷歌指南: 如果发送方应用程序与媒体路由断开连接,例如当用户或操作系统在用户未首先与Cast设备断开连接的情况下终止应用程序时,则应用程序必须在发送方应用程序再次启动时恢复与接收方的会话 在我看来,相同的解决方案应该适用于方向改变后的活动娱乐,因为它从头开始重新创建活动 我的第一个问题:我的假设正确吗?方向改变和系统终止这两种方案可能使用相同的解决方案 基于这个假设,我编写了一些代码来在活动恢复时恢复会话 我正在考虑方向更改场景,当活动从头开始重新创建时,我应该恢复路由Id、会话Id并尝试重新连接(我正在存储和检索共享首选项中的两个值) 我一直在用它测试,效果很好 这就是我所做的(基于谷歌发件人准则代码): 在发现正在进行的路由Id并找到cast设备后,我将此方法称为:Android 如何在Chromecast应用程序中重新连接活动时处理GoogleAppClient实例?,android,chromecast,Android,Chromecast,我正在编写一个简单的应用程序,将公共照片从Dropbox公用文件夹发送到Chromecast 我决定编写自己的东西来更好地理解API,而不是CastCompanion库 根据谷歌指南: 如果发送方应用程序与媒体路由断开连接,例如当用户或操作系统在用户未首先与Cast设备断开连接的情况下终止应用程序时,则应用程序必须在发送方应用程序再次启动时恢复与接收方的会话 在我看来,相同的解决方案应该适用于方向改变后的活动娱乐,因为它从头开始重新创建活动 我的第一个问题:我的假设正确吗?方向改变和系统终止这两
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,ApplicationStatusChanged上的日志将为每部手机的旋转打印一个不同的实例。例如:如果我将手机旋转3次,日志会打印3次,并显示3个不同的指针地址。这使我相信它在内部保留了所有回调实例
既然活动正在重新创建,我需要创建另一个GoogleAppClient实例来保持会话,那么我应该如何处理这种情况
完整资料来源:
我认为,正确的方法(或至少更好的方法)是以下方法之一:
- 如果您只有一个活动,而这正是您所关心的,那么请使用一个在配置更改中保持不变的片段,并将您想要无缝保持的内容放在那里。这样,手机的旋转就不会对演员相关的内容造成任何干扰
- 如果您有多个活动,请考虑创建一个贯穿所有活动的对象,并将cast放在那里,然后在需要时向该对象请求CastApi实例,等等
在您的情况下,当您旋转手机时是否真的断开了连接?因为您正在建立一个全新的连接,所以当配置发生变化时,您可能需要先断开自己的连接(假设您不想使用我先前建议的(1)或(2))。不,我不断开连接。读了你的答案,我现在明白了,我误解了“会话恢复”的内容。若活动被破坏,那个么断开连接是有意义的,因为一旦施法与活动生命周期相关联,用户希望停止施法。文档解决了进程终止时重新连接的需要。谢谢阿里!!关于第二种方法,我相信我可以使用前台服务做同样的事情,让用户知道应用程序已连接,即使活动被破坏也可以进行强制转换。看起来Netflix应用程序就是这样工作的。