处理配置更改(屏幕旋转从纵向到横向)时的Open Tok会话,发布者,订阅者

时间:2019-04-05 16:29:51

标签: android opentok tokbox

在我的应用程序中,有一个活动,一个发布者和三个订阅者可以在一个会话中互相对话。我已经以肖像模式开发了整个概念。现在的要求是,当用户将其设备从纵向模式旋转到横向模式时,我在纵向模式下显示的当前视图将被更改,新视图将显示给用户。

问题1。 这些事情在Open Tok上是否可行(会话,发布者和订阅者能否在方向改变时得到维持?)?

问题2。 我不想与发布者和订阅者重新创建会话。如何在“活动方向”更改时保留当前会话,创建的发布者和订阅者?

问题3。 由于Open Tok为发布者和订阅者提供了Android View,因此最好将它们保存在更改方向的内存中。

问题4。 当我尝试使用我在其中设置“ setRetainInstance(true);”的片段进行此操作时第一次旋转屏幕后,对我来说效果很好,但是第二次出现以下异常:

com.getvokl.android.GetVoklAPP E / ActivityThread:活动com.getvokl.android.GetVoklAPP.framework.activity.CallFriendActivity泄漏了最初在此处注册的IntentReceiver com.opentok.android.Session$20@d210317。您是否缺少对unregisterReceiver()的呼叫?

当我选中它时,它发生在我提到session.onResume()的Fragment类的onResume()方法上。

2 个答案:

答案 0 :(得分:0)

在“活动”重启周期中有几种保存Opentok对象的选项。

一个选项可以将实例保存在其生命周期与活动不同的对象中。您也可以在Activity中使用静态实例。使用辅助对象看一下这个Kotlin示例:

class OpenTokState {
    lateinit var s: Session
    lateinit var p: Publisher
    var initialized = false
}

class MainActivity : AppCompatActivity() {
    val API_KEY = ".."
    val TOKEN = "..."
    val SESSION_ID = "..."


    companion object {
        var opentok = OpenTokState()
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        ...
        if (!opentok.initialized) {
            opentok.initialized = true
            opentok.s = Session.Builder(this, API_KEY, SESSION_ID).build()
        ...
    }
}

伴随对象是一个静态实例,以静态方式表示,在所有MainActivity实例中都将是相同的。

请注意,如果您采用这种方法,则需要采取重要的考虑,您需要 在活动的onDestroy方法中将发布者/订阅者视图从其父项中移除并将其视图再次添加到容器的新实例中。

还有另一种选择,但是正如Android文档所述,这不是首选的方式。 这是handling the configuration changes by yourself的另一种方法。在这种情况下,您可以在应用清单中的活动声明中添加android:configChanges="orientation",然后在更改方向时不会重新启动活动,因此实例将保持活动状态。

但是,您需要自己处理其余的其余更改(例如布局更改),这可能并非易事。

答案 1 :(得分:0)

处理屏幕旋转的最简单方法是从ViewModel开始实施Architecture Components