Slide 1

Slide 1 text

Jetpack࠷৽৘ใ & Android Architecture Components ͋Μ͍͟Ώ͖ʢyanzmʣ ࡳຈAndroidษڧձ sapporo.apk #2

Slide 2

Slide 2 text

͋Μ͍͟Ώ͖ • blog : Y.A.M ͷࡶهா • y-anz-m.blogspot.com • twitter : @yanzm ʢ΍Μ͟Ήʣ • uPhyca Inc. (גࣜձࣾ΢ϑΟΧ) • Google Developers Expert for Android

Slide 3

Slide 3 text

AndroidX

Slide 4

Slide 4 text

Support Library → AndroidX • Support Library ͸ 28.0.0 Ͱऴྃ • package ͱ artifact ͕ AndroidX ʹมΘΔ • "com.android.support:appcompat-v7:28.0.0" → "androidx.appcompat:appcompat:1.0.0" • 2018/9/21 AndroidX 1.0.0 ϦϦʔε

Slide 5

Slide 5 text

How to move • compileSdkVersion 28 Ҏ্ʹ͢Δ • Support Library Λ 28.0.0 ʹ͢Δ • ରԠද : https:// developer.android.com/jetpack/ androidx/migrate • [Refactor] - [Refactor to AndroidX…]

Slide 6

Slide 6 text

Jetpack

Slide 7

Slide 7 text

Jetpack • ͙͢Εͨ Android ΞϓϦΛ࡞ΔͨΊͷίϯϙʔωϯτɾ πʔϧɾΨΠμϯεͷηοτ • https://android-developers.googleblog.com/2018/05/ use-android-jetpack-to-accelerate-your.html • ࢖͏࢖Θͳ͍͸ࣗ༝ • ࢖͍͍ͨ΋ͷ͚ͩ࢖͑͹Α͍

Slide 8

Slide 8 text

https://developer.android.com/jetpack/

Slide 9

Slide 9 text

Foundation

Slide 10

Slide 10 text

https://developer.android.com/jetpack/ ԼҐޓ׵ੑɺςετɺKotlinݴޠαϙʔτͳͲ

Slide 11

Slide 11 text

https://developer.android.com/topic/libraries/support-library/packages#v7-appcompat ԼҐޓ׵ੑɺςετɺKotlinݴޠαϙʔτͳͲ AppCompat ActionBar ΍ Material Design ͷςʔϚΛݹ͍OS ؚΊ࣮ͯݱ͢ΔͨΊͷϥΠϒϥϦ ࢖༻ස౓: ࠷ߴ "androidx.appcompat:appcompat:1.0.2"

Slide 12

Slide 12 text

https://developer.android.com/kotlin/ktx ԼҐޓ׵ੑɺςετɺKotlinݴޠαϙʔτͳͲ Android KTX Android ϑϨʔϜϫʔΫͷ API ΍ Support Library ͷ API ΛΑΓ؆ܿʹهड़Ͱ͖ΔΑ͏ʹ͢Δ Kotlin extension function ू ࢖༻ස౓: Kotlin Λ࢖͍ͬͯΔͳΒதʙߴ "androidx.core:core-ktx:1.0.1" view.viewTreeObserver.addOnPreDrawListener( object : ViewTreeObserver.OnPreDrawListener { override fun onPreDraw(): Boolean { viewTreeObserver.removeOnPreDrawListener(this) actionToBeTriggered() return true } } ) view.doOnPreDraw { actionToBeTriggered() }

Slide 13

Slide 13 text

https://developer.android.com/studio/build/multidex ԼҐޓ׵ੑɺςετɺKotlinݴޠαϙʔτͳͲ Multidex ΞϓϦͱϥΠϒϥϦͷϝιου਺ͷ߹ܭ͕ 65536 Λ௒͑Δͱ ୯Ұͷ Dalvik Executable (DEX) bytecode fi le ʹͰ͖ͳ͘ ͳΔͨΊɺmultidex ઃఆ͕ඞཁʹͳΔ ࢖༻ස౓: ௿ʙத

Slide 14

Slide 14 text

https://developer.android.com/training/testing/ ԼҐޓ׵ੑɺςετɺKotlinݴޠαϙʔτͳͲ Test Unit ςετ͓Αͼ Instrumentation ςετΛߦ͏ͨΊͷ ϥΠϒϥϦͱΨΠμϯε ࢖༻ස౓: ߴ androidx.test:core:1.0.0 androidx.test:runner:1.1.0 androidx.test:rules:1.1.0 androidx.test.ext:junit:1.0.0 androidx.test.ext:truth:1.0.0 androidx.test.espresso:espresso-core:3.1.0 …

Slide 15

Slide 15 text

UI

Slide 16

Slide 16 text

https://developer.android.com/jetpack/ UI ؔ܎ͷ΢ΟδΣοτ΍ϔϧύʔ

Slide 17

Slide 17 text

