我已经设置了锁定方向
我已经添加了以下两个简单类的示例代码:
SplashLandscapeActivity.java
public class SplashLandscapeActivity extends AppCompatActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d("start", "xxxx start Activity SplashLandscapeActivity");
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
startActivity(new Intent(SplashLandscapeActivity.this, TestActivity.class));
finish();
}
}, 500);
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.d("start", "xxxx onDestroy Activity SplashLandscapeActivity");
}
}
TestActivity.java
public class TestActivity extends AppCompatActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d("start", "xxxx start Activity TestActivity "
+ getResources().getConfiguration().orientation);
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.d("start", "xxxx onDestroy Activity TestActivity "
+ getResources().getConfiguration().orientation);
}
}
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity
android:name=".SplashLandscapeActivity"
android:theme="@style/SplashTheme"
android:screenOrientation="landscape">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
<activity
android:name=".TestActivity"
android:screenOrientation="portrait"/>
</application>
</manifest>
当我使用
new Handler().postDelayed
(SplashLandscapeActivity.java
)来启动 TestActivity
时,它会启动两次。第一次启动时屏幕是横屏,然后又切换回了竖屏。日志显示了全部内容:
如果我去掉这个xxxx start Activity SplashLandscapeActivity
xxxx start Activity TestActivity 2 // <== landscape
xxxx onDestroy Activity TestActivity 1
xxxx start Activity TestActivity 1 // <== portrait
xxxx onDestroy Activity SplashLandscapeActivity
Handler
,TestActivity
就能像正常情况下一样以竖屏方式启动。
所以,我的问题是:xxxx start Activity SplashLandscapeActivity
xxxx start Activity TestActivity 1
xxxx onDestroy Activity SplashLandscapeActivity
1- 这是系统问题还是预期行为?即使在
Manifest
中将 screenOrientation
设置为固定值,为什么 activity
仍然重新启动?
2- 实际上,我的真正项目没有任何Handler
,但是存在相同的问题,即在使用Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK
启动后,activity
被启动两次。我该如何解决这个问题?
TestActivity
之前应用程序是否会瞬间旋转一下?或者是直接跳转到纵向模式的TestActivity
而不进行旋转?我猜测这可能是由于在活动已经执行了onCreate
和onResume
之后调用了config更改,如果没有发生config更改,比如跳过SplashLandscapeActivity
直接启动TestActivity
,则不会调用它,因此不会重新启动TestActivity
。 - ahasbini