Как вызываются и выполняются функции Activity, такие как onStart (), onCreate (), onResume ()? [Дубликат]

Вам не нужно указывать имена столбцов вручную в xaml. Просто установите для свойства AutoGenerateColumns значение true, и ваш список будет автоматически привязан к DataGrid. обратитесь к коду. Код XAML:

  & lt; Grid & gt;  & lt; DataGrid x: Name = "MyDatagrid" AutoGenerateColumns = "True" Height = "447" HorizontalAlignment = "Left" Margin = "20,85,0,0" VerticalAlignment = "Top" Width = "799" ItemsSource = "{  Binding Path = ListTest, Mode = TwoWay, UpdateSourceTrigger = PropertyChanged} "CanUserAddRows =" False "& gt;  & Lt; / Сетка & GT;   

C #

  Открытый класс Test {public string m_field1_Test {get; set;} public string m_field2_Test {get;  задавать;  } public Test () {m_field1_Test = "field1";  m_field2_Test = "field2";  } public MainWindow () {listTest = новый List & lt; Test & gt; ();  for (int i = 0; i & lt; 10; i ++) {obj = new Test ();  listTest.Add (OBJ);  } this.MyDatagrid.ItemsSource = ListTest;  InitializeComponent ();  }  
370
задан Peter Mortensen 23 January 2014 в 00:14
поделиться

8 ответов

См. Жизненный цикл активности (в Android Developers).

Enter image description here [/g10]

onCreate () :

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

onRestart () :

Вызывается после того, как ваша активность была остановлена, до этого снова начнется. Всегда за ним следует onStart ()

onStart () :

Вызывается, когда действие становится видимым для пользователя. За ним следует onResume (), если действие выходит на передний план или onStop (), если оно становится скрытым.

onResume () :

Вызывается, когда действие начнет взаимодействовать с пользователем. На данный момент ваша деятельность находится в верхней части стека действий, при этом пользовательский ввод идет.

onPause () :

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

onStop () :

Вызывается, когда вы больше не видите пользователя. После этого вы будете получать либо onRestart (), onDestroy (), либо ничего, в зависимости от более поздней активности пользователя.

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

onDestroy () :

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

Когда активность в первый раз загружается, события вызываются, как показано ниже:

onCreate()
onStart()
onResume()

Когда вы нажимаете кнопку «Телефон», активность переходит в фоновый режим, а следующие события вызванный:

onPause()
onStop()

Выйдите из телефонного набора, и будут вызываться следующие события:

onRestart()
onStart()
onResume()

Когда вы нажимаете кнопку «Назад» или пытаетесь завершить () активность событий называются ниже:

onPause()
onStop()
onDestroy()

Состояния активности

ОС Android использует очередь приоритетов, чтобы помочь в управлении действиями, выполняемыми на устройстве На основе состояния, в котором находится конкретная активность Android, ему будет присвоен определенный приоритет в ОС. Эта система приоритетов помогает Android идентифицировать действия, которые больше не используются, al с помощью ОС восстанавливать память и ресурсы. Следующая диаграмма иллюстрирует состояния, через которые может проходить активность за время жизни:

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

Активен или работает - действия считаются активными или выполняются, если они находятся на переднем плане, также называются вершинами стека действий. Это считается наивысшим приоритетом в стеке активности Android, и как таковое будет уничтожаться только ОС в экстремальных ситуациях, например, если активность пытается использовать больше памяти, чем доступно на устройстве, так как это может привести к тому, что пользовательский интерфейс будет перестают отвечать.

Приостановлено. Когда устройство переходит в режим сна или активность все еще видима, но частично скрыта в результате новой, не полной или прозрачной активности, активность считается приостановленной. Приостановленные действия все еще живы, то есть они поддерживают всю информацию о состоянии и членах и остаются прикрепленными к оконному менеджеру. Это считается второстепенным приоритетом в стеке активности Android и, как таковой, будет уничтожаться только ОС, если убить это действие будет удовлетворять требованиям к ресурсам, необходимым для поддержания стабильной и оперативной активности Active / Running.

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

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

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
public class MainActivity extends Activity {
    String tag = "LifeCycleEvents";
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.main);
       Log.d(tag, "In the onCreate() event");
    }
    public void onStart()
    {
       super.onStart();
       Log.d(tag, "In the onStart() event");
    }
    public void onRestart()
    {
       super.onRestart();
       Log.d(tag, "In the onRestart() event");
    }
    public void onResume()
    {
       super.onResume();
       Log.d(tag, "In the onResume() event");
    }
    public void onPause()
    {
       super.onPause();
       Log.d(tag, "In the onPause() event");
    }
    public void onStop()
    {
       super.onStop();
       Log.d(tag, "In the onStop() event");
    }
    public void onDestroy()
    {
       super.onDestroy();
       Log.d(tag, "In the onDestroy() event");
    }
}
687
ответ дан jitesh mohite 16 August 2018 в 08:02
поделиться
  • 1
    Итак, если я правильно понял его, onStop () всегда вызывается после onPause ()? – Titouan de Bailleul 31 October 2012 в 18:19
  • 2
    НЕ всегда, & quot; onStop (): Вызывается, когда вы больше не видимы пользователю & quot; – Yaqub Ahmad 26 November 2012 в 10:22
  • 3
    Есть ли что-нибудь, что можно вызвать до onCreate? – Aaron Russell 23 September 2013 в 04:31
  • 4
    Да есть - конструктор по умолчанию (это тот, у которого нет параметров). Но это очень ограниченное использование для очень простых целей инициализации. Обычно вы должны not использовать его, если вы действительно не знаете, что делаете. И даже тогда вы должны подумать дважды, если есть лучший способ сделать что-то. – Mjoellnir 28 February 2015 в 08:45
  • 5
    Как перейти непосредственно из onResume () в onPause () в виде активности? – Kaveesh Kanwal 9 April 2015 в 16:57

