调用finish()后活动布局闪烁
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了调用finish()后活动布局闪烁相关的知识,希望对你有一定的参考价值。
当我打开我的应用程序时,会启动一个Activity,并且在其onCreate方法中我正在检查某些条件。如果条件为真,我完成当前活动并打开另一个活动。问题是:第一个活动在屏幕上闪烁,然后第二个活动打开。代码如下:
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()在检查之后,但在第二个活动开始之前,第一个活动仍然在屏幕上闪烁。有谁知道怎么让它不眨眼?
提前致谢。
答案
finish()的目的是销毁当前活动并将其从后堆栈中删除。通过调用完成然后触发意图,你要求活动自我销毁(我假设眨眼是它试图恢复)然后将意图发射到第二个。在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;
}
另一答案
您的代码顺序错误。之后你不应该打电话
finish();
这是因为活动将被销毁。以下任何操作都可能导致奇怪的行为。
@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
}
另一答案
闪烁和闪烁活动
- Reason finish();
- Remove finish() in Activity
- added android:noHistory="true" in AndroidManifest
android:noHistory
将清除堆栈中的活动,需要在背面清除,否则它会在屏幕上显示活动A.
另一答案
而不是做
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完成之前意图不会触发,因此调用setContentView
另一答案
下面提到的技巧对我来说非常合适。希望这对其他人有用。
从活动A开始活动B.
关闭活动B我正在使用:
finish();
overridePendingTransition(0, 0);
避免黑色闪烁问题。
另一答案
也许你可以更好地分离你的情况,以便在你计划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);
}
}
以上是关于调用finish()后活动布局闪烁的主要内容,如果未能解决你的问题,请参考以下文章