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

Содержание

Слайд 2

Kotlin

Instant app

Room

Слайд 4

“Now official”

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

Слайд 5

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

Studio 3.0

Kotlin

Слайд 6

Java
Button b = view.findViewById(R.id.btn1);
b.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View view) {
//your action

}
});

Лаконичность

Kotlin
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 class Book(var title: String, var price: Int)
equals() и hashCode()
toString() в виде “Book(title=Kotlin

in Action, price=1000)”
copy()
componentN() для удобной деструкторизации класса
val (title, price) = book

Data-классы

Подробнее: https://kotlinlang.org/docs/reference/data-classes.html

Слайд 8

fun Activity.byId(@IdRes id: Int): T = findViewById(id)
// вызов
val btn =

byId

Слайд 9

val books = listOf(
Book("Kotlin in Action", 1000),
Book("Programming Kotlin", 1500)
)
books.sortBy { it.price

}.forEach{ it.price += 100 }

Extension функции

Слайд 10

Ctrl+Shift+Alt+K

Поддержка в Android Studio

Подробнее: https://developer.android.com/kotlin/get-started.html

Слайд 11

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 String getTitle() { return title; }
public void setTitle(String title) { this.title = title; }
public Integer getPrice() { return price;}
public void setPrice(Integer price) { this.price = price }
}

Поддержка в Android Studio

Подробнее: https://developer.android.com/kotlin/get-started.html

Слайд 12

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!!
}

Поддержка в Android Studio

Подробнее: https://developer.android.com/kotlin/get-started.html

Слайд 13

возможность декомпилировать код и посмотреть его в байт коде или на Java
Menu

> Tools > Kotlin > Show Kotlin Bytecode > Decompile
множество подсказок компилятора

Поддержка в Android Studio

Подробнее: https://developer.android.com/kotlin/get-started.html

Слайд 14

Небольшое число книг, особенно на русском (всего 6)
Увеличение размера apk: к debug apk

прибавляется ~ 7,000 методов и +1 Mb к итоговому размеру
Увеличение времени компиляции (особенно при использовании kapt)

Минусы

Слайд 16

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

Room

Слайд 17

Добавьте следующие 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'

Room - подключение

Слайд 18

@Entity(tableName = "book")
data class Book(
@PrimaryKey(autoGenerate = true)
var id: Long,
var title:

String,
@ColumnInfo(name = "page_count")
var pageCount: Int
)

Entity

Слайд 19

Также поддерживаются следующие аннотации:
@Ignore - поле, с такой аннотацией не сохраняется в БД
@Embeded

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

Entity

Слайд 20

@Dao
interface BookDao{
@Query("SELECT * FROM book")
fun getAll(): List
@Insert(onConflict = OnConflictStrategy.REPLACE)
fun

insertBook(book: Book)
@Update
fun updateBook(book: Book)
@Delete
fun delete(book: Book)
}

DAO

Слайд 21

Простой запрос с параметрами:
@Dao
interface BookDao{
@Query("SELECT * FROM book WHERE page_count == :pageCount")

fun getBookByPageCount(pageCount: Int): List
}

DAO

Слайд 22

java.lang.IllegalStateException
Cannot access database on the main thread
since it may potentially lock

the UI for a
long period of time

DAO

Слайд 23

Есть встроенная поддержка RxJava и Android LiveData
@Query("SELECT * FROM book WHERE id =

:id")
Asynchronous queries
fun getBookById(id: Long): Maybe
fun getBookById(id: Long): Single
Observable queries
fun getBookById(id: Long): LiveData
fun getBookById(id: Long): Flowable

DAO

Слайд 24

@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()

Database

Слайд 25

Предположим, вам нужно добавить новое поле в модель класса Book:
@Entity(tableName = "book")
data

class Book(
//…
var description:String,
//…
}

Миграции

Слайд 26

Повысить версию БД
@Database(entities = arrayOf(Book::class), version = 2)
abstract class AppDatabase: RoomDatabase(){
//…
Добавить в класс

БД статическое поле с нашей миграцией
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
apply plugin: 'com.android.feature'
android {
...
baseFeature true
...
}

Instant app

module
apply plugin: 'com.android.instantapp'
...
dependencies {
implementation project(':base')
// if there additional features, they go here
implementation project(':feature1')
}

Слайд 37

Kotlin

Instant app

Room

Имя файла: Разработка-современных-мобильных-приложений-под-Android.pptx
Количество просмотров: 159
Количество скачиваний: 0