Как справиться с деятельностью, выходящей на первый план - PullRequest
0 голосов
/ 25 сентября 2011

Мои книги ужасно объясняют, как работать с жизненным циклом, я скучаю по многим вещам, которые, я надеюсь, кто-то может заполнить.

Моя структура приложения такова, что при первом запуске, он запускает действие, полное правового пузыря, которое должен принять пользователь.Когда он говорит «хорошо», я начинаю свою основную деятельность и затем вызываю финиш следующим образом:

public void onClick(View view) { //as a result of "I accept"
    Intent mainIntent = new Intent(mParent, EtMain.class);
    startActivity(mainIntent); // Start the main program
    finish();
}

Затем в EtMain в методе onCreate у меня есть несколько вкладок и я создаю экземпляры некоторых классов:

super.onCreate(savedInstanceState);
setContentView(R.layout.main);

mTabHost = (TabHost)findViewById(android.R.id.tabhost);
SetupTabs.setMyTabs(mTabHost, this);

mComData = new ComFields(this); // Create the objects
mDepWx = new WxFields(this, DepArr.Departure);
mArrWx = new WxFields(this, DepArr.Arrival);
mDepVs = new DepFields(this);
mArrVs = new ArrFields(this);
mTabHost.setOnTabChangedListener(new OnTabChangeListener(){
}

Вопросы: «Завершение» в первом фрагменте должно прекратить действие допустимого всплытия, поэтому оно никогда не будет перезапущено, верно?И EtMain останется навсегда (до тех пор, пока не будет убит внешне), даже если мое приложение отодвинется на задний план, верно?

Так оно и есть сейчас, когда EtMain выталкивают и позже выводят на передний план (нажавна значке), он проходит через экран legalbabble, как будто это полный старт - это то, что я хотел бы предотвратить - снова проходя через экран legalbabble.

Казалось бы, я бы хотел переопределитьonRestart во втором фрагменте кода и положить туда что-то, чтобы перезапустить приложение, верно?Это та часть, которая мне не ясна.

Мой вопрос: что нужно сделать в onRestart?Нужно ли заново создавать все вкладки и данные на вкладках и все экземпляры моих объектов?Или состояние памяти приложения сохраняется в каком-то месте, а затем восстанавливается до состояния, в котором оно находилось до того, как что-то еще было выведено на передний план, и в этом случае не нужно много делать, потому что все объекты и слушатели все еще будут там?

Ответы [ 3 ]

2 голосов
/ 25 сентября 2011
  1. Да, после того, как закончилось первое действие, вам больше не нужно просматривать это действие. Вы также можете написать в общих настройках , что пользователь ранее видел правовую информацию.

  2. Если вы создаете объект пользовательского интерфейса в методе onCreate, его следует вызывать только один раз. Приостановка или возобновление не вызовет метод onCreate снова.

  3. Если вы явно не удалили свои объекты и tabChangedListeners в методе onPause, вам не нужно прикасаться к ним в методе onRestart.

  4. Правильно, состояние приложения сохраняется автоматически. Вам не нужно трогать метод onRestart.

Надеюсь, это поможет!

1 голос
/ 25 сентября 2011

EtMain не останется навсегда, если пользователь откажется (нажав клавишу BACK), действие будет завершено (onPause, затем onStop, затем onDestroy). В общем, вы можете игнорировать onRestore, пока не сделаете что-то сложное.

После того, как пользователь вышел из вашего приложения и снова вошел (или нажал значок на главном экране), onCreate (за которым следуют onStart и onResume) будет вызван для вашей первой активности, поэтому вам не нужна никакая логика в onRestart, ваш код в onCreate выполнит настройку за вас, как это было в первый раз. Из-за этого ваш законный болтовня появится снова, когда пользователь запустит приложение после выхода, если вы не сохраните предпочтение (в SharedPreferences, базе данных или файле), чтобы указать, что вы уже отобразили его - в этом случае завершите его сразу и запустите основной активность.

onRestart вызывается только тогда, когда приложение переходит из остановленного состояния (был вызван onStop, но не onDestroy) в начальное состояние (вызывается onStart, но еще не было onResume).

Для сохранения данных - некоторые компоненты автоматически сохраняют свое состояние (например, EditTexts запоминают текст в них, TabHosts запоминают текущую выбранную вкладку и т. Д.). Некоторые компоненты не будут. Если вы хотите сохранить дополнительные данные, используйте onSaveInstanceState и onRestoreInstanceState. Вы должны использовать эти методы только для восстановления состояния вашего приложения или временных данных, а не важных вещей, например идентификатор ресурса, на что смотрел пользователь, на каком уровне масштабирования он был и т. д. Для таких вещей, как контакты или фактические данные, вы должны фиксировать эти изменения в базе данных, SharedPreferences или другом постоянном хранилище (например, файле) при вызове onPause.

Я рекомендую взглянуть на жизненный цикл Android Activity , если вы не уверены. Или задайте больше вопросов!

1 голос
/ 25 сентября 2011

Я думаю, что проблема в том, что операция запуска в вашем манифесте - это операция LegalBabble, поэтому, когда вы нажимаете на значок, система запускает другой. Лучшая архитектура состояла бы в том, чтобы запустить действие legalbabble из своей активности EtMain в методе onCreate последнего, используя startActivityForResult. Из документов:

В особом случае, если вы позвоните startActivityForResult() с requestCode> = 0 во время начальной onCreate(Bundle savedInstanceState) / onResume() вашей активности, ваше окно не будет отображаться, пока результат не будет возвращен из запущенного активность.

Когда вы получите результат в onActivityResult, вы можете позвонить finish(), если законный материал был отклонен; в противном случае все будет идти нормально.

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

...