Основы Android

Материал из AOW

Перейти к: навигация, поиск

Содержание

Жизненный цикл Android activity

Activity или действие можно рассматривать, как один экран (окно) вашего приложения для Google Android (андроид). Когда вы запускаете игру, появляется экран с меню - это первое Activity. Когда вы выбираете пункт меню, вы вызываете новое Activity.

Что в этом случае происходит?

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

Модель жизненного цикла приложения можно изобразить в виде следующей схемы:

Файл:Android_activity.jpg

Обратите внимание, после метода onPause() и onStop() система может просто завершить ваш процесс (process killed) и методы onStop() и onDestroy() не будут вызваны. Это вполне обычная ситуация, поэтому с самого начала разработки вашего приложения для Google Android (андроид) вы должны учитывать возможность возникновения такого события.

Также необходимо понимать, когда Activity остановлено или приостановлено его состояние сохраняется т.к. Activity все еще хранится в памяти, и вся информация о его элементах и текущем состоянии ни куда не девается.

Но, когда система завершает процесс для того, чтобы освободить память (process killed), уже нет возможности возобновить состояние Activity. Как правило, пользователь об этом ничего не подозревает и ожидает увидеть Activity таким, каким он его запомнил. В данной ситуации, мы можем помочь сохранить состояние Activity, реализовав дополнительный метод onSaveInstanceState(Bundle).

Затем, при помощи любого из методов onCreate(Bundle) и onRestoreInstanceState(Bundle) мы можете извлечь сохраненное состояние Activity для восстановления.

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

  • onCreate() - используем для создания пользовательского интерфейса;
  • onResume() - используем для запуска анимации или музыки, вызываем заставку;
  • onPause() - используем для сохранения значений в базе данных т.к. далее, может произойти закрытие приложения системой (process killed);

В одной из книг Эда Бурнета, был предложен способ быстрого тестирования корректной работы кода по сохранению состояния приложения. Способ этот заключается в том, что изменение ориентации экрана (между портретным и ландшафтным режимом) приводит к тому, что текущая Activity проходит весь жизненный цикл. В процессе разработки приложений, мы будем использовать предложенный способ тестирования.

Основные методы жизненного цикла приложения

onCreate()

Вызывается при создании активности. Система может запускать и останавливать текущие окна в зависимости от происходящих событий. Android вызывает метод onCreate() после запуска или перезапуска Activity. Внутри этого метода настраивают статический интерфейс активности. Инициализирует статические данные активности, связывают данные со списками и т. д.. Связывает с необходимыми данными и ресурсами. Задает внешний вид через метод setContentView().

В этом методе загружайте пользовательский интерфейс, размещайте ссылки на свойства класса, связывайте данные с элементами управления, создавайте Сервисы и потоки. Метод onCreate() принимает объект Bundle, содержащий состояние пользовательского интерфейса, сохраненное в последнем вызове обработчика onSaveInstanceState. Для восстановления графического интерфейса в его предыдущем состоянии нужно задействовать эту переменную: внутри onCreate() или переопределяя метод onRestoreInstanceState().

Операции по инициализации, занимающие много времени, следует выполнять в фоновом процессе, а не с помощью метода onCreate(). В противном случае можно получить диалоговое окно ANR (Application Not Responding, приложение не отвечает).

В методе можно сделать проверку, запущено ли приложение впервые или восстановлено из памяти. Если значение переменной savedInstanceState будет null, приложение запускается первый раз:

// Приложение запущено впервые или восстановлено из памяти?
if ( savedInstanceState == null )   // приложение запущено впервые
{
   currentBillTotal = 0.0;    // инициализация суммы счета нулем
   // другой код
} 
else // приложение восстановлено из памяти
{
     // инициализация суммы счета сохраненной в памяти суммой
     currentBillTotal = savedInstanceState.getDouble(BILL_TOTAL);
}

А значение переменной currentBillTotal можно сохранить в методе onSaveInstanceState():

