如何实现onRetainNonConfigurationInstance

7

我在 Android 上制作了一个媒体播放器,它运行得很好,但是当我更改屏幕方向时,活动会被重新启动。我知道这个问题已经在 StackOverflow 上多次提问,但是没有一个答案能够帮助我。我认为我应该使用:onRetainNonConfigurationInstance。

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

但我不知道正确的实现方式,如果有人能给我提供一个教程或者隐式示例,我将不胜感激。

3个回答

7

我认为onRetainNonConfigurationInstance()已经被弃用,它会告诉你使用Fragments代替。 这里是一个关于Fragment的文档链接。基本上,你需要将UI和数据放入自定义的Fragment中,然后使用FragmentManager来存储你的Fragment的实例。然后,当活动重新启动时,你可以获取你的Fragment并根据需要重新定位。


1
我目前正在使用一个单独的线程来处理某些事情,我可以想象Fragments在那里行不通。 - basickarl
1
现在,片段已被弃用。 - OdraEncoded
1
片段并没有被弃用,只有原生片段被弃用了。支持片段不会很快消失。 - swooby
1
文档建议使用 Fragment#setRetainInstance(boolean) 方法,但该方法在 API 级别 28 中已被弃用。 - Viktor Brešan

3

不要介意它已经被弃用,它运行良好。最简单的方法是:

public Object onRetainNonConfigurationInstance() {
   return this;
}

然后在YourActivityonCreate()方法中:

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

对不起,这可能是一个愚蠢的问题,但我应该把我想保存的所有属性都放在onRetainNonConfigurationInstance()中吗? - AndroidM
是的,您想要保存的所有内容都可以以单个对象的形式保存。因此,当您返回整个Activity时,您会得到所有内容,但这可能太多了,也许您只需要一个或两个字段,因此您可以返回自己的MyState对象。不,不需要进行清单更改。 - Alexander Kulyakhtin
但是我在答案中已经做了。哪里出了问题?我的Activity扩展了Activity,没有片段。 - Alexander Kulyakhtin
是的,我的活动也扩展了Activity,但我没有得到结果。 - AndroidM
@Alex 显然,这应该被视为不良实践。在类本身死亡之前,静态变量将一直保留在内存中。而且,只有当进程被杀死时,类和类加载器才会被清除出内存,它们在类加载时会一直保留在内存中。但是,即使回到 UI 栈上,它仍然在使用那些内存。它会使您的程序更需要死亡,因为它的暂停状态需要实际的内存而不是内部内存/磁盘。但是,在我看过的每个实现中,它都会在活动被杀死之前存活下来。旋转也不会卸载类。 - Tatarize
显示剩余3条评论

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

我希望这能对某人有所帮助。


现在,想象一下你有多个方向相关的资源,你打算手动加载它们吗?不行,这样做不太好。如果你没有很多配置相关的资源,你可以实现这个功能。 - Farid

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接