https://developer.android.com/jetpack/ UI ؔ܎ͷ΢ΟδΣοτ΍ϔϧύʔ Auto, TV, Wear OS by Google Android Auto Android TV Wear OS ؔ࿈ͷΨΠμϯε ࢖༻ස౓: ௿

Slide 18

Slide 18 text

https://developer.android.com/training/animation/ UI ؔ܎ͷ΢ΟδΣοτ΍ϔϧύʔ Animation & transitions ΞχϝʔγϣϯશൠͷΨΠμϯεͱϥΠϒϥϦ ࢖༻ස౓: தʙߴ "androidx.transition:transition:1.0.0" "androidx.dynamicanimation:dynamicanimation:1.0.0" "androidx.vectordrawable:vectordrawable-animated:1.0.0"

Slide 19

Slide 19 text

https://developer.android.com/guide/topics/ui/look-and-feel/emoji-compat UI ؔ܎ͷ΢ΟδΣοτ΍ϔϧύʔ Emoji ݹ͍σόΠεɾOSͰֆจࣈΛදࣔ͢ΔͨΊͷϥΠϒϥϦ ࢖༻ස౓: ௿ʙத "androidx.emoji:emoji-appcompat:1.0.0" "androidx.emoji:emoji-bundled:1.0.0" "androidx.emoji:emoji:1.0.0"

Slide 20

Slide 20 text

https://developer.android.com/guide/components/fragments UI ؔ܎ͷ΢ΟδΣοτ΍ϔϧύʔ Fragment ϥΠϑαΠΫϧΛ࣋ͪɺ૊Έ߹ΘͤΔ͜ͱ͕Ͱ͖ΔUIͷ جૅ୯Ґ ࢖༻ස౓: ߴ "androidx.fragment:fragment:1.0.0"

Slide 21

Slide 21 text

https://developer.android.com/guide/topics/ui/declaring-layout UI ؔ܎ͷ΢ΟδΣοτ΍ϔϧύʔ Layout ϨΠΞ΢τʹؔ͢ΔΨΠμϯεͱϥΠϒϥϦ ࢖༻ස౓: ߴ LinearLayout FrameLayout ConstraintLayout CoordinatorLayout "androidx.constraintlayout:constraintlayout:1.1.2" "androidx.coordinatorlayout:coordinatorlayout:1.0.0"

Slide 22

Slide 22 text

https://developer.android.com/training/material/palette-colors UI ؔ܎ͷ΢ΟδΣοτ΍ϔϧύʔ Palette ը૾͔Β৭৘ใΛൈ͖ग़͢ϥΠϒϥϦ ࢖༻ස౓: ௿ʙத "androidx.palette:palette:1.0.0"

Slide 23

Slide 23 text

Behavior

Slide 24

Slide 24 text

https://developer.android.com/jetpack/ Androidͷඪ४తͳػೳΛ ΞϓϦʹ૊ΈࠐΉͨΊͷ ΨΠμϯε

Slide 25

Slide 25 text

https://developer.android.com/reference/android/app/DownloadManager Androidͷඪ४తͳػೳΛ ΞϓϦʹ૊ΈࠐΉͨΊͷ ΨΠμϯε Download manager େ͖ͳϑΝΠϧΛ HTTP ܦ༝Ͱμ΢ϯϩʔυ͢ΔͨΊͷػೳ ʹ͍ͭͯͷΨΠμϯε ࢖༻ස౓: ௿ʙத

Slide 26

Slide 26 text

https://developer.android.com/guide/topics/media-apps/media-apps-overview Androidͷඪ४తͳػೳΛ ΞϓϦʹ૊ΈࠐΉͨΊͷ ΨΠμϯε Media & playback ϝσΟΞʢԻ੠ɾಈըʣΛ࠶ੜ͢ΔػೳΛ࣮૷͢ΔͨΊͷ ΨΠμϯε ࢖༻ස౓: ௿ʙத "androidx.media:media:1.0.0" "androidx.mediarouter:mediarouter:1.0.0"

Slide 27

Slide 27 text

https://developer.android.com/guide/topics/ui/noti fi ers/noti fi cations Androidͷඪ४తͳػೳΛ ΞϓϦʹ૊ΈࠐΉͨΊͷ ΨΠμϯε Noti fi cations ௨஌Λ࣮૷͢ΔͨΊͷΨΠμϯε ޙํޓ׵ੑͷ͋ΔAPI (Noti fi cationCompat ͳͲ) ͕༻ҙ ͞Ε͍ͯΔ ࢖༻ස౓: ߴ "androidx.core:core:1.0.0"

Slide 28

Slide 28 text

https://developer.android.com/guide/topics/permissions/overview Androidͷඪ४తͳػೳΛ ΞϓϦʹ૊ΈࠐΉͨΊͷ ΨΠμϯε Permissions Runtime Permissions Λ࣮૷͢ΔͨΊͷΨΠμϯε ࢖༻ස౓: தʙߴ

Slide 29

Slide 29 text