Мне нравится этот вопрос и ответы на него, но до сих пор не было охвачено менее часто используемых обратных вызовов, таких как onPostCreate () или onPostResume () . Стив Померой попытался включить диаграмму, в том числе и о том, как они относятся к жизненному циклу фрагмента Android, в https://github.com/xxv/android-lifecycle . Я пересмотрел большую диаграмму Стива, чтобы включить только часть активности и отформатировал ее для распечатки одной страницы с одной страницей. Я разместил его как текстовый PDF в https://github.com/code-read/android-lifecycle/blob/master/AndroidActivityLifecycle1.pdf , а ниже - его изображение:

9
ответ дан CODE-REaD 16 August 2018 в 08:02
поделиться

ANDROID LIFE-CYCLE

Существует семь методов управления жизненным циклом приложения для Android:


Ответ за все эти методы для:

Возьмем простой сценарий, в котором знание того, в каком порядке эти методы

  • Предположим, вы используете приложение калькулятора. Три метода вызываются последовательно для запуска приложения.

onCreate() - - -> onStart() - - -> onResume()

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

onPause() - - -> onStop()

  • Теперь скажем, я заканчиваю разговор по телефону, активность калькулятора выходит на передний план из фона, поэтому последовательно вызывается три метода.

onRestart() - - -> onStart() - - -> onResume()

  • Наконец, скажем, что я закончил все задачи в приложении калькулятора, и я хочу выйти из приложения. Последующие два метода вызывают последовательно.

onStop() - - -> onDestroy()


Существует четыре состояния, в которых может существовать действие:

  • Начальное состояние
  • Состояние работы
  • Приостановленное состояние
  • Остановленное состояние

Начальное состояние включает в себя:

Создание нового процесса Linux, выделение новой памяти для нового UI и настройку всего экрана. Поэтому основная часть работы здесь задействована.

Состояние выполнения включает в себя:

Это действие (состояние), которое в данный момент находится на экране. Это состояние только обрабатывает такие вещи, как ввод текста на экране и касание & amp; нажатие кнопок.

Приостановленное состояние включает в себя:

Когда действие не находится на переднем плане, а вместо этого оно находится в фоновом режиме, то действие, как говорят, находится в состоянии паузы.

Остановленное состояние включает в себя:

Остановленную активность можно купить только на переднем плане, перезапустив ее, а также ее можно уничтожить в любой момент времени.

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

18
ответ дан Martijn Pieters 16 August 2018 в 08:02
поделиться

Вся путаница вызвана тем, что Google выбрал неинтуитивные имена вместо следующего:

