【问题标题】:How to handle GoogleApiClient instance upon Activity reconnection in Chromecast App?如何在 Chromecast App 中重新连接 Activity 时处理 GoogleApiClient 实例?
【发布时间】:2014-09-07 20:33:03
【问题描述】:

我正在编写一个简单的应用程序来将公共照片从 Dropbox 公共文件夹发送到 Chromecast。

我决定编写自己的东西来更好地理解 API,而不是 CastCompanion 库。

根据 Google 指南:

如果发送方应用程序与媒体路由断开连接,例如当用户或操作系统在用户未先与 Cast 设备断开连接的情况下终止应用程序时,则应用程序必须在发送方应用程序时恢复与接收方的会话重新开始。

在我看来,相同的解决方案应该适用于在方向更改时重新创建 Activity,因为它从头开始重新创建 Activity。

我的第一个问题:我的假设是否正确?方向改变和系统终止这两种情况可能使用相同的解决方案吗?

鉴于这个假设,我编写了一些代码来在 Activity 恢复时恢复会话。

我正在考虑方向更改方案,当从头开始重新创建 Activity 并且我应该恢复路由 ID、会话 ID 并尝试重新连接(我正在存储和检索来自共享首选项的两个值)。

我一直在测试,它工作正常。

我就是这样做的(基于 Google Sender Guidelines 代码):

在发现正在进行的 Route 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

【问题讨论】:

    标签: android chromecast


    【解决方案1】:

    恕我直言,我认为解决此问题的正确方法(或至少是更好的方法)是以下之一:

    • 如果您只有一个活动并且这就是您所关心的,那么请使用一个在配置更改中持续存在的片段,并将您想要无缝持续存在的内容放在那里。这样,手机的旋转不会对您的演员表相关内容造成任何干扰。

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

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

    【讨论】:

    • 不,我没有断开连接。阅读您的答案,我现在发现我误解了“会话恢复”的内容。如果 Activity 被销毁,则断开连接是有意义的,因为一旦投射与 Activity 生命周期相关联,它应该是用户停止投射的愿望。文档解决了进程被终止时重新连接的需求。谢谢阿里!!
    • 关于第二种方式,我相信我可以使用前台服务来做同样的事情,让用户知道应用程序已连接并且即使 Activity 被销毁也可以进行强制转换。看起来 Netflix 应用程序是这样工作的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-27
    • 2018-08-22
    • 1970-01-01
    • 2020-10-28
    相关资源
    最近更新 更多