https://developer.android.com/guide/topics/ui/settings/ Androidͷඪ४తͳػೳΛ ΞϓϦʹ૊ΈࠐΉͨΊͷ ΨΠμϯε Preferences ઃఆը໘ߏ੒༻ͷϥΠϒϥϦ ࢖༻ස౓: த "androidx.preference:preference:1.0.0"

Slide 30

Slide 30 text

https://developer.android.com/training/sharing/shareaction Androidͷඪ४తͳػೳΛ ΞϓϦʹ૊ΈࠐΉͨΊͷ ΨΠμϯε Sharing σʔλΛ share ͢ΔػೳΛ࣮૷͢ΔͨΊͷΨΠμϯε ࢖༻ස౓: த

Slide 31

Slide 31 text

https://developer.android.com/guide/slices/ Androidͷඪ४తͳػೳΛ ΞϓϦʹ૊ΈࠐΉͨΊͷ ΨΠμϯε Slices ΞϓϦͷσʔλΛΞϓϦ֎ʢݕࡧ݁ՌͳͲʣʹදࣔ͢Δ࢓૊Έ ࢖༻ස౓: ௿ʙத “androidx.slice:slice-builders:1.0.0"

Slide 32

Slide 32 text

Architecture

Slide 33

Slide 33 text

https://developer.android.com/topic/libraries/architecture/ Architecture components ݎ࿚Ͱɺςετ͠΍͘͢ɺ อक͠΍͍͢ΞϓϦΛ࡞ΔͷΛ ॿ͚ΔϥΠϒϥϦू

Slide 34

Slide 34 text

https://developer.android.com/topic/libraries/data-binding/ Architecture components Data Binding มߋΛݕ஌Ͱ͖ΔσʔλΛ UI ͷཁૉʹએݴతʹ bind ͢Δ ϥΠϒϥϦ ࢖༻ස౓: தʢ࢖͍͚ͨΕ͹ʣ android { ... dataBinding { enabled = true } }

Slide 35

Slide 35 text

https://developer.android.com/topic/libraries/architecture/lifecycle Architecture components Lifecycles Activity ΍ Fragment ͷϥΠϑαΠΫϧͷมԽʹԠͨ͡ ॲཧΛ؆୯ʹߦ͑ΔΑ͏ʹ͢ΔϥΠϒϥϦ LiveData Λ࢖͏৔߹ Lifecycles ΋΄΅࢖͏ ࢖༻ස౓: ߴ // Lifecycles only "androidx.lifecycle:lifecycle-runtime:2.0.0" "androidx.lifecycle:lifecycle-compiler:2.0.0"

Slide 36

Slide 36 text

https://developer.android.com/topic/libraries/architecture/livedata Architecture components LiveData Φϒβʔόʔ͕มߋΛݕ஌Ͱ͖ΔσʔλϗϧμʔΛ ఏڙ͢ΔϥΠϒϥϦ ϥΠϑαΠΫϧʹԠͯ͡ɺActivity ΍ Fragment ͕ active lifecycle state ͷͱ͖͚ͩ௨஌͢Δͱ͍͏͜ͱ͕ Մೳ ࢖༻ස౓: ߴ // just LiveData "androidx.lifecycle:lifecycle-viewmodel:2.0.0" "androidx.lifecycle:lifecycle-compiler:2.0.0"

Slide 37

Slide 37 text

https://developer.android.com/topic/libraries/architecture/navigation/ Architecture components Navigation ΞϓϦ಺Ͱͷը໘ભҠΛॲཧ͢ΔͨΊͷϥΠϒϥϦ AndroidX ൛͸·ͩϦϦʔε͞Ε͍ͯͳ͍ ࠷৽͸ 1.0.0-alpha08 ࢖༻ස౓: ෆ໌

Slide 38

Slide 38 text

https://developer.android.com/topic/libraries/architecture/paging/ Architecture components Paging σʔλιʔε͔ΒҰఆͷ͔ͨ·Γ͝ͱʹσʔλΛϩʔυ ͯ͘͠ΔͨΊͷϥΠϒϥϦ RecyclerView ޲͚ Room ͱͷ૬ੑ͕Α͍ ࢖༻ස౓: த "androidx.paging:paging-runtime:2.1.0-rc01"

Slide 39

Slide 39 text

https://developer.android.com/topic/libraries/architecture/room Architecture components Room SQLite σʔλϕʔεʹΑΓݎ࿚ʹΞΫηε͢ΔͨΊͷ ػೳΛఏڙ͢ΔϥΠϒϥϦ ΦϒδΣΫτ΁ͷϚοϐϯά SQLจͷ੩తղੳ ͳͲ ࢖༻ස౓: த "androidx.room:room-runtime:2.0.0" "androidx.room:room-compiler:2.0.0"

Slide 40

Slide 40 text

