Поиск…


Вступление

Действие представляет собой один экран с пользовательским интерфейсом (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);
    }


Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow