В моем предыдущем посте вы узнали, что 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.