Разработка современных мобильных приложений под Android

1.

“Разработка современных
мобильных приложений под Android”
Панчуков Михаил
Точка кипения°

2.

Kotlin
Room
Instan
t app

3.

Kotlin

4.

“Now official”
Подробнее: https://blog.jetbrains.com/kotlin/2017/05/kotlin-on-android-nowofficial/

5.

Kotlin
Статически типизированный язык
“Null safety”
100% совместим с Java
Прост в изучении
Встроенная поддержка начиная с Android Studio 3.0

6.

+ Лаконичность
Java
Kotlin
Button b = view.findViewById(R.id.btn1);
b.setOnClickListener(new
View.OnClickListener(){
@Override
public void onClick(View view) {
//your action
}
});
val b: Button = findViewById(R.id.btn1)
b.setOnClickListener{
//your action
}
// или вместе с kotlin android
extensions
btn1.setOnClickListener{
//your action
}
Подробнее: https://kotlinlang.org/docs/tutorials/android-plugin.html

7.

+ Data-классы
data class Book(var title: String, var price: Int)
+ equals() и hashCode()
+ toString() в виде “Book(title=Kotlin in Action,
price=1000)”
+ copy()
+ componentN() для удобной деструкторизации класса
val (title, price) = book
Подробнее: https://kotlinlang.org/docs/reference/data-classes.html

8.

+ Extension функции
fun <T : View> Activity.byId(@IdRes id: Int): T = findViewById(id)
// вызов
val btn = byId<Button>(R.id.btn);
Подробнее: https://kotlinlang.org/docs/reference/extensions.html

9.

+ Extension функции
val books = listOf(
Book("Kotlin in Action", 1000),
Book("Programming Kotlin", 1500)
)
books.sortBy { it.price }.forEach{ it.price += 100 }

10.

+ Поддержка в Android Studio
Ctrl+Shift+Alt+K
Подробнее: https://developer.android.com/kotlin/get-started.html

11.

+ Поддержка в Android Studio
public class Book {
private String title;
private Integer price;
public Book(String title, Integer price) {
this.title = title;
this.price = price;
}
private Integer getPriceWithDiscount(Integer discountSize) {
return price - discountSize;
}
public
public
public
public
String getTitle() { return title; }
void setTitle(String title) { this.title = title; }
Integer getPrice() { return price;}
void setPrice(Integer price) { this.price = price }
}
Подробнее: https://developer.android.com/kotlin/get-started.html

12.

+ Поддержка в Android Studio
class Book(var title: String?, var price: Int?) {
private fun getPriceWithDiscount(discountSize: Int?): Int {
return price!! - discountSize!!
}
}
//Но можно и лучше
class Book(var title: String?, var price: Int?) {
private fun getPriceWithDiscount(discountSize: Int?): Int = price!! discountSize!!
}
Подробнее: https://developer.android.com/kotlin/get-started.html

13.

+ Поддержка в Android Studio
● возможность декомпилировать код и посмотреть его в
байт коде или на Java
Menu > Tools > Kotlin > Show Kotlin Bytecode > Decompile
● множество подсказок компилятора
Подробнее: https://developer.android.com/kotlin/get-started.html

14.

Минусы
-
Небольшое число книг, особенно на русском (всего 6)
Увеличение размера apk: к debug apk прибавляется ~ 7,000 методов и
+1 Mb к итоговому размеру
Увеличение времени компиляции (особенно при использовании kapt)

15.

Roo
m

16.

Room
Основные компоненты Room:
● Database
● Entity
● DAO

17.

Room - подключение
Добавьте следующие Gradle зависимости:
compile 'android.arch.persistence.room:runtime:1.0.0'
// при работе с RxJava
compile 'android.arch.persistence.room:rxjava2:1.0.0'
//при использовании Kotlin
kapt 'android.arch.persistence.room:compiler:1.0.0'
//при использовании Java
annotationProcessor 'android.arch.persistence.room:compiler:1.0.0'

18.

Entity
@Entity(tableName = "book")
data class Book(
@PrimaryKey(autoGenerate = true)
var id: Long,
var title: String,
@ColumnInfo(name = "page_count")
var pageCount: Int
)

