web-dev-qa-db-ja.com

FLAG_ACTIVITY_CLEAR_TASKが設定されているときにstartActivityで黒い画面を回避するにはどうすればよいですか?

私は以下を使用して新しい活動を開始しています:

Intent intent = new Intent(this, MyNewActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
overridePendingTransition(0, 0);

MyNewActivityの起動中は、黒い画面が表示されます。

Intent.FLAG_ACTIVITY_CLEAR_TASKを削除すると、アクティビティは黒い画面を表示せずに起動されます(代わりに、新しいアクティビティが読み込まれている間、前のアクティビティが表示されます)。

この黒い画面を回避する方法はありますか?フラグを削除することはオプションではないようです(現在のタスクのスタックをすべてクリアし、ルートとして新しいアクティビティを起動する必要があります)。

EDIT:問題を再現する非常に単純なコードを添付します(アプリにTheme.AppCompatなどのダークテーマを設定します)。黒い画面が表示される時間はごくわずかですが(起動時に受信アクティビティが実行する作業の数によって異なります)、表示されます。 FLAG_ACTIVITY_CLEAR_TASKを使用しない場合、黒い画面は表示されず、移行はスムーズです。

MainActivity

public class MainActivity extends ActionBarActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        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, MyNewActivity.class);
                intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
                startActivity(intent);
                overridePendingTransition(0,0);
            }
        });
    }
}

MyNewActivity

public class MyNewActivity extends ActionBarActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_new);
    }
}

activity_main.xml

<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    Android:background="@Android:color/holo_blue_bright">

    <Button
        Android:id="@+id/button"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:text="CLICK ME!" />

</RelativeLayout>

activity_new.xml

<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    Android:background="@Android:color/holo_green_light">

    <TextView
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:text="I am the new activity!" />

</RelativeLayout>

ありがとう!

10
Ereza

「黒い画面」(別名「プレビュー」)を完全に回避するには、AppThemeに次を追加します。

<style name="AppTheme" parent="Theme.AppCompat">
    <item name="Android:windowDisablePreview">true</item>
    ...
</style>

ただし、より良いアプローチは、Activity.onCreate中にメインスレッドで行うことを減らし、ユーザーが待機している間にプレビュー画面を表示することです。スムーズに移行するために、ウィンドウにカスタムの背景を設定して、これをテーマに追加できます。

<style name="AppTheme" parent="Theme.AppCompat">
    <item name="Android:windowBackground">@drawable/slash_screen</item>
    ...
</style>
21