https://developer.android.com/topic/libraries/architecture/viewmodel Architecture components ViewModel Activity ͷ࠶ੜ੒Λ௒͑ͯσʔλΛอ࣋͢ΔͨΊͷ ϥΠϒϥϦ ࢖༻ස౓: ߴ // ViewModel and LiveData "androidx.lifecycle:lifecycle-extensions:2.0.0" // just ViewModel "androidx.lifecycle:lifecycle-viewmodel:2.0.0" "androidx.lifecycle:lifecycle-compiler:2.0.0"

Slide 41

Slide 41 text

https://developer.android.com/topic/libraries/architecture/workmanager/ Architecture components WorkManager ಛఆͷ৚݅΍λΠϛϯάͰλεΫΛόοΫάϥ΢ϯυͰ ࣮ߦ͢ΔͨΊͷϥΠϒϥϦ AndroidX ൛͸·ͩϦϦʔε͞Ε͍ͯͳ͍ ࠷৽͸ 1.0.0-alpha12 ಺෦Ͱ JobScheduler, AlarmManager Λ࢖༻͍ͯ͠Δ ࢖༻ස౓: ߴ

Slide 42

Slide 42 text

Lifecycles, LiveData ViewModel Λ࢖͓͏ʂ

Slide 43

Slide 43 text

ྫʣGithub ͔Β google organization ͷϦϙδτϦҰཡΛऔಘͯ͠ RecyclerView ʹදࣔ͢Δ class MainActivity : AppCompatActivity() { private val service = createGitHubService(username, token) private val adapter = Adapter() override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) recyclerView.adapter = adapter retryButton.setOnClickListener { load() } load() } private fun load() { progressBar.visibility = View.VISIBLE retryButton.visibility = View.GONE service.reposOf("google").enqueue(object : Callback> { override fun onResponse(call: Call>, response: Response>) { progressBar.visibility = View.GONE if (response.isSuccessful) { adapter.submitList(response.body()!!) } else { retryButton.visibility = View.VISIBLE } } override fun onFailure(call: Call>, t: Throwable) { progressBar.visibility = View.GONE retryButton.visibility = View.VISIBLE } }) }

Slide 44

Slide 44 text

໰୊఺ - con fi guration ͷมߋʢը໘ճసɺը໘αΠζͷมߋͳͲʣʹΑΔ Activity ͷ࠶ੜ ੒࣌ʹ࠶౓ಡΈࠐΈॲཧ͕૸ͬͯ͠·͏

Slide 45

Slide 45 text

໰୊఺ - con fi guration ͷมߋʢը໘ճసɺը໘αΠζͷมߋͳͲʣʹΑΔ Activity ͷ࠶ੜ ੒࣌ʹ࠶౓ಡΈࠐΈॲཧ͕૸ͬͯ͠·͏ → ViewModel Λ࢖͏

Slide 46

Slide 46 text

ViewModel ViewModelProviders.of(activity).get(VM::class.java)

Slide 47

Slide 47 text

ViewModel + LiveData https://www.youtube.com/watch?v=2rO4r-JOQtA liveData.observe(lifecycleOwner, observer)

Slide 48

Slide 48 text

ྫʣViewModel & LiveData Λ࢖͏ class MainViewModel : ViewModel() { private val service = createGitHubService(username, token) data class Status(val isLoading: Boolean, val data: List?, val throwable: Throwable?) private val _status = MutableLiveData() val status: LiveData = _status init { load() } fun load() { _status.value = Status(true, null, null) service.reposOf("google").enqueue(object : Callback> { override fun onResponse(call: Call>, response: Response>) { _status.value = if (response.isSuccessful) { Status(false, response.body()!!, null) } else { Status(false, null, IllegalStateException()) } } override fun onFailure(call: Call>, t: Throwable) { _status.value = Status(false, null, t) } }) } }

Slide 49

Slide 49 text

ྫʣViewModel & LiveData Λ࢖͏ class MainActivity : AppCompatActivity() { private val adapter = Adapter() override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) recyclerView.adapter = adapter val viewModel = ViewModelProviders.of(this).get(MainViewModel::class.java) retryButton.setOnClickListener { viewModel.load() } viewModel.status.observe(this, Observer { val (isLoading, data, _) = it if (isLoading) { progressBar.visibility = View.VISIBLE retryButton.visibility = View.GONE } else { progressBar.visibility = View.GONE if (data != null) { adapter.submitList(data) } else { retryButton.visibility = View.VISIBLE } } }) } }

Slide 50

Slide 50 text

androidx.activity:activity:1.0.0-alpha02 ͳΒ class MainActivity : AppCompatActivity() { private val adapter = Adapter() private val viewModel: MainViewModel by viewModels() override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) recyclerView.adapter = adapter retryButton.setOnClickListener { viewModel.load() } viewModel.status.observe(this, Observer { when (it) { Status.Loading -> { progressBar.visibility = View.VISIBLE retryButton.visibility = View.GONE } is Status.Success -> { progressBar.visibility = View.GONE adapter.submitList(it.data) } is Status.Error -> { progressBar.visibility = View.GONE retryButton.visibility = View.VISIBLE } } }) } }

