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

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

(a). Создание приложения, перечисляющего методы жизненного цикла активности в Kotlin

В этом примере вы научитесь базовому взаимодействию с этими методами. Мы покажем простое сообщение с тостом при возникновении такого события.

Мы используем android studio и kotlin

Жареный рис с яйцом и овощами по-китайски, золотистый и хрустящий!

Жареный рис с яйцом...
Жареный рис с яйцом и овощами по-китайски, золотистый и хрустящий!

Шаг 1: Зависимости

Для этого проекта не требуется никаких зависимостей.

Шаг 2: Код Kotlin

Начните с создания файла с именем MaiActivity.kt.

MainActivity.kt.

Затем добавьте импорты:

import android.os.Bundle
import android.util.Log
import androidx.appcompat.app.AppCompatActivity
import kotlinx.android.synthetic.main.activity_main.*
import java.lang.StringBuilder

Затем расширьте AppCompatActivity:

class MainActivity : AppCompatActivity() {
    //

Первый метод жизненного цикла, который мы переопределяем, это onCreate(). Он вызывается при первом создании активности. Здесь мы раздуем наш xml-макет. Затем добавим текст в наш текстовый конструктор. Затем отобразим текст в текстовом окне.

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        sb.append("\n onCreate Called")
        tv.text = sb.toString()
        Log.d("ACTIVITY_LIFECYCLE", "onCreate Called")
    }

Затем мы переопределим нашу функцию onStart(). Это происходит, когда активность запускается и становится видимой для использования:


    override fun onStart() {
        super.onStart()
        sb.append("\n onStart Called")
        tv.text = sb.toString()
        Log.d("ACTIVITY_LIFECYCLE", "onStart Called")
    }

И так далее, и так далее.

Вот полный код:

package info.camposha.activitylifecycle

import android.os.Bundle
import android.util.Log
import androidx.appcompat.app.AppCompatActivity
import kotlinx.android.synthetic.main.activity_main.*
import java.lang.StringBuilder

class MainActivity : AppCompatActivity() {
    val sb: StringBuilder = StringBuilder()
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        sb.append("\n onCreate Called")
        tv.text = sb.toString()
        Log.d("ACTIVITY_LIFECYCLE", "onCreate Called")
    }

    override fun onStart() {
        super.onStart()
        sb.append("\n onStart Called")
        tv.text = sb.toString()
        Log.d("ACTIVITY_LIFECYCLE", "onStart Called")
    }

    override fun onResume() {
        super.onResume()
        sb.append("\n onResume Called")
        tv.text = sb.toString()
        Log.d("ACTIVITY_LIFECYCLE", "onResume Called")
    }

    override fun onPause() {
        super.onPause()
        sb.append("\n onPause Called")
        tv.text = sb.toString()
        Log.d("ACTIVITY_LIFECYCLE", "onPause Called")
    }

    override fun onStop() {
        super.onStop()
        sb.append("\n onStop Called")
        tv.text = sb.toString()
        Log.d("ACTIVITY_LIFECYCLE", "onStop Called")
    }

    override fun onDestroy() {
        super.onDestroy()
        sb.append("\n onDestroy Called")
        tv.text = sb.toString()
        Log.d("ACTIVITY_LIFECYCLE", "onDestroy Called")
    }
}

Шаг 3: Макеты

activity_main.xml

Главное в макете нашей основной активности – это то, что у нас будет текстовое представление, которое будет показывать методы жизненного цикла по мере их появления:

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <TextView
        android:id="@+id/tv"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:text=""
        android:textAppearance="@style/TextAppearance.AppCompat.Medium"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>

Шаг 4: Запуск

Запустите проект.

Изменение конфигурации экрана

В этом материале мы рассмотрим android-решения, связанные с изменением конфигурации android-устройства.

Вот простая заметка об обработке изменений конфигурации в соответствии с официальной документацией android:

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

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

Как слушать изменения конфигурации в android?

Шаг 1 – Укажите свойство configChanges в манифесте android.

Например:

<activity android:name=".MyActivity"
          android:configChanges="orientation|screenSize|screenLayout|keyboardHidden"
          android:label="@string/app_name">

Код объявляет активность, которая обрабатывает как изменение ориентации экрана, так и изменение доступности клавиатуры.

  • Значение "orientation" предотвращает перезапуск при изменении ориентации экрана.
  • Значение "screenSize" также предотвращает перезапуск при изменении ориентации, но только для Android 3.2 (API level 13) и выше.
  • Значение "screenLayout" необходимо для обнаружения изменений, которые могут быть вызваны такими устройствами, как складные телефоны и трансформируемые Chromebook.
  • Значение "keyboardHidden" предотвращает перезагрузку при изменении доступности клавиатуры.

Шаг 2: Переопределите метод onConfigurationChanged.

Например:

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);

    int newOrientation = newConfig.orientation;

    if (newOrientation == Configuration.ORIENTATION_LANDSCAPE) {
      // show("Landscape");
    } else if (newOrientation == Configuration.ORIENTATION_PORTRAIT){
    // show("Portrait");
    }
}

Или вы можете использовать оператор switch:

int orientation=newConfig.orientation;
switch(orientation) {
    case Configuration.ORIENTATION_LANDSCAPE:
        //to do something
        break;
    case Configuration.ORIENTATION_PORTRAIT:
        //to do something
        break;
}

В Kotlin:

override fun onConfigurationChanged(newConfig: Configuration) {
    super.onConfigurationChanged(newConfig)

    // Checks the orientation of the screen
    if (newConfig.orientation === Configuration.ORIENTATION_LANDSCAPE) {
        Toast.makeText(this, "landscape", Toast.LENGTH_SHORT).show()
    } else if (newConfig.orientation === Configuration.ORIENTATION_PORTRAIT) {
        Toast.makeText(this, "portrait", Toast.LENGTH_SHORT).show()
    }
}

Обратите внимание, что перед написанием кода реализации необходимо добавить super.onConfigurationChanged(newConfig);, иначе может возникнуть исключение.

Наблюдения

Функция onConfigurationCalled() может не вызываться, если вы.

1.Установили макет на ландшафтный в XML

    android:screenOrientation="landscape"

2. Вызвать setRequestedOrientation вручную

    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

3. У вас заданы и android:screenOrientation, и android:configChanges .

Пример – Как обрабатывать изменения ориентации экрана

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

Шаг 1- Создание макета

Добавьте следующий код в ваш xml-макет:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/hello_world" />

</RelativeLayout>

Шаг 2: MainActivity.java

Затем добавьте следующий код в вашу главную активность:

package com.example.screenorientation;

import android.os.Bundle;
import android.app.Activity;
import android.content.res.Configuration;
import android.view.Menu;
import android.widget.Toast;

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        onConfigurationChanged(new Configuration());
    }
@Override
public void onConfigurationChanged(Configuration newConfig) {
    // TODO Auto-generated method stub
    super.onConfigurationChanged(newConfig);

    if(getResources().getConfiguration().orientation==Configuration.ORIENTATION_PORTRAIT)
    {
        Toast.makeText(getApplicationContext(), "portrait", Toast.LENGTH_SHORT).show();
        System.out.println("portrait");
    }
    else if (getResources().getConfiguration().orientation==Configuration.ORIENTATION_LANDSCAPE) {
         Toast.makeText(getApplicationContext(), "landscape", Toast.LENGTH_SHORT).show();
            System.out.println("landscape");
    }
    else
    {
         Toast.makeText(getApplicationContext(), "none", Toast.LENGTH_SHORT).show();
            System.out.println("none");
    }
}
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

}

Вот и все.