设置 FLAG_ACTIVITY_CLEAR_TASK 时如何避免 startActivity 出现黑屏?
How to avoid black screen on startActivity when FLAG_ACTIVITY_CLEAR_TASK is set?
我正在使用以下内容启动新的 activity:
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
,启动 activity 时不会随时显示黑屏(相反,加载新的 activity 时会显示前一个 activity)。
有什么办法可以避免黑屏吗?删除标志似乎不是一个选项(我需要清除所有当前任务的堆栈并启动一个新的 activity 作为根任务)。
编辑: 我附加了一个非常简单的代码来重现这个问题(为应用程序设置一个深色主题,例如 Theme.AppCompat
)。黑屏显示的时间很短(取决于启动时接收 activity 所做的工作量),但您可以看到它。如果不使用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>
谢谢!
要完全避免 "black screen"(又名 "preview"),您可以将以下内容添加到 AppTheme
:
<style name="AppTheme" parent="Theme.AppCompat">
<item name="android:windowDisablePreview">true</item>
...
</style>
然而,更好的方法是在 Activity.onCreate
期间在主线程上做更少的事情,并在用户等待时显示预览屏幕。
为了顺利过渡,您可以为 windows 设置自定义背景,将其添加到您的主题中:
<style name="AppTheme" parent="Theme.AppCompat">
<item name="android:windowBackground">@drawable/slash_screen</item>
...
</style>
我正在使用以下内容启动新的 activity:
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
,启动 activity 时不会随时显示黑屏(相反,加载新的 activity 时会显示前一个 activity)。
有什么办法可以避免黑屏吗?删除标志似乎不是一个选项(我需要清除所有当前任务的堆栈并启动一个新的 activity 作为根任务)。
编辑: 我附加了一个非常简单的代码来重现这个问题(为应用程序设置一个深色主题,例如 Theme.AppCompat
)。黑屏显示的时间很短(取决于启动时接收 activity 所做的工作量),但您可以看到它。如果不使用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>
谢谢!
要完全避免 "black screen"(又名 "preview"),您可以将以下内容添加到 AppTheme
:
<style name="AppTheme" parent="Theme.AppCompat">
<item name="android:windowDisablePreview">true</item>
...
</style>
然而,更好的方法是在 Activity.onCreate
期间在主线程上做更少的事情,并在用户等待时显示预览屏幕。
为了顺利过渡,您可以为 windows 设置自定义背景,将其添加到您的主题中:
<style name="AppTheme" parent="Theme.AppCompat">
<item name="android:windowBackground">@drawable/slash_screen</item>
...
</style>