@Override
protected void onSaveInstanceState(Bundle outState) {
	super.onSaveInstanceState(outState);

	outState.putDouble(BILL_TOTAL, currentBillTotal);
} // end method onSaveInstanceState

onStart()

За onCreate() всегда следует вызов onStart(), но перед onStart() не обязательно должен идти onCreate(), так как onStart() может вызываться и для возобновления работы приостановленного приложения (приложение останавливается методом onStop()). При вызове onStart() окно еще не видно пользователю, но вскоре будет видно. Вызывается непосредственно перед тем, как активность становится видимой пользователю. Сопровождается вызовом метода onResume(), если активность получает передний план, или вызовом метода onStop(), если становится скрытой.

onResume()

Метод onResume() вызывается после onStart(), даже когда окно работает в приоритетном режиме и пользователь может его наблюдать. В этот момент пользователь взаимодеиствует с созданным вами окном. Приложение получает монопольные ресурсы. Запускает воспроизведение анимации, аудио и видео. Также может вызываться после onPause().

Имейте в виду, что система вызывает этот метод каждый раз, когда ваша активность идёт на переднем плане, в том числе, при первом создании. Таким образом, вы должны реализовать onResume() для инициализации компонентов, которые вы освободили в OnPause() и выполнять любые другие инициализации, которые должны происходить, когда активность вновь активна.

Пытайтесь размещать относительно быстрый и легковесный код, чтобы ваше приложение оставалось отзывчивым при скрытии с экрана или выходе на передний план.

Метод onResume может быть довольно легковесным. Вам не нужно перезагружать состояние пользовательского интерфейса внутри него, так как эти функции возложены на обработчики onCreate и onRestoreInstanceState.

Используйте метод onResume для регистрации любых широковещательных приемников или других процессов, которые должны приостанавливаться внутри обработчика onPause().

Например, после метода onPause(), в котором мы приостановили работу камеры (см. ниже) снова запускаем камеру:

@Override
public void onResume() {
    super.onResume();

    // Get the Camera instance as the activity achieves full user focus
    if (mCamera == null) {
        initializeCamera(); // Local method to handle camera init
    }
}

onPause()

Когда пользователь решает перейти к работе с новым окном, система вызовет для прерываемого окна метод onPause(). По сути происходит свертывание активности. Сохраняет незафиксированные данные. Деактивирует и выпускает монопольные ресурсы. Останавливает воспроизведение видео, аудио и анимацию. От onPause() можно перейти к вызову либо onResume(), либо onStop().

В этом методе необходимо остановить анимацию и другие действия, которые загружают процессор. Зафиксировать несохранённые данные, например, черновик письма. Освободить системные ресурсы, например, обработку данных от GPS.

Пытайтесь размещать относительно быстрый и легковесный код, чтобы ваше приложение оставалось отзывчивым при скрытии с экрана или выходе на передний план.

В большинстве реализаций класса Activity переопределяется как минимум метод onPause(). Внутри него фиксируются несохраненные изменения, потому как после его выполнения работа активности может прерваться без предупреждения. Исходя из архитектуры своего приложения, вы также можете приостановить выполнение потоков, процессов или широковещательных приемников, пока активность не появится на переднем плане.

Например, при работе с камерой метод используется следующим образом:

@Override
public void onPause() {
    super.onPause();

    // Release the Camera because we don't need it when paused
    // and other activities might need to use it.
    if (mCamera != null) {
        mCamera.release()
        mCamera = null;
    }
}

В тоже время вы не должны использовать OnPause() для хранения пользовательских изменений (таких, как персональные данные, введенные в форму) для постоянного хранения. Искключение допускается, когда вы уверены, что пользователи ожидают изменения, которые будут автоматически сохранены (например, при составлении электронной почты). Тем не менее, вы должны избегать выполнения интенсивной работы в OnPause(), таких как запись в базе данных, так как это может замедлить переход к следующей активности (вместо него вы должны выполнять тяжелую нагрузку во время операции отключения OnStop()).

Когда активность приостановлена, то все компоненты сохраняются в памяти и при возобновления нет необходимости повторно инициализировать их.

