Activity 调用 finish() 后布局闪烁
Activity layout blinking after finish() is called
当我打开我的应用程序时,会启动一个 Activity,并且在它的 onCreate 方法中我正在检查一些条件。如果条件为真,我完成当前 Activity 并打开另一个。问题是:第一个 activity 在屏幕上闪烁,然后打开第二个。代码如下:
public class FirstActivity extends Activity {
@Override
protected final void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//some code here...
checkSomeStuff();
setContentView(R.layout.my_layout);
//some code here...
}
private void checkSomeStuff() {
if (/*some condition*/) {
final Intent intent = new Intent(this, SecondActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
finish();
startActivity(intent);
}
}
}
注意setContentView()是在check之后,但是在第二个activity开始之前,第一个还在屏幕上闪烁。
有谁知道怎么让它不眨眼吗?
提前致谢。
也许您可以更好地区分您的病情,以完全避免 setContentView()
当您计划 finish()
。
public class FirstActivity extends Activity {
@Override
protected final void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (someCondition()) {
goToNextActivity();
} else {
setContentView(R.layout.my_layout);
//some code here...
}
}
private boolean someCondition() {
/* return result of some condition */
}
private void goToNextActivity() {
final Intent intent = new Intent(this, SecondActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
finish();
startActivity(intent);
}
}
而不是
checkSomeStuff();
setContentView(R.layout.my_layout);
你应该做的
private void checkSomeStuff() {
if (//some condition) {
final Intent intent = new Intent(this, SecondActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
finish();
startActivity(intent);
}else{
setContentView(R.layout.my_layout);
}
}
您看到视图是因为在 onCreate 完成之前不会触发 Intent,因此 setContentView
被调用
您的代码顺序错误。你不应该在
之后调用任何东西
finish();
这是因为activity会被销毁。以下任何内容都可能导致奇怪的行为。
@Override
protected final void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//set my layout
setContentView(R.layout.my_layout);
//some code here...
finish();
//nothing here because activity will be destroyed
}
finish()的目的是销毁当前的activity并将其从返回栈中移除。通过调用 finish 然后触发意图,你要求 activity 自行销毁它(我假设眨眼是它试图恢复)然后将意图触发到第二个。将完成移至 startActivity()
之后
@Override
protected final void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//some code here...
if(checkSomeStuff()) {
setContentView(R.layout.my_layout);
//some code here...
}
}
private boolean checkSomeStuff() {
if (/*some condition*/) {
final Intent intent = new Intent(this, SecondActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
finish();
return false;
}
return true;
}
闪烁和闪烁Activity
- Reason finish();
- Remove finish() in Activity
- added android:noHistory="true" in AndroidManifest
android:noHistory
将从堆栈中清除 Activity,这需要在返回时清除,否则它会在屏幕上显示 activity A。
下面提到的技巧对我来说非常有效。希望这对其他人有用。
从 activity A.
打开 activity B
关闭activity B 我正在使用:
finish();
overridePendingTransition(0, 0);
避免黑色闪烁问题。
试试你的风格
<style name="CHTheme" parent="Theme.AppCompat.Light">
<item name="android:windowDisablePreview">true</item>
</style>
当我打开我的应用程序时,会启动一个 Activity,并且在它的 onCreate 方法中我正在检查一些条件。如果条件为真,我完成当前 Activity 并打开另一个。问题是:第一个 activity 在屏幕上闪烁,然后打开第二个。代码如下:
public class FirstActivity extends Activity {
@Override
protected final void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//some code here...
checkSomeStuff();
setContentView(R.layout.my_layout);
//some code here...
}
private void checkSomeStuff() {
if (/*some condition*/) {
final Intent intent = new Intent(this, SecondActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
finish();
startActivity(intent);
}
}
}
注意setContentView()是在check之后,但是在第二个activity开始之前,第一个还在屏幕上闪烁。 有谁知道怎么让它不眨眼吗?
提前致谢。
也许您可以更好地区分您的病情,以完全避免 setContentView()
当您计划 finish()
。
public class FirstActivity extends Activity {
@Override
protected final void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (someCondition()) {
goToNextActivity();
} else {
setContentView(R.layout.my_layout);
//some code here...
}
}
private boolean someCondition() {
/* return result of some condition */
}
private void goToNextActivity() {
final Intent intent = new Intent(this, SecondActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
finish();
startActivity(intent);
}
}
而不是
checkSomeStuff();
setContentView(R.layout.my_layout);
你应该做的
private void checkSomeStuff() {
if (//some condition) {
final Intent intent = new Intent(this, SecondActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
finish();
startActivity(intent);
}else{
setContentView(R.layout.my_layout);
}
}
您看到视图是因为在 onCreate 完成之前不会触发 Intent,因此 setContentView
被调用
您的代码顺序错误。你不应该在
之后调用任何东西finish();
这是因为activity会被销毁。以下任何内容都可能导致奇怪的行为。
@Override
protected final void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//set my layout
setContentView(R.layout.my_layout);
//some code here...
finish();
//nothing here because activity will be destroyed
}
finish()的目的是销毁当前的activity并将其从返回栈中移除。通过调用 finish 然后触发意图,你要求 activity 自行销毁它(我假设眨眼是它试图恢复)然后将意图触发到第二个。将完成移至 startActivity()
之后 @Override
protected final void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//some code here...
if(checkSomeStuff()) {
setContentView(R.layout.my_layout);
//some code here...
}
}
private boolean checkSomeStuff() {
if (/*some condition*/) {
final Intent intent = new Intent(this, SecondActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
finish();
return false;
}
return true;
}
闪烁和闪烁Activity
- Reason finish();
- Remove finish() in Activity
- added android:noHistory="true" in AndroidManifest
android:noHistory
将从堆栈中清除 Activity,这需要在返回时清除,否则它会在屏幕上显示 activity A。
下面提到的技巧对我来说非常有效。希望这对其他人有用。
从 activity A.
打开 activity B关闭activity B 我正在使用:
finish();
overridePendingTransition(0, 0);
避免黑色闪烁问题。
试试你的风格
<style name="CHTheme" parent="Theme.AppCompat.Light">
<item name="android:windowDisablePreview">true</item>
</style>