调用finish()后活动布局闪烁

时间:2015-08-04 19:45:42

标签: android android-activity activity-lifecycle

当我打开我的应用程序时,会启动一个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()在检查之后,但在第二个活动开始之前,第一个活动仍然在屏幕上闪烁。 有谁知道怎么让它不眨眼?

提前致谢。

7 个答案:

答案 0 :(得分:7)

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;
}

答案 1 :(得分:2)

您的代码顺序错误。你不应该在

之后再打电话
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

}

答案 2 :(得分:2)

Flicker and blinking Activity

    - Reason finish();
    - Remove finish() in Activity 
    - added android:noHistory="true" in AndroidManifest

The android:noHistory will clear Activity from stack which need to be clear on back press otherwise it shows activity A on screen.

答案 3 :(得分:1)

而不是

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

答案 4 :(得分:1)

下面提到的技巧对我来说非常合适。希望这对其他人有用。

从活动 A 开启活动 B

关闭活动 B 我正在使用:

finish(); 
overridePendingTransition(0, 0);

避免黑色闪烁问题。

答案 5 :(得分: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);
    }
}

答案 6 :(得分:0)

尝试使用您的风格

<style name="CHTheme" parent="Theme.AppCompat.Light">
    <item name="android:windowDisablePreview">true</item>
</style>