onStop()

Метод onStop() вызывается, когда окно становится невидимым для пользователя. Это может произойти при ее уничтожении, или если была запущена другая активность (существующая или новая), перекрывшая окно текущей активности. Всегда сопровождает любой вызов метода onRestart(), если активность возвращается, чтобы взаимодействовать с пользователем, или метода onDestroy(), если эта активность уничтожается.

Когда ваша деятельность останавливается, объекты активности хранятся в памяти и восстанавливаются, когда активность возобновляется. Вам не нужно повторно инициализировать компоненты, которые были созданы ранее. Кроме того, система отслеживает текущее состояние для каждого представления, поэтому, если пользователь введёт текст в текстовое поле EditText, то его содержание сохраняется и вам не нужно сохранять и восстанавливать его.

Примечание: Даже если система закрыла вашу активность, когда она была остановлена, она по-прежнему сохраняет состояние объектов, таких как текст в EditText в специальном объекте Bundle (в виде ключ-значение) и восстанавливает их, если пользователь переходит обратно к тому же экземпляру активности.

В этом методе можно сделать сложные операции по сохранению данных: для приостановки сложной анимации, потоков, отслеживания показаний датчиков, запросов к GPS, таймеров, Сервисов или других процессов, которые нужны исключительно для обновления пользовательского интерфейса. Нет смысла потреблять ресурсы (такты центрального процессора или сетевой трафик) для обновления интерфейса, в то время как он не виден на экране. Примените методы onStart() или onRestart() для возобновления или повторного запуска этих процессов, когда Активность опять станет видимой.

onRestart()

Если окно возвращается в приоритетный режим после вызова onStop(), то в этом случае вызывается метод onRestart(). Т.е. вызывается после того, как активность была остановлена и снова была запущена пользователем. Всегда сопровождается вызовом метода onStart().

onRestart предшествует вызовам метода onStart (кроме самого первого). Используйте его для специальных действий, которые должны выполняться только при повторном запуске Активности в рамках «полноценного» состояния.

onDestroy()

Метод вызывается по окончании работы активности, при вызове метода finish() или в случае, когда система уничтожает этот экземпляр активности для освобождения ресурсов. Эти два сценария уничтожения можно определить вызовом метода isFinishing(). Вызывается перед уничтожением активности. Это последний запрос, который получает активность от системы. Если определенное окно находится в верхней позиции в стеке, но невидимо пользователю и система решает завершить это окно, вызывается метод onDestroy(). В этом случае метод удаляет все статические данные активности. Отдаёт все используемые ресурсы.

Так как все необходимые операции по освобождению ресурсов вы сделали в методе onStop(), то в этом методе вы можете подстраховаться и проверить ещё раз все неосвобождённые ресурсы.

На практике вам чаще всего придется сталкиваться с методами onCreate(), onResume() и onPause(). Метод onCreate() будет вызываться при создании пользовательского интерфейса для работы с окном. Данный метод позволит вам связывать данные с виджетами и подключать обработчики событий к компонентам пользовательского интерфейса. При помощи onPause() вы сможете сохранить важную информацию в базе данных вашего приложения. Это последний безопасный метод, который будет вызываться перед тем, как система завершит работу приложения. Метод onDestroy() не обязательно будет вызываться, поэтому не полагайтесь на этот метод при реализации критическом логики. Пример

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

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/LinearLayout1"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity" >

    <TextView
        android:id="@+id/textlife"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="Приложение запущено впервые"
        android:textSize="24px" />

    <Button
        android:id="@+id/buttonafterstart"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:onClick="onClick"
        android:text="Коснись меня!" />

    <Button
        android:id="@+id/buttonexit"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:onClick="onClick"
        android:text="Выход" />

</LinearLayout>

Код для методов:

