如何实现onRetainNonConfigurationInstance

问题描述 投票:0回答:4

我用android做了一个媒体播放器 它工作得很好,但是当我更改屏幕方向时,活动正在重新启动 我知道这个问题已经在 stackoverflow 上被问过好几次了 但没有一个答案对我有帮助。 我想我应该使用:onRetainNonConfigurationInstance

    @Override 
public Object onRetainNonConfigurationInstance() { ... }

但我不知道正确的实现方法 因此,如果有人能给我一个教程或一个隐含的例子,我将不胜感激

android screen-orientation
4个回答
7
投票

我相信

onRetainNonConfigurationInstance()
已被弃用。它会告诉您使用
Fragments
来代替。 Here 是指向
Fragment
文档的链接。基本上,您将把 UI 和数据放入自定义
Fragment
中,然后使用
FragmentManager
存储
Fragment
的实例。然后,当活动重新启动时,您可以获取
Fragment
并根据需要重新定位。


3
投票

别介意它已被弃用,它工作得很好。最简单的是:

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;
   }
}

0
投票

在我的媒体播放器中,为了不完全重新创建 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);
}

我希望这对某人有帮助。


0
投票
来自AppCompatActivity的

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()
© www.soinside.com 2019 - 2024. All rights reserved.