处理屏幕方向 - Android

2023-12-09

我的应用程序中的屏幕方向出现问题。我在 res/layout-lan 文件夹中为横向模式创建了备用布局。问题发生在方向改变时,

1.重新创建一个活动而不破坏旧的活动。

2.由于我在应用程序中使用媒体播放器,因此在屏幕旋转时 .mp3 同时在两个方向上播放。

我无法找到正确的示例代码来处理屏幕方向并保存和恢复活动的状态............


1.重新创建一个活动而不破坏旧的活动。

的休闲娱乐Activity是发生配置更改时 Android 的自然默认行为。您的旧 Activity 在内存中徘徊的可能原因是它引用了当前正在播放的 Activity 实例MediaPlayer.

因为横向和纵向使用不同的布局资源,所以让 Android 重新创建 Activity 并每次提取适当的资源对您有利。如果您自己处理旋转,您也将负责重新加载正确的布局。

2.由于我在应用程序中使用媒体播放器,因此在屏幕旋转时 .mp3 同时在两个方向上播放。

这个问题有两种解决方案...

理想的解决方案是将您的媒体播放转移到Service. The Activity可以调用Service启动/停止/等等。当用户指示时播放,但将其放入后台组件中,例如Service即使您的Activity由于变化而不断变化。这是 Android 团队鼓励的设计模式,您的Activity实际上只处理用户界面。

另一个可行的解决方案是通过您的MediaPlayer从旧的Activity到新的使用onRetainNonConfigurationInstance()。这允许单MediaPlayer存在于之间Activity实例,保持播放一致。例如:

public class MyActivity extends Activity {
    private MediaPlayer mPlayer;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //Check if we have a player passed in from the last instance
        mPlayer = (MediaPlayer)getLastNonConfigurationInstance();
        //If not, make a new one
        if (mPlayer == null) {
            mPlayer = new MediaPlayer();
           //...Set up new player instance...
        }
    }

    @Override
    public Object onRetainNonConfigurationInstance() {
        //Clear our member variable to guarantee this Activity
        // is allowed to GC after onDestroy()
        MediaPlayer instance = mPlayer;
        mPlayer = null;
        //Hand our current player up to the next Activity to be created
        return instance;
    }

}

确保最佳内存清理的另一种选择是定义mPlayer as a WeakReference<MediaPlayer>允许 GC 认领旧的Activity,即使MediaPlayer在配置更改时正在播放音频。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

处理屏幕方向 - Android 的相关文章

随机推荐