Slide 51

Slide 51 text

໰୊఺ - Status Ͱ data ΋ throwable ΋྆ํ null ͱ͍͏͋Γ͑ͳ͍ঢ়ଶΛ࡞Εͯ͠·͏ data class Status( val isLoading: Boolean, val data: List?, val throwable: Throwable? )

Slide 52

Slide 52 text

໰୊఺ - Status Ͱ data ΋ throwable ΋྆ํ null ͱ͍͏͋Γ͑ͳ͍ঢ়ଶΛ࡞Εͯ͠·͏ → Kotlin ͷ sealed class Λ࢖͏ https://kotlinlang.org/docs/reference/sealed-classes.html sealed class ͸ΫϥεܧঝઌΛ੍ݶͰ͖Δ sealed class Expr { data class Const(val number: Double) : Expr() data class Sum(val e1: Expr, val e2: Expr) : Expr() object NotANumber : Expr() } Expr ܕͷΠϯελϯεͷ࣮ମ͸ Const, Sum NotANumber ͷͲΕ͔ when (expr) { is Expr.Const -> TODO() is Expr.Sum -> TODO() Expr.NotANumber -> TODO() }

Slide 53

Slide 53 text

໰୊఺ - Status Ͱ data ΋ throwable ΋྆ํ null ͱ͍͏͋Γ͑ͳ͍ঢ়ଶΛ࡞Εͯ͠·͏ sealed class Status { object Loading : Status() data class Success(val data: T) : Status() data class Error(val throwable: Throwable) : Status() } → Kotlin ͷ sealed class Λ࢖͏ data class Status( val isLoading: Boolean, val data: List?, val throwable: Throwable? )

Slide 54

Slide 54 text

class MainViewModel : ViewModel() { private val service = createGitHubService(username, token) private val _status = MutableLiveData>>() val status: LiveData>> = _status init { load() } fun load() { _status.value = Status.Loading service.reposOf("google").enqueue(object : Callback> { override fun onResponse(call: Call>, response: Response>) { _status.value = if (response.isSuccessful) { Status.Success(response.body()!!) } else { Status.Error(IllegalStateException()) } } override fun onFailure(call: Call>, t: Throwable) { _status.value = Status.Error(t) } }) } } ྫʣViewModel & LiveData & sealed class Λ࢖͏

Slide 55

Slide 55 text

class MainActivity : AppCompatActivity() { private val adapter = Adapter() override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) recyclerView.adapter = adapter val viewModel = ViewModelProviders.of(this).get(MainViewModel::class.java) retryButton.setOnClickListener { viewModel.load() } viewModel.status.observe(this, Observer { when (it) { Status.Loading -> { progressBar.visibility = View.VISIBLE retryButton.visibility = View.GONE } is Status.Success -> { progressBar.visibility = View.GONE adapter.submitList(it.data) } is Status.Error -> { progressBar.visibility = View.GONE retryButton.visibility = View.VISIBLE } } }) } } ྫʣViewModel & LiveData & sealed class Λ࢖͏

Slide 56

Slide 56 text

͓·͚

Slide 57

Slide 57 text

What’s new Jetpack https://developer.android.com/jetpack/androidx/androidx-rn

Slide 58

Slide 58 text

AndroidX ͷόʔδϣχϯά • major version ͸ binary compatibility Λࢦ͢ • 1.5.0 revision ΁ͷґଘ͸ 1.7.0 ʹରͯ͠΋ಈ࡞͢Δt ͕ɺ2.0.0 ʹରͯ͠͸ಈ͔ͳ͍Մೳੑ͕͋Δ

Slide 59

Slide 59 text

