2016年2月2日火曜日

Theme.NoDisplay は onCreate() で finish() する Activity 以外で使うと Android 6.0 でクラッシュする

Issue 2353: Activity crash with @android:style/Theme.NoDisplay : android-developer-preview

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" /> windowNoDisplay のドキュメントには
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.
とあるので、正しい挙動になったと言えるのでしょう。

- 関連 - 参考

0 件のコメント:

コメントを投稿