我用android做了一个媒体播放器 它工作得很好,但是当我更改屏幕方向时,活动正在重新启动 我知道这个问题已经在 stackoverflow 上被问过好几次了 但没有一个答案对我有帮助。 我想我应该使用:onRetainNonConfigurationInstance
@Override
public Object onRetainNonConfigurationInstance() { ... }
但我不知道正确的实现方法 因此,如果有人能给我一个教程或一个隐含的例子,我将不胜感激
我相信
onRetainNonConfigurationInstance()
已被弃用。它会告诉您使用 Fragments
来代替。 Here 是指向 Fragment
文档的链接。基本上,您将把 UI 和数据放入自定义 Fragment
中,然后使用 FragmentManager
存储 Fragment
的实例。然后,当活动重新启动时,您可以获取 Fragment
并根据需要重新定位。
别介意它已被弃用,它工作得很好。最简单的是:
public Object onRetainNonConfigurationInstance() {
return this;
}
然后在
YourActivity
的onCreate()
public void onCreate(Bundle savedState)
{
YourActivity prevActivity = (YourActivity)getLastNonConfigurationInstance();
if(prevActivity!= null) {
// So the orientation did change
// Restore some field for example
this.myValue = prevActivity.myValue;
}
}
在我的媒体播放器中,为了不完全重新创建 MediaPlayer,我执行了以下操作:
1)在AndroidManifest.xml中添加
<activity
android:name=".MainActivity"
android:configChanges="orientation|screenSize">
2)在MainActivity中添加
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
setSize(mVideoWidth, mVideoHeight);
}
我希望这对某人有帮助。
onRetainCustomNonConfigurationInstance
来自 Activity 的 onRetainNonConfigurationInstance
当屏幕翻转时,对象 A 将存活。
如果用户破坏屏幕,对象 A 将被破坏。
class A private constructor() {
var data: Int = 0
var isConfiguration: Boolean = false
companion object {
private var instance: A? = null
fun getInstance(
data: Int,
isConfiguration: Boolean
): A {
synchronized(this) {
if (instance == null) {
instance = A()
}
instance!!.data = data
instance!!.isConfiguration = isConfiguration
return instance!!
}
}
fun clear() {
synchronized(this) {
instance?.apply {
if (!isConfiguration) {
instance = null
} else isConfiguration = false
}
}
}
}
}
应用程序兼容性活动
override fun onRetainCustomNonConfigurationInstance(): Any {
return A.getInstance(0, true)
}
创建时
val a = lastCustomNonConfigurationInstance as? A
销毁时
A.clear()