androidx.activity:activity:1.0.0-alpha02 Activity ࠷৽ : 2018/12/3 Stable ͳ͠ FragmentActivity, AppCompatActivity ͷϕʔεΫϥεͱͯ͠ ComponentActivity ͕௥ Ճ͞Εͨ - OnBackPressedCallback Λ addOnBackPressedCallback() Ͱొ࿥͢Δ͜ͱͰ onBackPressed() Λ override ͤͣʹ intercept Ͱ͖Δ - ComponentActivity ͔Β ViewModel Λऔಘ͢ΔͨΊͷ by viewModels() Kotlin property delegate - ΫϦοΫͳͲͷ pending input events ͸ onStop() ͰΩϟϯηϧ͞ΕΔ - onRetainCustomNonCon fi gurationInstance ͸ deprecated ʹͳΓɺ୅ΘΓʹ ViewModel Λར༻͢Δ class MainActivity : AppCompatActivity() { private val viewModel : MainViewModel by viewModels()

Slide 60

Slide 60 text

androidx.appcompat:appcompat:1.1.0-alpha01 Appcompat ࠷৽ : 2018/12/3 Stable : 2018/11/7 androidx.appcompat:appcompat:1.0.2 1.1.0-alpha01 - app:drawableLeftCompat, app:drawableRightCompat, app:drawableTopCompat, app:drawableBottomCompat, app:drawableStartCompat, app:drawableEndCompat ͕௥Ճ͞ΕɺVectorDrawableCompat ΛࢦఆՄೳ

Slide 61

Slide 61 text

androidx.collection:collection:1.1.0-alpha01 Collection ࠷৽ : 2018/12/3 Stable : 2018/9/21 androidx.collection:collection:1.0.0 1.1.0-alpha01 - LongSparseArray, SimpleArrayMap, SparseArrayCompat ʹ putIfAbsent() ͕௥Ճ - SimpleArrayMap ʹ getOrDefault() ͕௥Ճ - LongSparseArray, SimpleArrayMap, SparseArrayCompat ʹҾ਺͕2ͭͷ remove() ͕௥Ճ - LongSparseArray, SimpleArrayMap, SparseArrayCompat ʹҾ਺͕2ͭͷ replace() ͱҾ਺͕3ͭͷ replace() ͕௥Ճ val map = SimpleArrayMap() map.putIfAbsent("Pie", 28) map.remove("Pie", 27) map.replace("Pie", 28) map.replace("Pie", 27, 28)

Slide 62

Slide 62 text

androidx.coordinatorlayout:coordinatorlayout:1.1.0-alpha01 CoordinatorLayout ࠷৽ : 2018/12/3 Stable : 2018/9/21 androidx.coordinatorlayout:coordinatorlayout:1.0.0 1.1.0-alpha01 - CoordinatorLayout ͕ NestedScrollingParent3 Λ࣮૷

Slide 63

Slide 63 text

androidx.core:core:1.1.0-alpha02 Core ࠷৽ : ? Stable : 2018/11/7 androidx.core:core:1.0.1 1.1.0-alpha01 - NestedScrollingChild3, NestedScrollingParent3 ؔ࿈ - ShortcutInfoCompat ʹ Persons, categories, isLongLived ϑΟʔϧυ͕௥Ճ͞Εͨ - SupportActivity ͕ ComponentActivity ʹϦωʔϜ - getMainExecutor() ϝιου͕௥Ճ͞Εͨ - Accessibility ؔ࿈ - ͳͲ

Slide 64

Slide 64 text

androidx.fragment:fragment:1.1.0-alpha02 Fragment ࠷৽ : 2018/12/3 Stable : 2018/9/21 androidx.fragment:fragment:1.0.0 1.1.0-alpha01 fragment-testing ͕௥Ճ͞Εͨ - ςετ༻ͷ FragmentScenario Ϋϥε͕௥Ճ͞Εͨʢfragment-testingʣ - FragmentManager ʹ FragmentFactory Ληοτ͢Δ͜ͱͰ Fragment Πϯελϯε ੜ੒ॲཧΛίϯτϩʔϧͰ͖Δ - Fragment ͔Β ViewModel Λऔಘ͢ΔͨΊͷ by viewModels() Kotlin property delegate - ΫϦοΫͳͲͷ pending input events ͸ onStop() ͰΩϟϯηϧ͞ΕΔ androidx.fragment:fragment-testing:1.1.0-alpha02 class MainFragment : Fragment() { private val viewModel : MainViewModel by viewModels()

Slide 65

Slide 65 text

androidx.loader:loader:1.1.0-alpha01 Loader ࠷৽ : 2018/12/3 Stable : 2018/9/21 androidx.loader:loader:1.0.0 1.1.0-alpha01 - AsyncTaskLoader ʹ getExecutor() ͕௥Ճ - AsyncTaskLoader ͷσϑΥϧτͷ Executor ͕ AsyncTask.THREAD_POOL_EXECUTOR ʹมߋ

Slide 66

Slide 66 text

androidx.media:media:1.1.0-alpha01 Media ࠷৽ : 2018/12/3 Stable : 2018/9/21 androidx.media:media:1.0.0 1.1.0-alpha01 - MediaSessionCompat ͷ FLAG_HANDLES_MEDIA_BUTTONS ͱ FLAG_HANDLES_TRANSPORT_CONTROLS ϑϥά͕ deprecated ʹ

Slide 67

Slide 67 text

androidx.mediarouter:mediarouter:1.1.0-alpha01 MediaRouter ࠷৽ : 2018/12/3 Stable : 2018/9/21 androidx.mediarouter:mediarouter:1.0.0 1.1.0-alpha01 - dynamic group routes ͷαϙʔτ͕௥Ճ - MediaRouteProviders Ͱ dynamic group routes Λαϙʔτ͢Δ API ͕௥Ճ - route બ୒ͱίϯτϩʔϧμΠΞϩάʹ dynamic group routes ͷͨΊͷ৽͍͠ UX ͕௥Ճ

Slide 68

Slide 68 text

androidx.preference:preference:1.1.0-alpha01 Preference ࠷৽ : 2018/11/5 Stable : 2018/9/21 androidx.preference:preference:1.0.0 1.1.0-alpha01 - Preference ஋͕ߋ৽͞Εͨͱ͖ʹ Summary Λߋ৽͢ΔͨΊͷ SummaryProvider ͕ ௥Ճ͞Εͨ - ListPreference ͱ EditTextPreference ޲͚ʹ default ͷ SummaryProvider ͕༻ҙ͞ Εɺapp:useSimpleSummaryProvider=”true” ͰࢦఆͰ͖Δ - PreferenceGroup. removePreferenceRecursively()

Slide 69

Slide 69 text

androidx.recyclerview:recyclerview:1.1.0-alpha01 RecyclerView ࠷৽ : 2018/12/3 Stable : 2018/9/21 androidx.recyclerview:recyclerview:1.0.0 1.1.0-alpha01 - RecyclerView ͕ NestedScrollingChild3 Λ࣮૷ androidx.recyclerview:recyclerview-selection:1.1.0-alpha01 ࠷৽ : 2018/12/3 Stable : 2018/9/21 androidx.recyclerview:recyclerview-selection:1.0.0

Slide 70

Slide 70 text

androidx.remotecallback:remotecallback:1.0.0-alpha01 Remote Callback ࠷৽ : 2018/12/3 Stable ͳ͠ PendingIntents ͷੜ੒ͱड৴Λ؆୯ʹ͢Δ͜ͱΛ໨తͱͨ͠৽͍͠ϥΠϒϥϦ public class MyReceiver : BroadcastReceiverWithCallbacks() { fun getPendingIntent(context: Context, value1: Int, value2: Int): PendingIntent { return createRemoteCallback(context) .doMyAction(value1, value2) .toPendingIntent() } @RemoteCallable fun doMyAction(value1: Int, value2: Int): RemoteCallback { // ... return RemoteCallback.LOCAL } }

Slide 71

Slide 71 text

androidx.swiperefreshlayout:swiperefreshlayout:1.1.0-alpha01 Swipe Refresh Layout ࠷৽ : 2018/12/3 Stable : 2018/9/21 androidx.swiperefreshlayout:swiperefreshlayout:1.0.0 1.1.0-alpha01 - SwipeRefreshLayout ͕ NestedScrollingChild3 Λ࣮૷

Slide 72

Slide 72 text

androidx.textclassifier:textclassifier:1.0.0-alpha01 Text Classi fi er ࠷৽ : 2018/12/3 Stable ͳ͠ android.view.textclassi fi er.TextClassi fi er ͷόοΫϙʔτ

Slide 73

Slide 73 text

androidx.transition:transition:1.1.0-alpha01 Transition ࠷৽ : 2018/12/3 Stable : ? androidx.transition:transition:1.0.1 1.1.0-alpha01 - Scene.getCurrentScene(View) ͕ public ʹͳͬͨ

Slide 74

Slide 74 text

androidx.vectordrawable:vectordrawable:1.1.0-alpha01 Vector Drawable ࠷৽ : 2018/12/3 Stable : ? androidx.vectordrawable:vectordrawable:1.0.1 1.1.0-alpha01 - Theme ͷଐੑͰఆٛͨ͠ ColorStateLists Λ VectorDrawableCompat ͷ tint ʹར༻Ͱ ͖ΔΑ͏ʹͳͬͨ

Slide 75

Slide 75 text

androidx.versionedparcelable:versionedparcelable:1.1.0-alpha01 Versioned Parcelable ࠷৽ : 2018/11/5 Stable : 2018/9/21 androidx.versionedparcelable:versionedparcelable:1.0.0 1.1.0-alpha01 - VersionedParcelStream Λআ͘શͯͷΫϥεͷ CharSequence ͷαϙʔτ͕௥Ճ͞ Εͨ - SuperClass, Set, and Map ͷαϙʔτ͕௥Ճ͞Εͨ

Slide 76

Slide 76 text

Architecture Components https://developer.android.com/jetpack/docs/release-notes

Slide 77

Slide 77 text

androidx.lifecycle:lifecycle-extensions:2.0.0 androidx.lifecycle:lifecycle-viewmodel:2.0.0 androidx.lifecycle:lifecycle-viewmodel-ktx:2.0.0 androidx.lifecycle:lifecycle-livedata:2.0.0 androidx.lifecycle:lifecycle-runtime:2.0.0 androidx.lifecycle:lifecycle-compiler:2.0.0 androidx.lifecycle:lifecycle-common-java8:2.0.0 androidx.lifecycle:lifecycle-reactivestreams:2.0.0 androidx.lifecycle:lifecycle-reactivestreams-ktx:2.0.0 Lifecycles, LiveData, ViewModel ࠷৽ : 2018/9/21 Stable

Slide 78

Slide 78 text

android.arch.navigation:navigation-fragment:1.0.0-alpha08 Navigation ࠷৽ : 2018/12/6 Stable ͳ͠ android.arch.navigation:navigation-ui:1.0.0-alpha08 android.arch.navigation:navigation-fragment-ktx:1.0.0-alpha08 android.arch.navigation:navigation-ui-ktx:1.0.0-alpha08

Slide 79

Slide 79 text

androidx.paging:paging-runtime:2.1.0-rc01 Paging ࠷৽ : 2018/12/6 Stable : 2018/10/1 androidx.paging:paging-runtime:2.0.0 2.1.0-alpha01 - KTX extension libraries ͕௥Ճ - Page dropping ػೳ͕௥Ճ - PagedListAdapter/AsyncPagedListDiffer ʹ differ ॲཧ͕ऴΘͬͯ paged list Λߋ৽͢ ΔλΠϛϯάͰ௨஌͕͘Δ callback Λ౉ͤΔ submitList() ͕௥Ճ - ͳͲ androidx.paging:paging-rxjava2:2.1.0-rc01 androidx.paging:paging-runtime-ktx:2.1.0-rc01 androidx.paging:paging-rxjava2-ktx:2.1.0-rc01 androidx.paging:paging-rxjava2:2.0.0

Slide 80

Slide 80 text

androidx.room:room-runtime:2.1.0-alpha03 Room ࠷৽ : 2018/12/4 Stable : 2018/10/1 androidx.room:room:2.0.0 2.1.0 - androidx.room:room-coroutines ϥΠϒϥϦͷ௥Ճ - FTSʢFull Text Searchʣ - VIEWs - Multi-Instance Invalidation - AutoValue - RxRoom

Slide 81

Slide 81 text

android.arch.work:work-runtime:1.0.0-alpha12 WorkManager ࠷৽ : 2018/12/5 Stable ͳ͠ 1.0.0-alpha12 - android.arch.work:work-rxjava2 ͕௥Ճ - Firebase ͷ JobDispatcher ͕ഇࢭ༧ఆͷͨΊར༻͞Εͳ͘ͳͬͨɻকདྷతʹ୅ସख ஈ͕௥Ճ͞ΕΔ༧ఆ - Worker ͷ output Λ Result ͱͯ͠ઃఆ͢ΔΑ͏ʹมߋ - ͳͲ 1.0.0-alpha11 - android.arch.work:work-runtime-ktx Ͱ CoroutineWorker ͕௥Ճ - ͳͲ android.arch.work:work-rxjava2:1.0.0-alpha12 android.arch.work:work-runtime-ktx:1.0.0-alpha12

Slide 82

Slide 82 text

AndroidX Test https://developer.android.com/training/testing/release-notes

Slide 83

Slide 83 text

androidx.test:core:1.1.0-beta01 Core ࠷৽ : ? 2018/11/28Ҏ߱ Stable : 2018/10/24 androidx.test:core:1.0.0

Slide 84

Slide 84 text

androidx.test:runner:1.1.1-beta01 AndroidJUnitRunner and JUnit Rules ࠷৽ : ? 2018/11/28Ҏ߱ Stable : 2018/10/24 androidx.test:runner:1.1.0 androidx.test:rules:1.1.1-beta01 androidx.test:rules:1.1.0

Slide 85

Slide 85 text

androidx.test.ext:truth:1.1.0-beta01 Assertions ࠷৽ : ? 2018/11/28Ҏ߱ Stable : 2018/10/24 androidx.test.ext:truth:1.0.0 androidx.test.ext:junit:1.1.0-beta01 androidx.test.ext:junit:1.0.0

Slide 86

Slide 86 text

androidx.test:monitor:1.1.1-beta01 Monitor ࠷৽ : ? 2018/11/28Ҏ߱ Stable : 2018/10/24 androidx.test:monitor:1.1.0

Slide 87

Slide 87 text

androidx.test:orchestrator:1.1.1-beta01 Orchestrator ࠷৽ : ? 2018/11/28Ҏ߱ Stable : 2018/10/24 androidx.test:orchestrator:1.1.0

Slide 88

Slide 88 text

androidx.test.espresso:espresso-core:3.1.1-beta01 androidx.test.espresso:espresso-contrib:3.1.1-beta01 androidx.test.espresso:espresso-intents:3.1.1-beta01 androidx.test.espresso:espresso-accessibility:3.1.1-beta01 androidx.test.espresso:espresso-web:3.1.1-beta01 Espresso ࠷৽ : ? 2018/11/28Ҡߦ Stable : 2018/10/24 androidx.test.espresso:espresso-core:3.1.0 androidx.test.espresso:espresso-contrib:3.1.0 androidx.test.espresso:espresso-intents:3.1.0 androidx.test.espresso:espresso-accessibility:3.1.0 androidx.test.espresso:espresso-web:3.1.0

Slide 89

Slide 89 text

Android Studio https://androidstudio.googleblog.com/

Slide 90

Slide 90 text

androidx.constraintlayout:constraintlayout:2.0.0-alpha2 ConstraintLayout ࠷৽ : 2018/8/9 Stable : 2018/8/30 androidx.constraintlayout:constraintlayout:1.1.3 2.0.0-alpha2 - minSdkVersion ͕ 14 ʹ - MotionLayout