Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Android Jetpack (再)入門 / DevFest Okayama 2019
Search
star_zero
December 07, 2019
Programming
390
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Android Jetpack (再)入門 / DevFest Okayama 2019
star_zero
December 07, 2019
More Decks by star_zero
See All by star_zero
今からはじめるAndroidアプリ開発 2024 / DevFest 2024
star_zero
0
1.6k
Jetpack Compose の Side-effect を使いこなす / DroidKaigi 2023
star_zero
5
7.3k
Android 14 新機能 / Android 14 Meetup Nagoya
star_zero
1
700
Android 14 と Predictive back gesture / Shibuya.apk #42
star_zero
0
510
Coroutines Test 入門 / Android Test Night #8
star_zero
2
1.4k
What's new in Jetpack / I/O Extended Japan 2022
star_zero
1
730
Kotlin 2021 Recap / DevFest 2021
star_zero
3
1.4k
Kotlin Symbol Processing (KSP) を使ったコード生成 / DroidKaigi 2021
star_zero
2
5.3k
What's new Android 12
star_zero
0
630
Other Decks in Programming
See All in Programming
設計次第でAIコードの読む量は減らせる / designing-for-code-reading
minodriven
30
13k
ハーネス設計入門 〜 基礎知識の整理から実務へのステップアップ 〜
kinopeee
19
20k
Findy - エンジニア向け会社紹介/Findy Company Deck
findyinc
6
400k
市販E-Readerを乗っ取れ 〜Embedded Swiftで電子ペーパーガジェットを制御する〜
trickart
0
220
手動確認はもう限界 〜XCUITestでCustom URL Schemeの遷移を起動種別ごとに自動テストする〜 / Testing Custom URL Schemes with XCUITest
otouto
0
360
AI が書く Go コードの品質を劇的に向上させる Linter: “declscope”
mpyw
0
450
20260914 AIエージェント時代のPlatform Engineering LLM基盤とプロダクトの責務境界線
kanfab1
7
2.3k
TiDB Cloudのカスタムコントローラーによるオートスケール対応
takaidohigasi
0
140
選挙速報を多くのユーザーへ 届ける Live Activities 設計
hamayokokuririn
0
190
JPUG勉強会 OSSデータベースの内部構造を理解しよう(第2回)
oga5
0
280
Webの地図
yosuke_furukawa
PRO
6
5k
AI時代のコードレビューは人に向けるな、仕組みに向けろ
texmeijin
5
3.2k
Featured
See All Featured
<Decoding/> the Language of Devs - We Love SEO 2024
nikkihalliwell
1
330
What the history of the web can teach us about the future of AI
inesmontani
PRO
1
720
Navigating the Design Leadership Dip - Product Design Week Design Leaders+ Conference 2024
apolaine
2
450
Collaborative Software Design: How to facilitate domain modelling decisions
baasie
1
330
Deep Space Network (abreviated)
tonyrice
0
350
The B2B funnel & how to create a winning content strategy
katarinadahlin
PRO
1
550
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
128
56k
More Than Pixels: Becoming A User Experience Designer
marktimemedia
3
540
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
133
20k
Abbi's Birthday
coloredviolet
4
10k
Rebuilding a faster, lazier Slack
samanthasiow
85
9.7k
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
PRO
203
76k
Transcript
Android Jetpack (再)入門 DevFest Okayama 2019 2019/12/07
About me • Kenji Abe • クックパッド株式会社 • Google Developers
Experts for Android • Twitter: @STAR_ZERO
話すこと • Android Jetpackの概要 • 各ライブラリの簡単な紹介と使い方 ‣ たくさんあるのでザックリと
Jetpack?
Jetpack? https://developer.android.com/jetpack
Jetpack? • Android開発を加速させてくれるライ ブラリやツールなど • プラットフォームのAPIからは独立さ れてる • 頻繁にアップデートされる •
必要なものだけを使用可能
Jetpack? https://developer.android.com/jetpack/androidx/versions
Architecture • https://developer.android.com/ jetpack/docs/guide • 推奨しているアーキテクチャのガイド • Jetpackを使うならこれに従うと良い • MVVM
+ Repsitory
Jetpack?
各ライブラリの 紹介
使ったほうが良い
使ったほうが良い • AppCompat • Lifecycles • ViewModel • LiveData
AppCompat • 古いOSとの下位互換 • マテリアルデザインのサポート • 新規プロジェクトでは自動で追加され る • 必ず使いましょう
AppCompat • AppCompatActivity, Fragment • AppCompatButton, AppCompatTextViewなど ‣ レイアウトのButton/TextViewなどは 自動で変換される
• その他色々
Lifecycles • Activity/Fragmentのライフサイクル の状態を管理 ‣ LifecycleOwnerを実装してる • ライフサイクルの状態を監視できる • LifecycleOwner使って連携
Lifecycles https://developer.android.com/topic/libraries/architecture/lifecycle
ViewModel • Viewのデータを保持する • 回転などでデータを失わない ‣ Viewなどを保持するとメモリリークす る ‣ OSが破棄したときは対応が必要
ViewModel https://developer.android.com/topic/libraries/architecture/viewmodel
ViewModel class MainViewModel : ViewModel() { // } class MainActivity
: AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) val viewModel = ViewModelProviders .of(this).get(MainViewModel::class.java) } }
LiveData • Observe可能なデータホルダー • Lifecycleのことを知ってる • LifecycleがSTARTED/RESUMEDのと きに変更を通知 • 他のライブラリでも多く使われてる
LiveData class MainViewModel : ViewModel() { private val _data =
MutableLiveData<String>() val data: LiveData<String> = _data fun fetchData() { val result = // データ取得 _data.value = result } }
LiveData class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?)
{ viewModel.data.observe(this, Observer { // LiveDataが変更されるとココに通知される }) } }
使っていきたい
使っていきたい • DataBinding • Navigation
DataBinding • レイアウト(XML)とデータを結合させる • データの変更を自動でUIへ反映 (LiveData) • イベント処理 • XMLに式が書ける
• XMLからコードを自動生成
DataBinding class MainViewModel : ViewModel() { private val _data =
MutableLiveData<String>() val data: LiveData<String> = _data fun fetchData() { val result = // データ取得 _data.value = result } }
DataBinding <layout> <data> <variable name="viewModel" type="com...MainViewModel" /> </data> <ConstraintLayout> <TextView
android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{viewModel.data}" /> </ConstraintLayout> </layout>
DataBinding class MainActivity : AppCompatActivity() { private lateinit var binding:
ActivityMainBinding private val viewModel by lazy { } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) binding = DataBindingUtil .setContentView(this, R.layout.activity_main) binding.lifecycleOwner = this binding.viewModel = viewModel } }
DataBinding fun onClickButton() { // ボタンが押されたときの処理 } <Button android:id="@+id/button" android:onClick="@{()
-> handler.onClickButton()}" />
Navigation • Navigation Editorで画面遷移を定義 ‣ XMLを直接編集も可能 • 主にFragment間の画面遷移 • 引数を型安全に受け渡し可能(SafeArgs)
• DeepLinkでの遷移
Navigation
Navigation
Navigation <ConstraintLayout> <androidx.fragment.app.FragmentContainerView android:id="@+id/nav_host_fragment" android:name="androidx.navigation.fragment.NavHostFragment" app:defaultNavHost="true" app:navGraph="@navigation/nav_graph" /> </androidx.constraintlayout.widget.ConstraintLayout>
Navigation fun onClickButton() { findNavController() .navigate(R.id.action_mainFragment_to_homeFragment) }
必要なときに
必要な時に • WorkManager • Room • Paging • CameraX
WorkManager • バックグラウンドタスクを実行 • ネットワークや充電状況を考慮 • OneTime、定期実行
WorkManager class MyWorker( context: Context, params: WorkerParameters ): Worker(context, params)
{ override fun doWork(): Result { // タスクを実行 return Result.success() } }
WorkManager val constraints = Constraints.Builder() .setRequiredNetworkType(NetworkType.CONNECTED) .setRequiresCharging(true) .build() val workRequest
= OneTimeWorkRequestBuilder<MyWorker>() .setConstraints(constraints) .build() WorkManager.getInstance(context).enqueue(workRequest)
Room • SQLiteへ簡単にアクセス • @Database, @Entity, @Dao で構成 • リレーションのサポート
• Android StudioでのSQL構文チェック
Room @Entity data class User( @PrimaryKey val id: Int, @ColumnInfo(name
= "name") val name: String ) @Dao interface UserDao { @Query("SELECT * FROM user") fun getUsers(): List<User> @Insert fun insert(user: User) }
Room @Database(entities = [User::class], version = 1) abstract class AppDatabase:
RoomDatabase() { abstract fun userDao(): UserDao }
Room val db = Room.databaseBuilder( requireContext(), AppDatabase::class.java, "my-db" ).build() val
dao = db.userDao() // データ追加 dao.insert(User(1, "Kenji Abe")) // データ取得 val users = dao.getUsers()
Paging • RecyclerViewのオートページング • Roomは簡単に対応できる • ネットワークアクセスは自分で実装 • クセがあるので難しい
Paging @Dao interface UserDao { @Query("SELECT * FROM user ORDER
BY id") fun getUsersPaging(): DataSource.Factory<Int, User> } class UserViewMode : ViewModel() { val users = userDao.getUsersPaging().toLiveData(10) }
Paging class UsersAdapter : PagedListAdapter<User, ViewHolder>(DIFF_CALLBACK) { override fun onCreateViewHolder(/*
*/): ViewHolder { // ... return ViewHolder(view) } override fun onBindViewHolder((/* */) { holder.bind(getItem(position)) } }
Paging class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?)
{ super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) val adapter = UsersAdapter() recycler.layoutManager = LinearLayoutManager(this) recycler.adapter = adapter viewModel.users.observe(this, Observer { adapter.submitList(it) }) } }
CameraX • カメラアプリの開発を簡単に • デバイス依存コードが不要 • ベンダー拡張機能 ‣ HDR、Portraitなど
CameraX val previewConfig = PreviewConfig.Builder().apply { // ... }.build() val
preview = Preview(previewConfig) preview.setOnPreviewOutputUpdateListener { // ... } val imageCaptureConfig = ImageCaptureConfig.Builder() .apply { // ... }.build() val imageCapture = ImageCapture(imageCaptureConfig) CameraX.bindToLifecycle(this, preview, imageCapture)
その他いろいろ
その他いろいろ • Benchmark ‣ パフォーマンス測定 • Biometric ‣ 生体認証 •
ViewPager2 ‣ ViewPagerの新実装(RecyclerView) • Security ‣ 暗号化まわり
KTX
• Kotlinの拡張関数を使って、記述を簡 単に • Coroutinesもサポート • https://developer.android.com/ kotlin/ktx/extensions-list KTX
KTX dependencies { implementation "androidx.core:core-ktx:1.1.0" implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.1.0" implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.1.0" implementation
"androidx.navigation:navigation-fragment-ktx:2.1.0" implementation "androidx.navigation:navigation-ui-ktx:2.1.0" }
KTX preference.edit() .putBoolean("flag", true) .putInt("value", 1) .apply() // ktxを使った場合 preference.edit
{ putBoolean("flag", true) putInt("value", 1) }
KTX viewModel.data.observe(this, Observer { // ... }) // ktxを使った場合 viewModel.data.observe(this)
{ // ... }
Jetpack Compose
Jetpack Compose • Google I/O 2019で発表 • 宣言的UI ‣ Flutter,
React, Vue.jsに似てる • Kotlinで書く • まだPreview版 • Android Studio 4.0で試せる
Jetpack Compose
Jetpackを使って Android開発を高速に
ありがとうございました