【发布时间】:2011-10-26 22:20:11
【问题描述】:
在我的应用程序中,我有一个以横向模式播放 http 直播视频的活动。
我的 AndroidManifest.xml:
<activity android:name=".MediaPlayerActivity"
android:label="@string/menu_player"
android:launchMode="singleInstance"
android:screenOrientation="landscape">
</activity>
我的活动布局:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@color/black">
<VideoView android:id="@+id/myVideoView"
android:layout_height="fill_parent"
android:layout_width="fill_parent"
android:layout_gravity="center_horizontal"
android:layout_alignParentTop="true"
android:layout_alignParentRight="true"
android:layout_alignParentBottom="true"
android:layout_alignParentLeft="true"/>
</LinearLayout>
问题是每次我关闭此活动(通过单击后退按钮),它总是在关闭之前旋转到纵向模式(时间很快,但您实际上可以在返回上一个活动之前在真实设备上看到效果)。我该如何解决这个烦人的问题?
更新更多信息
这种烦人的行为只有在前一个活动是纵向模式时才会发生,如果前一个是横向模式,那就没问题了。对我来说,当使用不同的 screenOrientation 设置淡入/淡出活动时,它看起来与 Android 框架有关。
更新原因
在深入阅读了 Google 的 API 之后,我想我找到了导致这种烦人行为的原因,请查看 here:
除非您另外指定,否则配置更改(例如屏幕方向、语言、输入设备等的更改)将导致您当前的活动被破坏,并通过 onPause() 的正常活动生命周期过程,onStop( ) 和 onDestroy() 视情况而定。如果 Activity 位于前台或用户可见,则在该实例中调用 onDestroy() 后,将创建该 Activity 的新实例,使用前一个实例从 onSaveInstanceState(Bundle) 生成的 saveInstanceState。
所以点击后退按钮时幕后发生了什么: currnet VideoView Activity(横向)被销毁,由于 screenOrientation 配置已更改,创建了一个新的 VideoView Activity(纵向),并立即销毁(您可以在其中看到效果在屏幕上),显示堆栈中的最后一个活动。这也解释了为什么如果最后一个活动具有相同的屏幕方向设置,这种烦人的行为就会消失。
由于配置更改,我仍在试图弄清楚如何绕过此活动重新创建。正如 API 中所述,覆盖 然而,onConfigurationChanged(Configuration),因为我在 xml 中明确定义了 screenOrientation,所以没有调用 onConfigurationChanged(),很多类似的 SO 之前已经讨论过,比如this one。
请提供正确方向的答案。
谢谢,
是的
【问题讨论】:
-
我不知道这是否正确 b/c 我没有遇到问题.. 您是否考虑过覆盖后退按钮并在按下时尝试完成()(至少这是第一个我会尝试)。
-
刚刚试过,同样的行为,顺便说一句,我使用的是 Galaxy s2,我怀疑这与设备有关。