如何在Chromecast应用中重新启动活动时处理GoogleApiClient实例?

时间:2014-07-17 05:35:33

标签: android chromecast

我正在编写一个简单的应用程序,将公共照片从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实例来保持会话?

完整来源:

https://github.com/ivan-aguirre/chromecast_samples/blob/master/DropboxCast/app/src/main/java/com/dropboxcast/dropboxcast/MainActivity.java

1 个答案:

答案 0 :(得分:3)

恕我直言,我认为采用这种方式(或至少是更好的方法)是以下之一:

  • 如果您只有一个活动而且您只关心它,那么使用一个在配置更改中保留的片段,并将您想要的内容无缝地保存在那里。这样,手机的旋转不会对你的演员阵容造成任何影响。

  • 如果您有多个活动,请考虑创建一个持续所有活动的对象,并将转换内容放在那里,然后在需要时向该对象询问CastApi实例等。

在您的情况下,旋转手机时是否真的断开连接?由于您要设置一个全新的连接,因此您可能希望在配置更改时首先断开连接(假设您不想使用我之前提出的(1)或(2))。