onCreateAndPrepareToDisplay()   [instead of onCreate() ]
onPrepareToDisplay()            [instead of onRestart() ]
onVisible()                     [instead of onStart() ]
onBeginInteraction()            [instead of onResume() ]
onPauseInteraction()            [instead of onPause() ]
onInvisible()                   [instead of onStop]
onDestroy()                     [no change] 

Диаграмма активности может быть интерпретирована как:

enter image description here [/g0]

144
ответ дан Nilesh Pawar 16 August 2018 в 08:02
поделиться
  • 1
    Зависит. Если это не решит путаницу, длинное имя не пострадает. Например: onRoutePresentationDisplayChanged () - это очень большая функция изнутри Android SDK – Nilesh Pawar 29 April 2013 в 19:45
  • 2
    Если бы мы часто вводили эти имена методов, то из SDK был бы хороший баланс между длиной и достаточно описательным. Тем не менее, у IDE есть ярлыки, чтобы переопределить эти вещи, и нам действительно не нужно их называть, поэтому более длинные описательные имена, как они бы хорошо работали. Это, скорее, проблема для новичков. – Daniel 27 July 2013 в 11:46
  • 3
    Я лично не нахожу ваши имена более интуитивными, плюс с Фрагментами, это действительно не коррелирует. – Martin Marconcini 2 August 2013 в 22:44
  • 4
    Upvoted. Полезнее официальной документации – bad_keypoints 3 March 2014 в 07:41
  • 5
    Это отличный пост. Одна проблема. Когда вы вводите методы Andoid Lifecycle в google, это изображение появляется выше опции поиска (даже в режиме поиска изображений) в качестве ответа на методы жизненного цикла Android. Незнание (или ленивое в зависимости от того, как вы смотрите на него) может легко ввести в заблуждение, если они не следуют ссылке StackOverflow, а не нажимают на изображение блок-схемы (ваше изображение). – Andrew S 20 September 2016 в 00:50

На странице Android Developers

onPause ():

Вызывается, когда система начнет возобновление предыдущего действия. Обычно это используется для переноса несохраненных изменений в постоянные данные, остановки анимации и других вещей, которые могут потреблять процессор и т. Д. Реализации этого метода должны быть очень быстрыми, потому что следующее действие не будет возобновлено до тех пор, пока этот метод не вернется. За ним следует либо onResume (), если операция возвращается к фронту, либо onStop (), если она становится невидимой для пользователя.

onStop ():

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

Теперь предположим, что есть три действия, и вы переходите от От A до B, то onPause от A будет теперь вызываться от B до C, затем на Pause B и onStop A будет вызываться.

Приостановленное действие получает Возобновление и Stopped перезапускается.

Когда вы вызываете this.finish(), вызывается onPause-onStop-onDestroy. Главное, что нужно помнить: приостановлено. Действия прекращаются, и прекращенная деятельность получает Destroyed, когда для Android требуется память для других операций.

Надеюсь, это достаточно ясно.

7
ответ дан Peter Mortensen 16 August 2018 в 08:02
поделиться
  • 1
    мы можем называть метод onPause промежуточным этапом между активностью, начинающейся с ослабления фокуса, и она, наконец, становится невидимой для пользователя и метода Onstop, когда активность становится полностью невидимой для пользователя – Nav 15 December 2011 в 08:29
  • 2
    Я думаю, это должно быть так. – Masiar 15 December 2011 в 08:31
  • 3
    @Nav Предположим, что есть 3 действия, и вы переходите от A к B, тогда onPause A будет вызываться теперь от B до C, тогда onPause B и onStop A будет вызываться. – MKJParekh 15 December 2011 в 08:44

Добавление дополнительной информации в верхней части высоко оцененного ответа (добавлен дополнительный раздел KILLABLE и следующий набор методов, которые будут вызываться в жизненном цикле):

Источник: разработчик .android.com

Обратите внимание на столбец «Killable» в приведенной выше таблице - для тех методов, которые отмечены как подлежащие уничтожению , после того, как этот метод возвращает процесс, в котором эта активность может быть убита системой, в любой момент без какой-либо другой строки исполняемого кода.

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

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

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

onPostCreate(Bundle savedInstanceState)

Вызывается, когда запуск активности завершен (после вызова onStart() и onRestoreInstanceState(Bundle)).

onPostResume()

Вызывается, когда возобновление активности завершено (после того, как был вызван onResume()).

