处理打开的 Tok 会话、发布服务器、订阅服务器配置更改(屏幕从纵向旋转到横向)



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

问题 1. 这些事情对于 Open Tok 是否可行(会话、发布者和订阅者是否可以在方向更改时维护)?

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

问题 3. 由于 Open Tok 为发布者和订阅者提供了 Android 视图,因此在方向更改时将它们保存在内存中是个好主意。

问题 4. 当我在设置"setRetainInstance(true);"的片段上尝试这个东西时第一次旋转屏幕后,它对我来说工作正常,但第二次它给出了以下异常:

com.getvokl.android.GetVoklAPP E/ActivityThread: Activity com.getvokl.android.GetVoklAPP.framework.activity.CallFriendActivity 泄露了最初在此处注册的 IntentReceiver com.opentok.android.Session$20@d210317。您是否错过了取消注册接收器()的调用?

当我检查它发生在我的片段类的onResume()方法上时,我提到了session.onResume()。

有几个选项可以在活动重新启动周期中保存 Opentok 对象。

一种选择是将实例保存在生命周期与活动不同的对象中。您也可以在活动中使用静态实例。看看这个使用配套对象的 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 文档所述,这不是首选方式。 另一种方法是自己处理配置更改。在这种情况下,您可以将android:configChanges="orientation"添加到应用清单中的活动声明中,然后在更改方向时不会重新启动活动,因此实例将保持活动状态。

但是,您需要自己处理发生的其余更改(如布局更改),这可能不是一件容易的事。

屏幕旋转处理的最简单方法是从体系结构组件实现 ViewModel。

最新更新