Макет активности, мигающий после завершения (), вызывается
Когда я открываю свое приложение, запускается действие, и внутри его метода 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 ответов:
Цель 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); } }