onSaveInstanceState(Bundle outState)

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

onRestoreInstanceState(Bundle savedInstanceState)

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

Мой код приложения, используя все эти методы:

public class MainActivity extends AppCompatActivity implements View.OnClickListener{

    private EditText txtUserName;
    private EditText txtPassword;
    Button  loginButton;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Log.d("Ravi","Main OnCreate");
        txtUserName=(EditText) findViewById(R.id.username);
        txtPassword=(EditText) findViewById(R.id.password);
        loginButton =  (Button)  findViewById(R.id.login);
        loginButton.setOnClickListener(this);

    }

    @Override
    public void onClick(View view) {
        Log.d("Ravi", "Login processing initiated");
        Intent intent = new Intent(this,LoginActivity.class);
        Bundle bundle = new Bundle();
        bundle.putString("userName",txtUserName.getText().toString());
        bundle.putString("password",txtPassword.getText().toString());
        intent.putExtras(bundle);
        startActivityForResult(intent,1);
       // IntentFilter
    }
    public void onActivityResult(int requestCode, int resultCode, Intent resIntent){
        Log.d("Ravi back result:", "start");
        String result = resIntent.getStringExtra("result");
        Log.d("Ravi back result:", result);
        TextView txtView = (TextView)findViewById(R.id.txtView);
        txtView.setText(result);

        Intent sendIntent = new Intent();
        //sendIntent.setPackage("com.whatsapp");
        sendIntent.setAction(Intent.ACTION_SEND);
        sendIntent.putExtra(Intent.EXTRA_TEXT, "Message...");
        sendIntent.setType("text/plain");
        startActivity(sendIntent);
    }

    @Override
    protected void onStart() {
        super.onStart();
        Log.d("Ravi","Main Start");
    }

    @Override
    protected void onRestart() {
        super.onRestart();
        Log.d("Ravi","Main ReStart");
    }

    @Override
    protected void onPause() {
        super.onPause();
        Log.d("Ravi","Main Pause");
    }

    @Override
    protected void onResume() {
        super.onResume();
        Log.d("Ravi","Main Resume");
    }

    @Override
    protected void onStop() {
        super.onStop();
        Log.d("Ravi","Main Stop");
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.d("Ravi","Main OnDestroy");
    }

    @Override
    public void onPostCreate(Bundle savedInstanceState, PersistableBundle persistentState) {
        super.onPostCreate(savedInstanceState, persistentState);
        Log.d("Ravi","Main onPostCreate");
    }

    @Override
    protected void onPostResume() {
        super.onPostResume();
        Log.d("Ravi","Main PostResume");
    }

    @Override
    public void onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState) {
        super.onSaveInstanceState(outState, outPersistentState);
    }

    @Override
    protected void onRestoreInstanceState(Bundle savedInstanceState) {
        super.onRestoreInstanceState(savedInstanceState);
    }
}

Вход в систему:

public class LoginActivity extends AppCompatActivity {

    private TextView txtView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);
        txtView = (TextView) findViewById(R.id.Result);
        Log.d("Ravi","Login OnCreate");
        Bundle bundle = getIntent().getExtras();
        txtView.setText(bundle.getString("userName")+":"+bundle.getString("password"));
        //Intent  intent = new Intent(this,MainActivity.class);
        Intent  intent = new Intent();
        intent.putExtra("result","Success");
        setResult(1,intent);
       // finish();
    }
}

выход: (до паузы)

D/Ravi: Main OnCreate
D/Ravi: Main Start
D/Ravi: Main Resume
D/Ravi: Main PostResume
Выход

: (после возобновления паузы)

D/Ravi: Main ReStart
D/Ravi: Main Start
D/Ravi: Main Resume
D/Ravi: Main PostResume

Примечание что onPostResume() вызывается, хотя он не цитируется как метод жизненного цикла.