19.

Entity
Также поддерживаются следующие аннотации:
● @Ignore - поле, с такой аннотацией не сохраняется в БД
● @Embeded - позволяет сохранять в БД вложенные классы
● @ForeignKey - позволяет определить внешний ключ для другой таблицы
в БД

20.

DAO
@Dao
interface BookDao{
@Query("SELECT * FROM book")
fun getAll(): List<Book>
@Insert(onConflict = OnConflictStrategy.REPLACE)
fun insertBook(book: Book)
@Update
fun updateBook(book: Book)
@Delete
fun delete(book: Book)
}

21.

DAO
Простой запрос с параметрами:
@Dao
interface BookDao{
@Query("SELECT * FROM book WHERE page_count == :pageCount")
fun getBookByPageCount(pageCount: Int): List<Book>
}

22.

DAO
java.lang.IllegalStateException
Cannot access database on the main thread
since it may potentially lock the UI for a
long period of time

23.

DAO
Есть встроенная поддержка RxJava и Android LiveData
@Query("SELECT * FROM book WHERE id = :id")
Asynchronous queries
fun getBookById(id: Long): Maybe<Book>
fun getBookById(id: Long): Single<Book>
Observable queries
fun getBookById(id: Long): LiveData<Book>
fun getBookById(id: Long): Flowable<Book>

24.

Database
@Database(entities = arrayOf(Book::class), version = 1)
abstract class App1Database: RoomDatabase(){
abstract fun bookDao(): BookDao
}
val bookDb = Room.databaseBuilder(applicationContext,
App1Database::class.java, "book-database").build()

25.

Миграции
Предположим, вам нужно добавить новое поле в модель класса Book:
@Entity(tableName = "book")
data class Book(
//…
var description:String,
//…
}

26.

Миграции
1) Повысить версию БД
@Database(entities = arrayOf(Book::class), version = 2)
abstract class AppDatabase: RoomDatabase(){
//…
1) Добавить в класс БД статическое поле с нашей миграцией
companion object {
@JvmField
val MIGRATION_1_2 = Migration1To2()
}

27.

Миграции
3) Определить класс миграции, расширяющий класс Migrate
class Migration1To2 : Migration(1,2) {
override fun migrate(database: SupportSQLiteDatabase) {
database.execSQL("ALERT TABLE book" +
"ADD COLUMN description STRING")
}
}
4) Добавить миграцию как параметр в databaseBuilder:
Room.databaseBuilder(applicationContext, App1Database::class.java, "book-database")
.addMigrations(MIGRATION_1_2)
.build()

28.

Итоги
Меньше "boilerplate" кода*
● Проверка запросов к базе данных во время компиляции
● Простые миграции
● Запрет на работу с БД в главном потоке
boilerplate - шаблонный, повторяющийся код

29.

Instant
app

30.

Новый способ поиска приложений
Сейчас:
Поис
к
Установк
а
Использова
ние

31.

Что такое Instant app
Instant app возможность скачать
только нужную Вам
функцию, а не всё
приложение целиком.

32.

Поддержка
Android 5.0 (API level 21) +

33.

Требования
● Android Studio 3 и новее
● Самые новые версии Google Support Library
● Instant Apps Development SDK

34.

Ограничения
Ограниченный набор доступных разрешений
Все запросы из приложения должны идти по https
Приложения проверяются значительно жестче
Если нужна
Подробнее: https://developer.android.com/topic/instant-apps/faqs.html
https://developers.google.com/identity/smartlock-passwords/android/

35.

“Приложение как фича”
Каждый apk: ● это одна activity
● это одно законченное
действие
● не более 4Mb

36.

Использование
Base feature module
Instant app module
apply plugin:
'com.android.feature'
android {
...
baseFeature true
...
}
apply plugin: 'com.android.instantapp'
...
dependencies {
implementation project(':base')
// if there additional features, they go here
implementation project(':feature1')
}

37.

Kotlin
Room
Instan
t app

38.

Пишите [email protected]
English     Русский Правила