package ru.alexanderklimov.lifecycle;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends Activity {

	TextView tvTextLife;

	// Вызывается при входе в "полноценное" состояние.
	@Override
	protected void onCreate(Bundle savedInstanceState) {
	    // Инициализируйте Активность
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		Toast.makeText(this, "onCreate()", Toast.LENGTH_LONG).show();

		tvTextLife = (TextView) findViewById(R.id.textlife);
	}

	@Override
	protected void onDestroy() {
		// TODO Auto-generated method stub
		super.onDestroy();
		Toast.makeText(this, "onDestroy()", Toast.LENGTH_LONG).show();
	}

	@Override
	protected void onPause() {
		// TODO Auto-generated method stub
		super.onPause();
		Toast.makeText(this, "onPause()", Toast.LENGTH_LONG).show();
	}

	@Override
	protected void onRestart() {
		// TODO Auto-generated method stub
		super.onRestart();
		Toast.makeText(this, "onRestart()", Toast.LENGTH_LONG).show();
	}

	@Override
	protected void onResume() {
		// TODO Auto-generated method stub
		super.onResume();
		Toast.makeText(this, "onResume()", Toast.LENGTH_LONG).show();
	}

	@Override
	protected void onStart() {
		// TODO Auto-generated method stub
		super.onStart();
		Toast.makeText(this, "onStart()", Toast.LENGTH_LONG).show();
	}

	@Override
	protected void onStop() {
		// TODO Auto-generated method stub
		super.onStop();
		Toast.makeText(this, "onStop()", Toast.LENGTH_LONG).show();
	}

	public void onClick(View v) {
		switch (v.getId()) {
		case R.id.buttonafterstart:
			tvTextLife.setText("Приложение уже было запущено!");
			break;
		case R.id.buttonexit:
			finish();
			break;

		default:
			break;
		}
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.activity_main, menu);
		return true;
	}
}

Запускайте проект и следите за сообщениями. Они будут всплывать в нужной последовательности, давая вам представление о жизненном цикле приложения. Обратите внимание на следующий момент. Когда ваше приложение запущено, то нажмите на первую кнопку, чтобы изменить текст в TextView. Затем нажмите кнопку Home (не Back!), чтобы попасть на Рабочий стол. После чего снова запустите ваше приложение. Вы увидите, что приложение не вызывает метод onCreate(), и текст в TextView будет свидетельствовать, что приложение не было закрыто, а только свернуто. Это очень важный момент, который нужно понять. Понимание этих вещей поможет вам правильно выстраивать логику приложения.

Методы Activity

При переходе активности от одного состояния к другому, она получает уведомления через защищенные методы:

protected void onCreate(Bundle savedInstanceState);
protected void onStart();
protected void onRestart();
protected void onResume();
protected void onPause();
protected void onStop();
protected void onDestroy()

Из перечисленных методов в вашем классе обязательно должен быть метод onCreate(), которая задает начальную установку параметров при инициализации активности. Вторым по популярности является метод onPause(), используемый для сохранения пользовательских настроек активности и подготовиться к прекращению взаимодействия с пользователем.

При реализации любого из этих методов необходимо всегда сначала вызывать версию этого метода из суперкласса. Например:

public void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
		...
}
// или
protected void onPause()
{
    super.onPause();
	...
}

Семь перечисленных методов определяют весь жизненный цикл активности. Есть три вложенных цикла, которые вы можете отслеживать в классе активности:

  • полное время жизни (entire lifetime) — время с момента первого вызова метода onCreate() до вызова onDestroy(). Активность делает всю начальную установку своего глобального состояния в методе onCreate() и освобождает все остающиеся ресурсы в onDestroy(). Например, если активность порождает дополнительный поток, выполняющийся в фоновом режиме, можно создать этот поток в методе onCreate() и затем остановить поток в методе onDestroy();
  • видимое время жизни (visible lifetime) — время между вызовом метода onStart() и вызовом onStop(). В это время пользователь может видеть окно активности на экране, хотя окно может не быть на переднем плане и может не взаимодействовать с пользователем. Между этими двумя методами вы можете поддерживать в коде ресурсы, которые необходимы, чтобы отображать активность пользователю;
  • активное время жизни (foreground lifetime) — время между вызовоми onResume() и onPause(). В это время окно активности находится на переднем плане и взаимодействует с пользователем. Активность в процессе работы приложения может часто переходить между состояниями active и paused, поэтому код в этих двух методах должен быть или небольшим по объему (чтобы не замедлять работу приложения во время выполнения), или порождать дополнительные потоки, если требуется выполнение задач, занимающих длительное время.

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

package ru.alexanderklimov.myapplication;

import android.app.Activity;
import android.os.Bundle;

public class MyActivity extends Activity {
    // Вызывается при входе в "полноценное" состояние.
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // Инициализируйте Активность.
    }
	
    // Вызывается, когда метод onCreate завершил свою работу, 
    // и используется для восстановления состояния пользовательского 
    // интерфейса
    @Override
    public void onRestoreInstanceState(Bundle savedInstanceState) {
        super.onRestoreInstanceState(savedInstanceState);
        // Восстановите состояние UI из переменной savedInstanceState.
        // Этот объект типа Bundle также был передан в метод onCreate.
    }
    
	// Вызывается перед тем, как Активность становится "видимой".
    @Override
    public void onRestart(){
        super.onRestart();
        // Загрузите изменения, учитывая то, что Активность
        // уже стала "видимой" в рамках данного процесса.
    }
    
	// Вызывается в начале "видимого" состояния.
    @Override
    public void onStart(){
        super.onStart();
		// Примените к UI все необходимые изменения, так как
        // Активность теперь видна на экране.
    }
    
	// Вызывается в начале "активного" состояния.
    @Override
    public void onResume(){
        super.onResume();
        // Возобновите все приостановленные обновления UI,
        // потоки или процессы, которые были "заморожены",
        // когда данный объект был неактивным.
    }
    
	// Вызывается для того, чтобы сохранить пользовательский интерфейс
    // перед выходом из "активного" состояния.
    @Override
    public void onSaveInstanceState(Bundle savedInstanceState) {
        // Сохраните состояние UI в переменную savedInstanceState.
        // Она будет передана в метод onCreate при закрытии и
        // повторном запуске процесса.
        super.onSaveInstanceState(savedInstanceState);
    }
    
	// Вызывается перед выходом из "активного" состояния
    @Override
    public void onPause(){
        // "Замораживает" пользовательский интерфейс, потоки 
        // или трудоемкие процессы, которые могут не обновляться, 
        // пока Активность не находится на переднем плане.
        super.onPause();
    }
    
	// Вызывается перед тем, как Активность перестает быть "видимой".
    @Override
    public void onStop(){
        // "Замораживает" пользовательский интерфейс, потоки 
        // или операции, которые могут подождать, пока Активность
        // не отображается на экране. Сохраняйте все введенные
        // данные и изменения в UI так, как будто после вызова
        // этого метода процесс должен быть закрыт.
        super.onStop();
    }
    
	// Вызывается перед выходом из "полноценного" состояния.
    @Override
    public void onDestroy(){
        // Очистите все ресурсы. Это касается завершения работы
        // потоков, закрытия соединений с базой данных и т. д.
        super.onDestroy();
    }
}

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

Методы жизненного цикла описаны в отдельной статье. Здесь их опишем кратко и рассмотрим другие методы.

Метод onSaveInstanceState()

Прямо перед onPause() вызывается обработчик onSaveInstanceState. Он предоставляет возможность сохранять состояние пользовательского интерфейса Активности в объект Bundle, который потом будет передаваться в методы onCreate() и onRestoreInstanceState(). Используйте обработчик onSaveInstanceState для сохранения состояния интерфейса (например, состояния флажков, текущего выделенного элемента или введенных, но не сохраненных данных), чтобы объект Activity при следующем входе в активное состояние мог вывести на экран тот же UI. Рассчитывайте, что перед завершением работы процесса во время активного состояния будут вызваны обработчики onSaveInstanceState и onPause.

Когда система завершает активность в принудительном порядке, чтобы освободить ресурсы для других приложений, пользователь может снова вызвать эту активность с сохраненным предыдущим состоянием. Чтобы зафиксировать состояние активности перед ее уничтожением, в классе активности необходимо реализовать метод onSaveinstancestate(). Android вызывает этот метод перед созданием активности, т.е. раньше вызова onPause().

Система передает методу объект Bundle, в который можно записать параметры, динамическое состояние активности как пары имя-значение. Когда активность будет снова вызвана, объект Bundle передается системой в качестве параметра в метод onCreate() и в метод onRestoreInstanceState(), которыЙ вызывается после onStart(), чтобы один из них или они оба могли установить активность в предыдущее состояние.

В отличие от базовых методов, методы onSaveInstanceState() и onRestoreInstanceState() не относятся к методам жизненного цикла активности. Система будет вызывать их не во всех случаях. Например, Android вызывает onSaveinstancestate() прежде, чем активность становится уязвимой к уничтожению системой, но не вызывает его, когда экземпляр активности разрушается пользовательским действием (при нажатии клавиши BACK). В этом случае нет никаких причин для сохранения состояния активности.

Метод onSaveInstanceState() вызывается системой в случае изменения конфигурации устройства в процессе выполнения приложения (например, при вращении устройства пользователем или выдвижении физической клавиатуры устройства.

Поскольку метод onSaveinstanceState() вызывается не во всех случаях, его необходимо использовать только для сохранения промежуточного состояния активности. Для сохранения данных лучше использовать метод onPause().

С помощью переопределения обработчика событий активности onSaveInstanceState вы можете вызвать его параметр Bundle для сохранения переменных экземпляра пользовательского интерфейса. Прежде чем передавать измененный параметр Bundle в обработчик родительского класса, сохраните значения с помощью методов get и put.

private static final String TEXTVIEW_STATE_KEY = "TEXTVIEW_STATE_KEY";
static final String STATE_SCORE = "playerScore";
static final String STATE_LEVEL = "playerLevel";

@Override
public void onSaveInstanceState(Bundle saveInstanceState) {
    // получаем ссылку на текстовую метку
    TextView myTextView = (TextView)findViewById(R.id.textView1);
    // Сохраняем его состояние
    saveInstanceState.putString(TEXTVIEW_STATE_KEY, myTextView.getText().toString());
	
	// Сохраняем состояние игрока
    savedInstanceState.putInt(STATE_SCORE, mCurrentScore);
    savedInstanceState.putInt(STATE_LEVEL, mCurrentLevel);
	
	// всегда вызывайте суперкласс для сохранения состояний видов
    super.onSaveInstanceState(saveInstanceState);
}

Этот обработчик будет срабатывать всякий раз, когда жизненный цикл активности начнёт подходить к концу, но только в том случае, если её работа не будет завершена явно (при вызове метода finish()). Вследствие этого обработчик используется для проверки целостности состояния активности между активными жизненными циклами одиночной пользовательской сессии.


Сохранённый параметр Bundle передается методам onRestoreInstanceState() и onCreate(), если приложение принудительно перезапускается на протяжении сессии. В листинге показано, как извлечь значения из этого параметра и использовать их для обновления состояния экземпляра активности.

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    TextView myTextView = (TextView)findViewById(R.id.textView1);
    String text = "";
    if (savedInstanceState != null && savedInstanceState.containsKey(TEXTVIEW_STATE_KEY))
        text = savedInstanceState.getString(TEXTVIEW_STATE_KEY);
    myTextView.setText(text);
}

Помните, что обработчик onSaveInstanceState вызывается только тогда, когда активность переходит в пассивное состояние, а не когда она закрывается при вызове метода finish() или пользователь нажимает кнопку Назад.

Метод onRestoreInstanceState()

У метода onRestoreInstanceState() есть такой же параметр Bundle, как у onCreate(), и вы можете восстанавливать сохранённые значения из метода onSaveInstanceState().

Метод вызывается после метода onStart(). Система вызывает метод onRestoreInstanceState() только в том случае, если имеются сохранённые данные для восстановления. Таким образом вам не нужно проверять Bundle на null, как в методе onCreate():

