I'm working on an app and encountered a strange behavior on 8.1 Devices (Pixel2, Nexus5x), so I wrote a small App to verify this behavior.
MainActivity is locked to portrait mode while LandscapeActivity is locked to landscape. MainActivity starts the LandscapeActivity for Result. Screen Switches from portrait to landscape as expected. When LandscapeActivity is finished it propagates the Result to MainActivity, while switching back to portrait (as expected).
But Sometimes I encounter kind of a bug here. After onActivityResult in MainActivity it switches from portrait to landscape to switch back to portrait immediately. While I can handle the state, it still looks nasty.
For traceability I will post everything to rebuild it.
What can I do to prevent it? Also note that it does not happen every time, and as far as I can test on 8.1 devices ONLY. It seems fine on android devices below 8.1
EDIT:
Added android:configChanges="orientation|screenSize" to my manifest as @Floern suggested in his answer without success.
A confirmation on a platform bug will be an acceptable answer, too
Manifest
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity"
android:screenOrientation="portrait"
android:configChanges="orientation|screenSize">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".LandscapeActivity"
android:screenOrientation="landscape"/>
</application>
MainActivity
public class MainActivity extends AppCompatActivity {
public static final String TAG = MainActivity.class.getSimpleName();
private static final int REQ_CODE = 878;
@Override
protected void onCreate(Bundle savedInstanceState) {
Log.d(TAG, "onCreate: savedInstanceState=" + savedInstanceState + ", orientation=" + orientation());
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this, LandscapeActivity.class);
startActivityForResult(intent, REQ_CODE);
}
});
}
@Override
protected void onResume() {
Log.d(TAG, "onResume: orientation=" + orientation());
super.onResume();
}
@Override
protected void onPause() {
Log.d(TAG, "onPause: orientation=" + orientation());
super.onPause();
}
@Override
protected void onStart() {
Log.d(TAG, "onStart: orientation=" + orientation());
super.onStart();
}
@Override
protected void onStop() {
Log.d(TAG, "onStop: orientation=" + orientation());
super.onStop();
}
@Override
protected void onDestroy() {
Log.d(TAG, "onDestroy: orientation=" + orientation());
super.onDestroy();
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
Log.d(TAG, "onActivityResult: orientation=" + orientation());
if (requestCode == REQ_CODE){
Toast.makeText(this, "Result=" + data.getStringExtra(LandscapeActivity.KEY_DATA), Toast.LENGTH_LONG).show();
}
}
String orientation(){
return getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE ? "Landscape" : "Portrait";
}
}
LandscapeActivity
public class LandscapeActivity extends AppCompatActivity{
public static final String TAG = LandscapeActivity.class.getSimpleName();
public static final String KEY_DATA = "DATA";
static int COUNTER = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
Log.d(TAG, "onCreate: savedInstanceState=" + savedInstanceState + "orientation=" + (getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE ? "Landscape" : "Portrait"));
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent data = new Intent();
COUNTER++;
data.putExtra(KEY_DATA, "Runned " + COUNTER + " times");
setResult(RESULT_OK, data);
finish();
}
});
}
@Override
protected void onResume() {
Log.d(TAG, "onResume: orientation=" + orientation());
super.onResume();
}
@Override
protected void onPause() {
Log.d(TAG, "onPause: orientation=" + orientation());
super.onPause();
}
@Override
protected void onStart() {
Log.d(TAG, "onStart: orientation=" + orientation());
super.onStart();
}
@Override
protected void onStop() {
Log.d(TAG, "onStop: orientation=" + orientation());
super.onStop();
}
@Override
protected void onDestroy() {
Log.d(TAG, "onDestroy: orientation=" + orientation());
super.onDestroy();
}
String orientation(){
return getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE ? "Landscape" : "Portrait";
}
}
build.gradle
android {
compileSdkVersion 26
defaultConfig {
applicationId "android.example.com.orientationtest8_1"
minSdkVersion 15
targetSdkVersion 26
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
layout activity_main File:
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="android.dermalog.com.orientationtest8_1.MainActivity">
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</android.support.constraint.ConstraintLayout>
And last a Log from clicking on Buttons repeatadly:
01-04 15:18:06.744 D/MainActivity: onCreate: savedInstanceState=null
01-04 15:18:06.847 D/MainActivity: onStart: orientation=Portrait
01-04 15:18:06.850 D/MainActivity: onResume: orientation=Portrait
01-04 15:18:14.036 D/MainActivity: onPause: orientation=Portrait
01-04 15:18:14.108 D/LandscapeActivity: onCreate: savedInstanceState=nullorientation=Landscape
01-04 15:18:14.139 D/LandscapeActivity: onStart: orientation=Landscape
01-04 15:18:14.141 D/LandscapeActivity: onResume: orientation=Landscape
01-04 15:18:14.217 D/MainActivity: onStop: orientation=Portrait
01-04 15:18:15.643 D/LandscapeActivity: onPause: orientation=Landscape
01-04 15:18:15.711 D/MainActivity: onActivityResult: orientation=Portrait
01-04 15:18:15.719 D/MainActivity: onStart: orientation=Portrait
01-04 15:18:15.720 D/MainActivity: onResume: orientation=Portrait
01-04 15:18:15.786 D/LandscapeActivity: onStop: orientation=Landscape
01-04 15:18:15.786 D/LandscapeActivity: onDestroy: orientation=Landscape
01-04 15:18:18.036 D/MainActivity: onPause: orientation=Portrait
01-04 15:18:18.097 D/LandscapeActivity: onCreate: savedInstanceState=nullorientation=Landscape
01-04 15:18:18.121 D/LandscapeActivity: onStart: orientation=Landscape
01-04 15:18:18.123 D/LandscapeActivity: onResume: orientation=Landscape
01-04 15:18:18.213 D/MainActivity: onStop: orientation=Portrait
01-04 15:18:19.505 D/LandscapeActivity: onPause: orientation=Landscape
01-04 15:18:19.564 D/MainActivity: onActivityResult: orientation=Portrait
01-04 15:18:19.569 D/MainActivity: onStart: orientation=Portrait
01-04 15:18:19.569 D/MainActivity: onResume: orientation=Portrait
01-04 15:18:19.639 D/LandscapeActivity: onStop: orientation=Landscape
01-04 15:18:19.640 D/LandscapeActivity: onDestroy: orientation=Landscape
01-04 15:18:20.102 D/MainActivity: onPause: orientation=Portrait
01-04 15:18:20.103 D/MainActivity: onStop: orientation=Portrait
01-04 15:18:20.104 D/MainActivity: onDestroy: orientation=Portrait
01-04 15:18:20.123 D/MainActivity: onCreate: savedInstanceState=Bundle[{android:viewHierarchyState=Bundle[{android:views={16908290=android.view.AbsSavedState$1@7ceec3, 2131165191=android.support.v7.widget.Toolbar$SavedState@3c34340, 2131165193=android.view.AbsSavedState$1@7ceec3, 2131165199=android.view.AbsSavedState$1@7ceec3, 2131165219=android.view.AbsSavedState$1@7ceec3, 2131165229=android.view.AbsSavedState$1@7ceec3}}], android:lastAutofillId=1073741823, android:fragments=android.app.FragmentManagerState@c215279}]
01-04 15:18:20.149 D/MainActivity: onStart: orientation=Landscape
01-04 15:18:20.152 D/MainActivity: onResume: orientation=Landscape
01-04 15:18:20.699 D/MainActivity: onPause: orientation=Landscape
01-04 15:18:20.701 D/MainActivity: onStop: orientation=Landscape
01-04 15:18:20.702 D/MainActivity: onDestroy: orientation=Landscape
01-04 15:18:20.718 D/MainActivity: onCreate: savedInstanceState=Bundle[{android:viewHierarchyState=Bundle[{android:views={16908290=android.view.AbsSavedState$1@7ceec3, 2131165191=android.support.v7.widget.Toolbar$SavedState@807af46, 2131165193=android.view.AbsSavedState$1@7ceec3, 2131165199=android.view.AbsSavedState$1@7ceec3, 2131165219=android.view.AbsSavedState$1@7ceec3, 2131165229=android.view.AbsSavedState$1@7ceec3}}], android:lastAutofillId=1073741823, android:fragments=android.app.FragmentManagerState@8d12507}]
01-04 15:18:20.748 D/MainActivity: onStart: orientation=Portrait
01-04 15:18:20.751 D/MainActivity: onResume: orientation=Portrait