Я запускаю новую активность, используя следующее:
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, черный экран не отображается и переход плавный:
Основное действие
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);
}
});
}
}
Моя новая активность
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>
Спасибо!
onCreate(). Вместо этого разгрузите материал в фоновом потоке, который вы запускаете вonCreate(). - person David Wasser   schedule 12.03.2015Intent.FLAG_ACTIVITY_CLEAR_TOPвместоCLEAR_TASK. Это будет работать только в том случае, если вы оставите исходный экземплярMyNewActivityв стеке (т.е. не закончите его при запуске других действий). Если это все еще не помогает, вы можете попробоватьIntent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP. Это удалит все остальные действия из стека и вернет существующий экземплярMyNewActivity. В этом случае вы можете добавить кIntentдополнительный элемент, которыйMyNewActivityможет регистрировать вonNewIntent(), и если он установлен, он может повторно инициализировать себя. - person David Wasser   schedule 13.03.2015Intent,FLAG_ACTIVITY_CLEAR_TOPв моем случае бесполезен, так как я бы никогда не запустилMyNewActivity, и я хочу очистить весь предыдущий стек активности. Например, у меня есть следующий поток:A-›B-›C-›D-›MyNewActivityЯ хочу стереть из стека действий действияA,B,CиDи запуститьMyNewActivity. Единственный флаг, который делает то, что я хочу, этоIntent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK. По крайней мере, это единственное, о чем я знаю. - person Ereza   schedule 13.03.2015FLAG_ACTIVITY_CLEAR_TASKи вместо этого вызватьfinish()после начала новой активности. эта ссылка мне очень помогла . - person Mehran Zamani   schedule 23.09.2017