В моем предыдущем посте вы узнали, что Intents позволяет отправлять сообщения с одного компонента Android на другой. Ну, один из очень важных компонентов — это активность.
Действия являются фундаментальной частью разработки приложений для Android. И невозможно понять Деятельности, не понимая их жизненных циклов. В этом посте вы узнаете все о жизненном цикле деятельности.
Жизненный цикл деятельности
Активность — это один экран в Android. Это как окно в настольном приложении или фрейм в программе Java. Активность позволяет вам разместить все ваши компоненты пользовательского интерфейса или виджеты вместе на экране.
Важно понимать, что у Activity есть жизненный цикл: то есть он может находиться в одном из нескольких разных состояний, в зависимости от того, что происходит с приложением и с взаимодействием с пользователем.
Методы жизненного цикла
Давайте более подробно рассмотрим жизненный цикл Android Activity. Каждый раз, когда изменяется состояние Activity, в классе Activity будет вызываться один из следующих методов жизненного цикла.
onCreate() : вызывается при первой инициализации действия. Вам необходимо реализовать этот метод для выполнения любой инициализации, специфичной для вашей Деятельности.
onStart() : это вызывается в первый раз, когда действие становится видимым для пользователя, поскольку действие готовится выйти на передний план и становится интерактивным. Как только этот обратный вызов завершится, будет вызван метод onResume() .
onResume() : когда действие переходит в это состояние, оно начинает взаимодействовать с пользователем. Активность продолжается в этом состоянии, пока что-то не сфокусируется на приложении или активности (например, на входящем звонке). Когда это происходит, onPause() метод onPause() .
onPause() : этот метод используется для приостановки операций, которые не должны выполняться, когда действие находится в состоянии паузы. Вызов этого метода означает, что пользователь покидает приложение. Например, в приложении музыкального проигрывателя входящий вызов приведет к переходу приложения в состояние паузы. Это должно отключить или приостановить воспроизведение текущей музыки. Когда пользователь возвращается в приложение, onResume() метод onResume() .
onStop() : этот метод вызывается, когда действие больше не отображается в приложении. Это может произойти, например, когда другая активность была загружена и занимает полный экран устройства. Когда вызывается этот метод, говорят, что Activity находится в остановленном состоянии. В этом состоянии система либо вызывает onRestart() чтобы вернуть интерактивность с Activity. Или он вызывает метод onDestroy() для уничтожения Activity.
onDestroy() : onDestroy() перед уничтожением действия. Система вызывает этот метод, когда пользователь завершает действие или потому что система временно уничтожает процесс, содержащий действие, чтобы сэкономить место. Обязательно высвободите все ресурсы, созданные вашей деятельностью в этом методе, иначе ваше приложение будет иметь утечку памяти!
onRestart() : onRestart() когда действие перезапускается после его остановки.
Начало деятельности
В большинстве случаев взаимодействия пользователя с приложением активная активность изменяется. Таким образом, приложение переходит между действиями много раз в течение своей жизни.
Необходимо связать действия вместе, когда одно действие должно начать другое действие. Чтобы запустить Activity, вы можете использовать startActivity() или startActivityForResult() . Вы должны передать намерение в любом случае.
Начало действия без ожидаемого результата
startActivity() используется, если вновь запущенному Activity не нужно возвращать результат.
В следующем фрагменте кода показано, как запустить другое действие с помощью этого метода:
|
1
2
|
Intent intent = new Intent(this, SecondActivity.class);
startActivity(intent);
|
Вы также можете выполнять такие действия, как передача данных из одного действия в другое. В этом случае ваша текущая активность (вызывающая активность) хочет передать данные целевой активности. Вот где Intents пригодится. Чтобы узнать, как использовать Intents для запуска Activity, прочитайте мою предыдущую статью .
Начало действия с результатом
startActivityForResult() используется для запуска другого действия и ожидает получить данные обратно из недавно запущенного действия. Другими словами, используйте это, когда вы хотите получить результат от целевого действия обратно к вызывающему действию, например, если целевое действие собирает некоторую информацию о пользователе в модальном диалоге.
Вы получаете результат от Activity в onActivityResult(int requestCode, int resultCode, Intent data) . Результат будет возвращен как Намерение.
Пример начала деятельности
Вот пример, чтобы показать, как работает запуск действия.
Сначала вы создаете MainActivity с onCreate() метода onCreate() , файла макета и кода запроса.
|
01
02
03
04
05
06
07
08
09
10
11
12
|
public class MainActivity extends Activity {
// Unique request code for each use case
private static final int REQUEST_CODE_EXAMPLE = 0x9345;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}
|
В вашем onCreate() вы создадите новый экземпляр намерения начать второе действие.
Когда вы будете готовы запустить это действие, скажем, в ответ на нажатие кнопки, вы startActivityForResult() , который передаст вновь созданное намерение и код запроса.
|
1
2
3
4
5
|
// Create a new instance of Intent to start SecondActivity
final Intent intent = new Intent(this, SecondActivity.class);
// This starts SecondActivity with the request code
startActivityForResult(intent, REQUEST_CODE_EXAMPLE);
|
Тем не менее, в вашей MainActivity вам нужно обрабатывать события результата Activity. Вы делаете это путем реализации onActivityResult() . Вот как вы получите результат от другой деятельности.
Вот как это должно выглядеть:
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
// onActivityResult only get called
// when the other Activity previously started using startActivityForResult
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
// First we need to check if the requestCode matches the one we used.
if(requestCode == REQUEST_CODE_EXAMPLE) {
// The resultCode is set by the SecondActivity
// By convention RESULT_OK means that whatever
// SecondActivity did was executed successfully
if(resultCode == Activity.RESULT_OK) {
// Get the result from the returned Intent
final String result = data.getStringExtra(SecondActivity.EXTRA_DATA);
// Use the data — in this case, display it in a Toast.
Toast.makeText(this, «Result: » + result, Toast.LENGTH_LONG).show();
} else {
// setResult wasn’t successfully executed by SecondActivity
// Due to some error or flow of control.
}
}
}
|
Теперь идите вперед и создайте свой SecondActivity . Это должно выглядеть примерно так, как показано ниже.
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_detail);
final Button button = (Button) findViewById(R.id.button);
// When this button is clicked we want to return a result
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
// Create a new Intent object as container for the result
final Intent data = new Intent();
// Add the required data to be returned to the MainActivity
data.putExtra(EXTRA_DATA, «Some interesting data!»);
// Set the resultCode as Activity.RESULT_OK to
// indicate a success and attach the Intent
// which contains our result data
setResult(Activity.RESULT_OK, data);
// With finish() we close the SecondActivity to
// return back to MainActivity
finish();
}
});
}
|
Завершение деятельности
Перед завершением действия будут вызваны соответствующие методы жизненного цикла.
Метод onPause() должен остановить все слушатели и обновления пользовательского интерфейса. Метод onStop() должен сохранять данные приложения. Наконец, метод onDestroy() освобождает любые ресурсы, выделенные Activity.
Когда пользователь переключается обратно на приложение, которое было прекращено системой, onResume() метод onResume() . Основываясь на сохраненных данных, он может перерегистрировать слушателей и запускать обновления пользовательского интерфейса.
Состояние экземпляра активности
Деятельности нужен способ сохранить ценные данные о состоянии и пользователя, которые он получил. Эти данные могут быть получены из пользовательского ввода или созданы, когда действие не было на экране.
Например, изменение ориентации устройства может привести к разрушению и воссозданию действия. В таком сценарии вы должны убедиться, что сохранили все состояние Activity до того, как оно будет уничтожено, и перезагрузите его снова, когда оно будет воссоздано. В противном случае любые данные, которые у вас есть в тот момент, могут быть полностью потеряны.
Чтобы сохранить состояние активности, вы можете переопределить метод onSaveInstanceState() . Этот метод передается объект Bundle в качестве параметра. Пакет может содержать строки, примитивные типы данных или объекты. В этом методе просто добавьте любые важные данные о состоянии в комплект. Этот пакет будет возвращен в Activity позже, чтобы вы могли восстановить состояние Activity.
Чтобы извлечь сохраненное состояние из пакета и восстановить его, реализуйте метод onRestoreInstanceState() . Этот обратный вызов вызывается между методами жизненного цикла onStart() и onResume() .
Мы подробнее рассмотрим состояние экземпляра Activity в следующей статье.
Вывод
После прочтения этого поста у вас будет хорошее понимание того, как работает жизненный цикл Activity. И вы узнали, что есть два способа запустить Activity, а также получить несколько указателей на то, как обрабатывается состояние экземпляра в жизненном цикле Activity.
Спасибо за чтение, и пока вы здесь, ознакомьтесь с некоторыми другими нашими статьями о кодировании приложений для Android.