136
ответ дан Ravindra babu 16 August 2018 в 08:02
поделиться
  • 1
    'Когда любой диалог открывается на экране, onPause () вызывается', не имеет значения для alertdialog. Он вызывается только тогда, когда диалог сам по себе является активным диалогом (тема имеет значение @android: style / Theme.Dialog). – gaurav jain 9 March 2016 в 12:12
  • 2
    Ценный ответ. Отправьте это в Google, чтобы добавить в свою документацию. Я сохраняю ваш ответ на документ Word, чтобы его сохранить! – likejiujitsu 11 September 2016 в 01:53
  • 3
    Я не понимаю, что «любой телефон звонит и пользователь в приложении». Что такое сценарий? Мой первый, хотя был, если пользователь находится в приложении, и телефон начинает звонить, тогда будет onPause () - & gt; onStop () в случае, когда полный экран стал вызовом. Для сообщения о входящем вызове хэдз-ап может быть только OnResume - & gt; onPause (), но я не уверен в этом. Какова ситуация при вызове onPause - & gt; onResume? По окончании звонка? – Sotti 25 October 2016 в 10:49
  • 4
    Это то, что я искал. Просто хотел знать, где я должен поместить свой ави. – Heisenberg 5 April 2017 в 20:17
  • 5
    Мне понравился ваш сценарий на основе ответа. – kokabi 5 May 2017 в 10:40

Начните с основ. У меня есть много руководств, связанных с компонентами, поддерживающими жизненный цикл. Вы учитесь на жизненный цикл, так как ваш вопрос будет https://www.youtube.com/watch?v=e-ews5dRMwI

0
ответ дан Vishal 16 August 2018 в 08:02
поделиться

Действие имеет шесть состояний

  • Создано
  • Начато
  • Возобновлено
  • Приостановлено
  • Остановлено
  • Разрушено

Жизненный цикл активности имеет семь методов

  • onCreate()
  • onStart()
  • onResume()
  • onPause()
  • onStop()
  • onRestart()
  • onDestroy()

activity life cycle [/g6]

Ситуации

  • При открытии приложения
    onCreate() --> onStart() -->  onResume()
    
  • Когда кнопка «Назад» нажата и выйдет из приложения
    onPaused() -- > onStop() --> onDestory()
    
  • Когда кнопка дома нажата
    onPaused() --> onStop()
    
  • После нажатия кнопки «домой», когда снова откроется приложение из списка недавних задач или нажата на значок
    onRestart() --> onStart() --> onResume()
    
  • Когда открытое приложение другое приложение из панели уведомлений или открытых настроек
    onPaused() --> onStop()
    
  • Кнопка «Назад», нажатая из другого приложения, или используемые настройки, может увидеть наше приложение
    onRestart() --> onStart() --> onResume()
    
  • Когда любое диалоговое окно открывается на экране
    onPause()
    
  • После отклонения диалогового окна или кнопки возврата из диалога
    onResume()
    
  • Любой телефон звонит и пользователь в приложении
    onPause() --> onResume() 
    
  • Когда пользователь нажал кнопку ответа на телефон
    onPause()
    
  • После завершения вызова
    onResume()
    
  • Когда экран телефона выключен
    onPaused() --> onStop()
    
  • Когда экран снова включен
    onRestart() --> onStart() --> onResume()
    
136
ответ дан Ravindra babu 16 August 2018 в 09:55
поделиться
  • 1
    'Когда любой диалог открывается на экране, onPause () вызывается', не имеет значения для alertdialog. Он вызывается только тогда, когда диалог сам по себе является активным диалогом (тема имеет значение @android: style / Theme.Dialog). – gaurav jain 9 March 2016 в 12:12
  • 2
    Ценный ответ. Отправьте это в Google, чтобы добавить в свою документацию. Я сохраняю ваш ответ на документ Word, чтобы его сохранить! – likejiujitsu 11 September 2016 в 01:53
  • 3
    Я не понимаю, что «любой телефон звонит и пользователь в приложении». Что такое сценарий? Мой первый, хотя был, если пользователь находится в приложении, и телефон начинает звонить, тогда будет onPause () - & gt; onStop () в случае, когда полный экран стал вызовом. Для сообщения о входящем вызове хэдз-ап может быть только OnResume - & gt; onPause (), но я не уверен в этом. Какова ситуация при вызове onPause - & gt; onResume? По окончании звонка? – Sotti 25 October 2016 в 10:49
  • 4
    Это то, что я искал. Просто хотел знать, где я должен поместить свой ави. – Heisenberg 5 April 2017 в 20:17
  • 5
    Мне понравился ваш сценарий на основе ответа. – kokabi 5 May 2017 в 10:40
Другие вопросы по тегам:

Похожие вопросы: