|
|
@@ -14,6 +14,7 @@
|
|
|
* [Первичная настройка приложения](#Первичная-настройка-приложения)
|
|
|
* [Добавление альбомной ориентации](#Добавление-альбомной-ориентации)
|
|
|
* [Модальный диалог авторизации](#Модальный-диалог-авторизации)
|
|
|
+* [Регулярные выражения](#Регулярные-выражения)
|
|
|
* [HTTP-запросы, методы, форматы, заголовки.](#HTTP-запросы-методы-форматы-заголовки)
|
|
|
|
|
|
## API
|
|
|
@@ -734,6 +735,55 @@ else
|
|
|
|
|
|
Как видите, в параметры GET-запроса я добавил заголовки, чтобы можно было добавить токен. Дальнейшая реализация уже с вас.
|
|
|
|
|
|
+
|
|
|
+## Сохранение данных при работе приложения
|
|
|
+
|
|
|
+Специфика жизненного цикла **activity** такова, что при каждом чихе (смена ориентации, языка и т.п.) окно пересоздаётся То есть все наши данные теряются.
|
|
|
+
|
|
|
+Гугл рекомендует нам пользоваться событиями *onSaveInstanceState* и *onRestoreInstanceState* которые вызываются, соответственно, при удалении **activity** и при восстановлении.
|
|
|
+
|
|
|
+В параметрах этих функций передаётся объект, в который (и из которого) мы можем сохранить нужные нам данные и потом восстановить.
|
|
|
+
|
|
|
+Но хранить в таком объекте можно только скалярные данные (т.е. базовые типы типа "целое", "строка" и т.п.). Чтобы сохранить более-менее сложный объект, например, массив продукции, нужно использовать сериализацию/десериализацию.
|
|
|
+
|
|
|
+Есть ещё более модная концепция **LiveData** - но там даже у меня происходит вывих мозга (это самая правильная концепция и если вы не дай бог станете таки андроид-разработчиками, то разобраться в ней надо).
|
|
|
+
|
|
|
+Но ещё есть простой рабоче-крестьянский вариант с глобальными переменными. Само понятие глобальные переменные противоречит одному из основных постулатов ООП - **инкапсуляция**, поэтому его не рекомендуется использовать в сколько-нибудь серъезных проектах.
|
|
|
+
|
|
|
+1. Создайте класс **MyApp**, который наследуется от класа **Application** и внутри опишите **публичные** переменные, которые можно будет использовать во всех **activity** нашего приложения
|
|
|
+
|
|
|
+ ```kt
|
|
|
+ class MyApp: Application() {
|
|
|
+ var token = ""
|
|
|
+ var username = ""
|
|
|
+ }
|
|
|
+ ```
|
|
|
+
|
|
|
+2. В манифесте в тег **application** добавьте атрибут *android:name=".MyApp"*, где *.MyApp* это имя созданного нами ранее класса
|
|
|
+
|
|
|
+3. В классах, где нам нужны глобальные переменные создаем переменную, которая будет хранить указатель на **MyApp**
|
|
|
+
|
|
|
+ ```kt
|
|
|
+ private lateinit var app: MyApp
|
|
|
+ ```
|
|
|
+
|
|
|
+ В конструкторе класса проинициализируйте её
|
|
|
+
|
|
|
+ ```kt
|
|
|
+ app = applicationContext as MyApp
|
|
|
+ ```
|
|
|
+
|
|
|
+ И дальше в коде можете её использовать
|
|
|
+
|
|
|
+ ```kt
|
|
|
+ if(app.token.isEmpty()){
|
|
|
+ //
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ //
|
|
|
+ }
|
|
|
+ ```
|
|
|
+
|
|
|
# Задание
|
|
|
|
|
|
* на первый экран добавить заставку (splash-screen) с таймером на пару секунд, только потом показывать диалог для ввода логина/пароля
|