处理屏幕旋转和媒体路由按钮以及现有会话的正确方法是啥?

Posted

技术标签:

【中文标题】处理屏幕旋转和媒体路由按钮以及现有会话的正确方法是啥?【英文标题】:What is the proper way to handle a screen rotation and the media route button and the existing session?处理屏幕旋转和媒体路由按钮以及现有会话的正确方法是什么? 【发布时间】:2014-01-08 17:09:04 【问题描述】:

https://developers.google.com/cast/cast_2nd-screen_app_tutorial 上的示例显示了一个调用unregisterMediaRouteProvideronDestroy 方法。这会导致调用MediaRouter.Callback.onRouteUnselected 方法,从而结束会话。这会导致应用程序与 chromecast 设备断开连接,MediaRouteButton 不再显示为蓝色。下面是示例中的onDestroy 方法:

@Override
protected void onDestroy() 
    MediaRouteHelper.unregisterMediaRouteProvider(mCastContext);
    mCastContext.dispose();
    super.onDestroy();

所以我的问题是,从应用程序使用 chromecast 设备时,处理屏幕旋转的正确方法是什么?

【问题讨论】:

【参考方案1】:

您可以尝试使用 Activity 的isFinishing() 方法来确定 onDestroy 是由于应用程序真正“完成”而被调用还是由于其他原因而被调用。另一种选择是自己处理方向变化。

【讨论】:

【参考方案2】:

您可以在https://developers.google.com/cast/docs/android_sender 上查看处理 Chromecast 设置/销毁(例如发生方向变化时)的指南

相关的代码部分如下:

@Override
protected void onResume() 
   super.onResume();
   mMediaRouter.addCallback(mMediaRouteSelector, mMediaRouterCallback,
   MediaRouter.CALLBACK_FLAG_REQUEST_DISCOVERY);


@Override
protected void onPause() 
   if (isFinishing()) 
   mMediaRouter.removeCallback(mMediaRouterCallback);
   
super.onPause();

还有以下代码:

@Override
protected void onStart() 
  super.onStart();
  mMediaRouter.addCallback(mMediaRouteSelector, mMediaRouterCallback,
  MediaRouter.CALLBACK_FLAG_REQUEST_DISCOVERY);


@Override
protected void onStop() 
   mMediaRouter.removeCallback(mMediaRouterCallback);
   super.onStop();

在您的程序中使用布尔值也是一个好主意,例如“wasLaunched”或“isConnected”来跟踪与 chromecast 的连接是否处于活动状态。我在我的代码中使用这个变量来检查我是否可以向接收者发送消息。然后只需记住保存此变量并在设备上发生方向更改时恢复它。这适用于我启用 chromecast 的应用程序。保存/恢复我的变量的代码,以便它适应方向变化如下所示:

protected void onSaveInstanceState(Bundle bundle)      
    if (bundle!=null)
    
        bundle.putBoolean("wasLaunched", wasLaunched);
    
    super.onSaveInstanceState(bundle);  


protected void onRestoreInstanceState(Bundle savedInstanceState) 
    if (savedInstanceState!=null)
    
        wasLaunched = savedInstanceState.getBoolean("wasLaunched");
    
    super.onRestoreInstanceState(savedInstanceState);
;

当然,您也可以将其他需要在方向更改后幸存下来的东西放入您的捆绑包中。我没有使用你在那里描述的 onDestroy 覆盖,我链接到的谷歌文档中也没有提到它。但是我使用链接到的文档中描述的 teardown() 方法进行清理,但这仅在我关闭连接时发生,因为我不想在方向更改时关闭与 chromecast 的连接。

【讨论】:

我想我在官方SDK发布之前就问过这个问题了,不过还是谢谢你的关注。 设备进入屏幕锁定状态时有没有办法保持连接? 但我认为您不会在屏幕锁定时失去与 chromecast 的连接? (至少如果你这样做了,那么它应该可以保持连接,因为这正是 Netflix 应用程序所做的,因为它也可以在屏幕锁定中工作)

以上是关于处理屏幕旋转和媒体路由按钮以及现有会话的正确方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

在屏幕旋转之前,自动布局约束不正确? [复制]

屏幕旋转的处理方法,实现视图位置的变化

屏幕旋转时,小部件上的按钮单击丢失

UIToolbar 在屏幕顶部时无法正确旋转

如何在颤动中自动登录现有用户

屏幕旋转后按钮消失