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
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
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.2k
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
アクセシビリティから考える情報設計
high_g_engineer
0
420
AI活用は、個人から組織へ|マルチプレイヤーエージェントハーネス「QM」の社内活用事例 / AI use is moving from individuals to orgs
rkaga
1
300
ゲームコントローラやキーボードのファームウェアをSwiftで書く
kishikawakatsumi
1
270
マイコン向けの軽量Ruby「PicoRuby」で各種デバイスを制御するネイティブアプリの実現手法
bash0c7
0
460
AI が書く Go コードの品質を劇的に向上させる Linter: “declscope”
mpyw
0
440
WebRTC映像をAirPlayに対応させる挑戦.pdf
monolithic_adam
0
320
スマート反転とウェブアクセシビリティ
camiha
0
220
GitHubハンズオン講座 — 実務レベルのチーム開発のフローを身につけよう
junhat6
0
110
Intent as Code
shoppingjaws
6
1.1k
Vue Fes Japan 2026 タイムテーブル徹底解説
448jp
1
560
巨大モノリシックアプリ モダン化大作戦
ktcryomm
1
1.2k
[GoCon2026] When Goroutines Are Not Enough: Runtime Locality in High-Throughput Go
takehaya
6
2.6k
Featured
See All Featured
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
254
22k
Visualization
eitanlees
153
17k
Product Roadmaps are Hard
iamctodd
55
13k
How to audit for AI Accessibility on your Front & Back End
davetheseo
0
550
ReactJS: Keep Simple. Everything can be a component!
pedronauck
666
130k
Pawsitive SEO: Lessons from My Dog (and Many Mistakes) on Thriving as a Consultant in the Age of AI
davidcarrasco
0
250
Leading Effective Engineering Teams in the AI Era
addyosmani
9
2.7k
RailsConf 2023
tenderlove
30
1.6k
Digital Ethics as a Driver of Design Innovation
axbom
PRO
1
440
How to Talk to Developers About Accessibility
jct
2
560
Discover your Explorer Soul
emna__ayadi
2
1.3k
A Soul's Torment
seathinner
8
3.7k
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開発を高速に
ありがとうございました