Android
Деятельность
Поиск…
Вступление
Действие представляет собой один экран с пользовательским интерфейсом (UI) . Например, приложение для Android может иметь более одного действия. Приложение электронной почты может иметь одно действие для отображения всех электронных писем, другого действия для отображения содержимого электронной почты, а также другого действия для составления нового сообщения электронной почты. Все действия в приложении работают вместе, чтобы создать идеальный пользовательский интерфейс.
Синтаксис
void onCreate (Bundle savedInstanceState) // Вызывается, когда начинается действие.
void onPostCreate (Bundle savedInstanceState) // Вызывается, когда завершен запуск активности (после того, как были вызваны onStart () и onRestoreInstanceState (Bundle)).
void onStart () // Вызывается после onCreate (Bundle) - или после onRestart (), когда действие было остановлено, но теперь снова отображается пользователю.
void onResume () // Вызывается после onRestoreInstanceState (Bundle), onRestart () или onPause (), чтобы ваша активность начала взаимодействовать с пользователем.
void onPostResume () // Вызывается, когда завершено возобновление активности (после вызова функции onResume ()).
void onRestart () // Вызывается после onStop (), когда текущая активность повторно отображается пользователю (пользователь перешел обратно к ней).
void onPause () // Вызывается как часть жизненного цикла активности, когда активность перемещается в фоновый режим, но еще не убита.
void onStop () // Вызывается, когда пользователь больше не отображается.
void onDestroy () // Выполнять окончательную очистку до того, как действие будет уничтожено.
void onNewIntent (намерение намерения) // Это вызвано для действий, которые устанавливают launchMode на «singleTop» в их пакете, или если клиент использовал флаг FLAG_ACTIVITY_SINGLE_TOP при вызове startActivity (Intent).
void onSaveInstanceState (Bundle outState) // Вызывается для извлечения состояния каждого экземпляра из активности перед тем, как его убить, чтобы состояние можно было восстановить в onCreate (Bundle) или onRestoreInstanceState (Bundle) (набор, заполненный этим методом, будет передан как для ).
void onRestoreInstanceState (Bundle savedInstanceState) // Этот метод вызывается после onStart (), когда активность повторно инициализируется из ранее сохраненного состояния, указанного здесь в файле savedInstanceState.
параметры
параметр | подробности |
---|---|
умысел | Может использоваться с startActivity для запуска Activity |
сверток | Отображение из строковых ключей на различные значения Parcelable . |
контекст | Интерфейс к глобальной информации о среде приложения. |
замечания
Activity - это компонент приложения, который предоставляет экран, с помощью которого пользователи могут взаимодействовать, чтобы что-то сделать, например, набрать телефон, сделать фотографию, отправить электронное письмо или просмотреть карту. Каждому действию присваивается окно, в котором можно нарисовать свой пользовательский интерфейс. Окно обычно заполняет экран, но может быть меньше экрана и плавать поверх других окон.
Исключить действие из истории back-stack
Пусть есть активность B
которая может быть открыта, и может начать больше действий. Но пользователь не должен сталкиваться с этим при навигации в задачах задачи.
Самое простое решение - установить для атрибута noHistory
значение true
для этого тэга <activity>
в AndroidManifest.xml
:
<activity
android:name=".B"
android:noHistory="true">
Такое же поведение также возможно из кода, если B
вызывает finish()
перед началом следующего действия:
finish();
startActivity(new Intent(context, C.class));
Типичное использование флага noHistory
- «Splash Screen» или «Действия входа».
Объяснение жизненного цикла Android
Предположим, приложение с MainActivity, которое может вызвать следующую активность, нажав кнопку.
public class MainActivity extends AppCompatActivity {
private final String LOG_TAG = MainActivity.class.getSimpleName();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.d(LOG_TAG, "calling onCreate from MainActivity");
}
@Override
protected void onStart() {
super.onStart();
Log.d(LOG_TAG, "calling onStart from MainActivity");
}
@Override
protected void onResume() {
super.onResume();
Log.d(LOG_TAG, "calling onResume from MainActivity");
}
@Override
protected void onPause() {
super.onPause();
Log.d(LOG_TAG, "calling onPause from MainActivity");
}
@Override
protected void onStop() {
super.onStop();
Log.d(LOG_TAG, "calling onStop from MainActivity");
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.d(LOG_TAG, "calling onDestroy from MainActivity");
}
@Override
protected void onRestart() {
super.onRestart();
Log.d(LOG_TAG, "calling onRestart from MainActivity");
}
public void toNextActivity(){
Log.d(LOG_TAG, "calling Next Activity");
Intent intent = new Intent(this, NextActivity.class);
startActivity(intent);
} }
а также
public class NextActivity extends AppCompatActivity {
private final String LOG_TAG = NextActivity.class.getSimpleName();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_next);
Log.d(LOG_TAG, "calling onCreate from Next Activity");
}
@Override
protected void onStart() {
super.onStart();
Log.d(LOG_TAG, "calling onStart from Next Activity");
}
@Override
protected void onResume() {
super.onResume();
Log.d(LOG_TAG, "calling onResume from Next Activity");
}
@Override
protected void onPause() {
super.onPause();
Log.d(LOG_TAG, "calling onPause from Next Activity");
}
@Override
protected void onStop() {
super.onStop();
Log.d(LOG_TAG, "calling onStop from Next Activity");
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.d(LOG_TAG, "calling onDestroy from Next Activity");
}
@Override
protected void onRestart() {
super.onRestart();
Log.d(LOG_TAG, "calling onRestart from Next Activity");
} }
Когда приложение создано впервые
D / MainActivity: вызов onCreate из MainActivity
D / MainActivity: вызов onStart из MainActivity
D / MainActivity: вызов onResume из MainActivity
называются
Когда экран спит
08: 11: 03.142 D / MainActivity: вызов onPause из MainActivity
08: 11: 03.192 D / MainActivity: вызов onStop из MainActivity
называются. И снова, когда он просыпается
08: 11: 55.922 D / MainActivity: вызов onRestart из MainActivity
08: 11: 55.962 D / MainActivity: вызов onStart из MainActivity
08: 11: 55.962 D / MainActivity: вызов onResume из MainActivity
называются
Случай 1: когда из основной деятельности вызывается следующая активность
D / MainActivity: вызов следующей операции
D / MainActivity: вызов onPause из MainActivity
D / NextActivity: вызов onCreate из следующей активности
D / NextActivity: вызов onStart из следующей активности
D / NextActivity: вызов onResume из следующей активности
D / MainActivity: вызов onStop из MainActivity
Возврат к основной активности из следующего действия с помощью кнопки «Назад»
D / NextActivity: вызов onPause из следующей активности
D / MainActivity: вызов onRestart из MainActivity
D / MainActivity: вызов onStart из MainActivity
D / MainActivity: вызов onResume из MainActivity
D / NextActivity: вызов onStop из следующей активности
D / NextActivity: вызов onDestroy из следующей активности
Случай 2: когда активность частично скрыта (когда нажата кнопка обзора) или Когда приложение переходит в фоновый режим, а другое приложение полностью скрывает его
D / MainActivity: вызов onPause из MainActivity
D / MainActivity: вызов onStop из MainActivity
и когда приложение вернется на передний план, готовый принять пользовательские входы,
D / MainActivity: вызов onRestart из MainActivity
D / MainActivity: вызов onStart из MainActivity
D / MainActivity: вызов onResume из MainActivity
называются
Случай 3: когда действие вызывается для выполнения неявного намерения, и пользователь делает выбор. Например, когда нажата кнопка совместного доступа, и пользователь должен выбрать приложение из списка показанных приложений
D / MainActivity: вызов onPause из MainActivity
Активность видна, но не активна. Когда выбор сделан и приложение активно
D / MainActivity: вызов onResume из MainActivity
называется
Case4:
Когда приложение будет убито в фоновом режиме (чтобы освободить ресурсы для другого приложения переднего плана), onPause (для устройства с предварительной сотой ) или onStop (для сотового устройства) будет последним, которое будет вызвано до того, как приложение будет завершено.
onCreate и onDestroy будут называться предельно один раз при каждом запуске приложения. Но onPause, onStop, onRestart, onStart, onResume может быть вызван много раз в течение жизненного цикла.
Действие launchMode
Режим запуска определяет поведение новой или существующей активности в задаче.
Возможны следующие режимы запуска:
- стандарт
- SingleTop
- singleTask
- SingleInstance
Он должен быть определен в android в элементе <activity/>
как атрибут android:launchMode
.
<activity
android:launchMode=["standard" | "singleTop" | "singleTask" | "singleInstance"] />
Стандарт:
Значение по умолчанию. Если этот режим установлен, новая активность всегда будет создаваться для каждого нового намерения. Таким образом, можно получить много видов деятельности одного типа. Новая деятельность будет размещена в верхней части задачи. Существует некоторая разница для разных версий Android: если активность начинается с другого приложения, в андроидах <= 4.4 он будет помещен в ту же задачу, что и стартерное приложение, но при> = 5.0 будет создано новое задание.
SingleTop:
Этот режим практически не отличается от standard
. Можно создать много экземпляров активности singleTop. Разница заключается в том, что если экземпляр активности уже существует в верхней части текущего стека, вместо нового экземпляра будет вызываться onNewIntent()
.
SingleTask:
Активность в этом режиме запуска может иметь только один экземпляр в системе . Будет создана новая задача для активности, если она не существует. В противном случае задача с активностью будет перемещена вперёд и onNewIntent
.
SingleInstance:
Этот режим похож на singleTask
. Разница - это задача, которая имеет активность с singleInstance
может иметь только эту активность и не более того. Когда singleInstance
activity создает другое действие, будет создана новая задача для размещения этой активности.
Представление пользовательского интерфейса с помощью setContentView
Класс Activity заботится о создании окна для вас, в котором вы можете разместить свой пользовательский интерфейс с помощью setContentView
.
Существует три метода setContentView
:
-
setContentView(int layoutResID)
- установка содержимого активности из ресурса макета. -
setContentView(View view)
- Установить содержимое активности в явное представление. -
setContentView(View view, ViewGroup.LayoutParams params)
- Установите содержимое активности в явное представление с предоставленными параметрами.
Когда setContentView
, это представление помещается непосредственно в иерархию представлений активности. Он может быть сложной иерархией представлений.
Примеры
Установить содержимое из файла ресурсов:
Добавьте файл ресурсов (main.xml в этом примере) с иерархией представлений:<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<TextView android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello" />
</FrameLayout>
Задайте его как содержимое в действии:
public final class MainActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// The resource will be inflated,
// adding all top-level views to the activity.
setContentView(R.layout.main);
}
}
Задайте содержимое для явного представления:
public final class MainActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Creating view with container
final FrameLayout root = new FrameLayout(this);
final TextView text = new TextView(this);
text.setText("Hello");
root.addView(text);
// Set container as content view
setContentView(root);
}
}
Очистите текущий стек активности и запустите новую операцию
Если вы хотите очистить текущий стек активности и запустить новое действие (например, выход из приложения и запуск журнала в Activity), существует, по-видимому, два подхода.
1. Цель (API> = 16)
Вызов finishAffinity()
из Activity
2. Цель (11 <= API <16)
Intent intent = new Intent(this, LoginActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK |Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
finish();
Завершить приложение с исключением из ректоратов
Сначала определите ExitActivity в AndroidManifest.xml
<activity
android:name="com.your_example_app.activities.ExitActivity"
android:autoRemoveFromRecents="true"
android:theme="@android:style/Theme.NoDisplay" />
После этого класс ExitActivity
/**
* Activity to exit Application without staying in the stack of last opened applications
*/
public class ExitActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (Utils.hasLollipop()) {
finishAndRemoveTask();
} else if (Utils.hasJellyBean()) {
finishAffinity();
} else {
finish();
}
}
/**
* Exit Application and Exclude from Recents
*
* @param context Context to use
*/
public static void exitApplication(ApplicationContext context) {
Intent intent = new Intent(context, ExitActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NO_ANIMATION | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
context.startActivity(intent);
}
}
Навигация по действиям
Навигация вверх осуществляется в android, добавив android:parentActivityName=""
в Manifest.xml к тегу активности. В основном с помощью этого тега вы сообщаете системе о родительской активности.
Как это делается?
<uses-permission android:name="android.permission.INTERNET" />
<application
android:name=".SkillSchoolApplication"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity
android:name=".ui.activities.SplashActivity"
android:theme="@style/SplashTheme">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".ui.activities.MainActivity" />
<activity android:name=".ui.activities.HomeActivity"
android:parentActivityName=".ui.activities.MainActivity/> // HERE I JUST TOLD THE SYSTEM THAT MainActivity is the parent of HomeActivity
</application>
Теперь, когда я нажму на стрелку внутри панели инструментов HomeActivity, она вернет меня к родительской активности.
Код Java
Здесь я напишу соответствующий Java-код, необходимый для этой функции.
public class HomeActivity extends AppCompatActivity {
@BindView(R.id.toolbar)
Toolbar toolbar;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_home);
ButterKnife.bind(this);
//Since i am using custom tool bar i am setting refernce of that toolbar to Actionbar. If you are not using custom then you can simple leave this and move to next line
setSupportActionBar(toolbar);
getSupportActionBar.setDisplayHomeAsUpEnabled(true); // this will show the back arrow in the tool bar.
}
}
Если вы запустите этот код, вы увидите, когда вы нажмете кнопку «Назад», он вернет вас в MainActivity. Для более глубокого понимания Up Navigation я бы рекомендовал читать документы
Вы можете более точно настроить это поведение по своим потребностям, переопределив
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
// Respond to the action bar's Up/Home button
case android.R.id.home:
NavUtils.navigateUpFromSameTask(this); // Here you will write your logic for handling up navigation
return true;
}
return super.onOptionsItemSelected(item);
}
Простой взлом
Это простой хак, который в основном используется для перехода к родительской активности, если родитель находится в backstack. onBackPressed()
если id равен android.R.id.home
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
switch (id) {
case android.R.id.home:
onBackPressed();
return true;
}
return super.onOptionsItemSelected(item);
}