public void onRestoreInstanceState(Bundle savedInstanceState) {
    // Always call the superclass so it can restore the view hierarchy
    super.onRestoreInstanceState(savedInstanceState);
   
    // Restore state members from saved instance
    mCurrentScore = savedInstanceState.getInt(STATE_SCORE);
    mCurrentLevel = savedInstanceState.getInt(STATE_LEVEL);
}

Метод finish()

C помощью метода finish() можно завершить работу активности. Если приложение состоит из одной активности, то этого делать не следует, так как система сама завершит работу приложения. Если же приложение содержит несколько активностей, между которыми нужно переключаться, то данный метод позволяет экономить ресурсы.

Метод startActivity()

Чтобы запустить новую активность, используется метод startActivity(Intent). Этот метод принимает единственный параметр — объект Intent, описывающий активность, которая будет запускаться. Смотри пример Activity.

Метод startActivityForResult()

Иногда требуется вернуть результат активности, когда она закрывается. Например, можно запустить активность, которая позволяет пользователю выбирать человека в списке контактов. При закрытии активность возвращает данные человека, который был выбран: его полное имя и телефон. В этом случае необходимо вызвать метод startActivityForResult()

Метод startActivityForResult(Intent, int) со вторым параметром, идентифицирующим запрос позволяет возвращать результат. Результат возвращается через метод обратного вызова onActivityResult(int, int, Intent), определенный в родительской активности.

// идентификатор запроса
private static final int IDM_ADD = 101;
Intent intent = new Intent();
// определение класса запускаемой активности
intent.setClass(this, NewContactActivity.class);
// вызов активности
startActivityForResult(intent, IDM_NEW);

Метод setResult()

Когда активность завершится, она может вызвать метод setResult(int), чтобы возвратить данные назад в родительскую активность. Этот метод возвращает код результата закрытия активности, который может быть стандартными результатами RESULT_CANCELED, RESULT_OK или определяемым пользователем результатом RESULT_FiRST_USER.

private EditText mName;
private EditText mPhone;
Intent intent new Intent();
// вставляем имя человека
intent.putExtra(ContactListActivity.NAME, mName.getText().toString());
// вставляем номер телефона
intent.putExtra(ContactListActivity.PHONE, mPhone.getText().toString());
// возвращаем результат в вызывающую активность
setResult(RESULT_OK, intent);
finish();

Метод onActivityResult()

Кроме того, дочерняя активность может произвольно возвратить назад объект Intent, содержащий любые дополнительные данные. Вся эта информация в родительской активности появляется через метод обратного вызова Activity.onActivityResult(), наряду с идентификатором, который она первоначально предоставила.

Если дочерняя активность завершится неудачно или будет закрыта пользователем без подтверждения ввода, то родительская активность получит результат с кодом RESULT_CANCELED.

Метод overridePendingTransition()

Метод overridePendingTransition() позволяет задать анимацию при переходе от одной активности к другой. Пример смотрите здесь. Классы Activity в Android

  • Android SDK включает набор классов, наследованных от Activity. Они предназначены для упрощения работы с виджетами, которые часто встречаются в обычном пользовательском интерфейсе. Перечислим некоторые из них (наиболее полезные).
  • MapActivity. Инкапсулирует обработку ресурсов, необходимых для поддержки элемента MapView внутри Активности.
  • ListActivity. Обертка для класса Activity, главная особенность которой — виджет ListView, привязанный к источнику данных, и обработчики, срабатывающие при выборе элемента из списка.
  • ExpandableListActivity. То же самое, что и ListActivity, но вместо ListView поддерживает ExpandableListView.
  • TabActivity. Позволяет разместить несколько Активностей или Представлений в рамках одного экрана, используя вкладки для переключения между элементами.
Личные инструменты

Разработка веб-сайтов, автоматизация.
По всем вопросам обращайтесь по телефонам:

+7 495 640 29 90
http://artofweb.ru