Макет активности, мигающий после завершения (), вызывается


Когда я открываю свое приложение, запускается действие, и внутри его метода 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() находится после проверки, но перед запуском второго действия Первое все еще мигает на экране. Кто-нибудь знает, как это сделать? моргнуть?

Заранее благодарю.

6 3

6 ответов:

Цель finish () - уничтожить текущую активность и удалить ее из заднего стека. Вызывая finish, а затем запуская намерение, вы просите действие уничтожить его само (я предполагаю, что мигание-это попытка восстановления), а затем запускаете намерение во вторую. Переместить finish в after 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

}

Вместо того, чтобы делать

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 вызывается

Мерцание и мигание активности

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

android:noHistory очистит активность из стека, которая должна быть очищена на задней панели, иначе она показывает активность A на экране.

Нижеприведенный трюк отлично работает для меня. Надеюсь, это может быть полезно для других.

Открытие деятельностиB из деятельностиA .

Чтобы закрыть activity 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);
    }
}