Android 6.0 から onCreate() で finish() していない Activity に Theme.NoDisplay をセットすると startActivity() したときにクラッシュします。 Theme.Translucent や Theme.Translucent.NoTitleBar はクラッシュしません。クラッシュ時の Exception は IllegalStateException で、メッセージは did not call finish() prior to onResume() completing です。
この原因となるテーマ属性は windowNoDisplay です。デフォルトは false ですが、Theme.NoDisplay では true がセットされています。つまり
onCreate() で finish() していない Activity のテーマで windowNoDisplay が true だとクラッシュします。
次のように onCreate() で finish() していればクラッシュしません。
- public class NoDisplayActivity extends Activity {
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- finish();
- }
- }
- <activity android:name=".NoDisplayActivity"
- android:theme="@android:style/Theme.NoDisplay" />
if set to true, and this window is the main window of an Activity, then it will never actually be added to the window manager. This means that your activity must immediately quit without waiting for user interaction, because there will be no such interaction coming.
とあるので、正しい挙動になったと言えるのでしょう。
- 関連
- FacebookActivity did not call finish() on Api 23+ : stack over flow
- Activity did not call finish? (API 23) : stack over flow
- https://commonsware.com/blog/2015/11/02/psa-android-6p0-theme.nodisplay-regression.html
- <style name="Theme.NoDisplay">
- <item name="windowBackground">@null</item>
- <item name="windowContentOverlay">@null</item>
- <item name="windowIsTranslucent">true</item>
- <item name="windowAnimationStyle">@null</item>
- <item name="windowDisablePreview">true</item>
- <item name="windowNoDisplay">true</item>
- </style>
- <style name="Theme.Translucent">
- <item name="windowBackground">@color/transparent</item>
- <item name="colorBackgroundCacheHint">@null</item>
- <item name="windowIsTranslucent">true</item>
- <item name="windowAnimationStyle">@style/Animation</item>
- </style>
- <style name="Theme.Translucent.NoTitleBar">
- <item name="windowNoTitle">true</item>
- <item name="windowContentOverlay">@null</item>
- </style>
0 件のコメント:
コメントを投稿