Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Android Architecture Componentsを使って、改善・効率化するAndroidアプリ開発

Android Architecture Componentsを使って、改善・効率化するAndroidアプリ開発

@builderscon 2019

Ryo Sakaguchi

August 30, 2019
Tweet

More Decks by Ryo Sakaguchi

Other Decks in Programming

Transcript

  1. ©2019 Wantedly, Inc.
    "OESPJE"SDIJUFDUVSF$PNQPOFOUͰ

    վળɾޮ཰Խ͢Δ"OESPJEΞϓϦ։ൃ
    CVJMEFSTDPO
    XBLXBL 3ZP4BLBHVDIJ

    2019.8.30 -

    View Slide

  2. ©2019 Wantedly, Inc.
    Ryo Sakaguchi
    • Wantedly, Inc
    • Android/Kotlin…
    • Sake/Beer/Guitar…
    • Twitter/GitHub: @wakwak3125

    View Slide

  3. ϖʔδλΠτϧ ϖʔδαϒλΠτϧ
    ©2019 Wantedly, Inc.
    "OESPJEΛϝΠϯͰ΍ͬͯΔਓ "
    ͍Βͬ͠Ό͍·͢ʜʁ

    View Slide

  4. ©2019 Wantedly, Inc.
    ""$ͷશମ૾
    طଘϓϩμΫτ΁ͷಋೖͱͦͷมԽ
    ΩϟονΞοϓํ๏
    ·ͱΊ
    ࿩͢͜ͱ
    AAC=Android Architecture Components

    View Slide

  5. ©2019 Wantedly, Inc.
    ""$ͷશମ૾
    طଘϓϩμΫτ΁ͷಋೖͱͦͷมԽ
    ΩϟονΞοϓํ๏
    ·ͱΊ
    ࿩͢͜ͱ
    AAC=Android Architecture Components

    View Slide

  6. ©2019 Wantedly, Inc.
    ""$ͷશମ૾
    طଘϓϩμΫτ΁ͷಋೖͱͦͷมԽ
    ΩϟονΞοϓํ๏
    ·ͱΊ
    ࿩͢͜ͱ
    AAC=Android Architecture Components

    View Slide

  7. ©2019 Wantedly, Inc.
    ""$ͷશମ૾
    طଘϓϩμΫτ΁ͷಋೖͱͦͷมԽ
    ΩϟονΞοϓํ๏
    ·ͱΊ
    ࿩͢͜ͱ
    AAC=Android Architecture Components

    View Slide

  8. ©2019 Wantedly, Inc.
    ""$ͷશମ૾
    طଘϓϩμΫτ΁ͷಋೖͱͦͷมԽ
    ΩϟονΞοϓํ๏
    ·ͱΊ
    ࿩͢͜ͱ
    AAC=Android Architecture Components

    View Slide

  9. ©2019 Wantedly, Inc.
    ""$ͷશମ૾

    View Slide

  10. ©2019 Wantedly, Inc.
    ""$ͱ͸ʁ
    ϥΠϒϥϦͷ঺հ
    ొ৔ʹΑͬͯมԽͨ͜͠ͱ
    AACͷશମ૾ ࿩͢͜ͱ

    View Slide

  11. ©2019 Wantedly, Inc.
    ""$ͱ͸ʁ
    ""$ͷશମ૾

    View Slide

  12. ©2019 Wantedly, Inc.
    Android architecture components 

    are a collection of libraries that help you design robust, testable, and
    maintainable apps.
    Page Title Page Subtitle
    https://developer.android.com/topic/libraries/architecture

    View Slide

  13. ©2019 Wantedly, Inc.
    Android architecture components 

    are a collection of libraries that help you design robust, testable, and
    maintainable apps.
    Page Title Page Subtitle
    https://developer.android.com/topic/libraries/architecture

    View Slide

  14. ©2019 Wantedly, Inc.
    Android architecture components 

    are a collection of libraries that help you design robust, testable, and
    maintainable apps.
    Page Title Page Subtitle
    https://developer.android.com/topic/libraries/architecture

    View Slide

  15. ©2019 Wantedly, Inc.
    Android architecture components 

    are a collection of libraries that help you design robust, testable, and
    maintainable apps.
    Page Title Page Subtitle
    https://developer.android.com/topic/libraries/architecture

    View Slide

  16. ©2019 Wantedly, Inc.
    Android architecture components 

    are a collection of libraries that help you design robust, testable, and
    maintainable apps.
    Page Title Page Subtitle
    https://developer.android.com/topic/libraries/architecture

    View Slide

  17. ©2019 Wantedly, Inc.
    ϥΠϒϥϦͷ঺հ
    ൺֱతೃછΈਂ͍͋ͷࢠ΋""$ͷҰһͰ͢

    View Slide

  18. ©2019 Wantedly, Inc.
    %BUB#JOEJOH
    -JGFDZDMF
    -JWF%BUB
    7JFX.PEFM
    3PPN
    AACͷҰһͨͪ ϥΠϒϥϦͷ঺հ
    8PSL.BOBHFS
    1BHJOH
    /BWJHBUJPO

    View Slide

  19. ©2019 Wantedly, Inc.
    https://developer.android.com/
    jetpack/docs/guide
    Page Title Page Subtitle

    View Slide

  20. ©2019 Wantedly, Inc.
    %BUB#JOEJOH
    -JGFDZDMF
    -JWF%BUB
    7JFX.PEFM
    3PPN
    AACͷҰһͨͪ ϥΠϒϥϦͷ঺հ
    8PSL.BOBHFS
    1BHJOH
    /BWJHBUJPO

    View Slide

  21. ©2019 Wantedly, Inc.
    %BUB#JOEJOH

    View Slide

  22. ©2019 Wantedly, Inc.
    YNMͰϨΠΞ΢τΛఆٛ͢Δ
    جຊతͳ"OESPJEͷը໘ͷ࡞Γํ %BUB#JOEJOHະ࢖༻
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=“.MainActivity">
    android:id="@+id/text_view"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintLeft_toLeftOf="parent"
    app:layout_constraintRight_toRightOf="parent"
    app:layout_constraintTop_toTopOf="parent" />

    text_view

    View Slide

  23. ©2019 Wantedly, Inc.
    +BWB,PUMJO͔Β࢖͏
    جຊతͳ"OESPJEͷը໘ͷ࡞Γํ %BUB#JOEJOHະ࢖༻
    val textView = findViewById(R.id.text_view)
    textView.text = "Hello, World!"
    text_view

    View Slide

  24. ©2019 Wantedly, Inc.
    YNMͰϨΠΞ΢τΛఆٛ͢Δ
    جຊతͳ"OESPJEͷը໘ͷ࡞Γํ %BUB#JOEJOH
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">
    android:id="@+id/text_view"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@{text}"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintLeft_toLeftOf="parent"
    app:layout_constraintRight_toRightOf="parent"
    app:layout_constraintTop_toTopOf="parent" />

    android:text="@{text}"

    View Slide

  25. ©2019 Wantedly, Inc.
    !\^ͱ͍͏ܗͰηοτ͢Δ
    جຊతͳ"OESPJEͷը໘ͷ࡞Γํ %BUB#JOEJOH
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">
    android:id="@+id/text_view"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@{text}"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintLeft_toLeftOf="parent"
    app:layout_constraintRight_toRightOf="parent"
    app:layout_constraintTop_toTopOf="parent" />

    android:text="@{text}"

    View Slide

  26. ©2019 Wantedly, Inc.
    YNM͔Β#JOEJOHΫϥε͕ੜ੒͞ΕΔ
    جຊతͳ"OESPJEͷը໘ͷ࡞Γํ %BUB#JOEJOH
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">
    android:id="@+id/text_view"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@{text}"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintLeft_toLeftOf="parent"
    app:layout_constraintRight_toRightOf="parent"
    app:layout_constraintTop_toTopOf="parent" />

    android:text="@{text}"

    View Slide

  27. ©2019 Wantedly, Inc.
    Lifecycle
    Lifecycle-Aware Components

    View Slide

  28. ©2019 Wantedly, Inc.
    ԿΒ͔ͷඇಉظͳॲཧΛ࣮૷͢Δͱ͖͸
    ݱࡏͷը໘͕ʮੜ͖͍ͯΔʯͷ͔ʮࢮΜͰ͍Δʯͷ͔ʹ஫ҙΛ෷͏ඞཁ͕͋Δ
    w ը໘͕ੜ͖͍ͯΔ࣌ʹඇಉظॲཧͷ݁Ռ͕ฦͬͯ
    ͖ͨʂը໘ʹ൓ө͠Α͏ʂ
    ‎ 0,
    w ը໘͕ࢮΜͰ͍Δ࣌ʹඇಉظॲཧͷ݁Ռ͕ฦͬͯ
    ͖ͨʂը໘ʹ͸OʢSZ
    ‎ /( Ϋϥογϡ͢Δ

    Α͋͘Γ͕ͪͳύλʔϯ -JGFDZDMF

    View Slide

  29. ©2019 Wantedly, Inc.
    !0O-JGFDZDMF&WFOU ʜ

    -JGFDZDMF"XBSF$PNQPOFOUT
    @OnLifecycleEvent(Lifecycle.Event.ON_START)
    fun start() {
    // startObserveSomething { result ->
    // callback(result)
    // }
    }
    @OnLifecycleEvent(Lifecycle.Event.ON_STOP)
    fun stop() {
    // ઀ଓΛղআ͢Δ
    }

    View Slide

  30. ©2019 Wantedly, Inc.
    -JGFDZDMF&WFOU0/@45"35
    -JGFDZDMF"XBSF$PNQPOFOUT
    @OnLifecycleEvent(Lifecycle.Event.ON_START)
    fun start() {
    // startObserveSomething { result ->
    // callback(result)
    // }
    }
    @OnLifecycleEvent(Lifecycle.Event.ON_STOP)
    fun stop() {
    // ઀ଓΛղআ͢Δ
    }
    w 3FBDU
    w DPNQPOFOU%JE.PVOU
    w J04
    w WJFX%JE"QQFBS
    ଞͷϑϨʔϜϫʔΫʹ౰ͯ͸ΊΔͱ͜Μͳײ͡

    View Slide

  31. ©2019 Wantedly, Inc.
    -JGFDZDMF&WFOU0/@4501
    -JGFDZDMF"XBSF$PNQPOFOUT
    @OnLifecycleEvent(Lifecycle.Event.ON_START)
    fun start() {
    // startObserveSomething { result ->
    // callback(result)
    // }
    }
    @OnLifecycleEvent(Lifecycle.Event.ON_STOP)
    fun stop() {
    // ઀ଓΛղআ͢Δ
    }
    ଞͷϑϨʔϜϫʔΫʹ౰ͯ͸ΊΔͱ͜Μͳײ͡
    w 3FBDU
    w DPNQPOFOU8JMM6ONPVOU
    w J04
    w WJFX8JMM%JTBQQFBS

    View Slide

  32. ©2019 Wantedly, Inc.
    ϥΠϑαΠΫϧΛ֎ग़͠Ͱ͖Δ
    ͭ·ΓɺͦΕʹґଘͨ͠ίʔυͷݺͼग़͠࿙ΕΛ๷͙͜ͱ͕Ͱ͖Δ
    w 3Y+BWB΍3Y4XJGUͳͲͷετϦʔϜͷղআͱ͔
    w ը໘ͷϥΠϑαΠΫϧʹ४ͨ͡ಠࣗͷΦϒδΣΫ
    τΛ࡞Δ͜ͱ͕Ͱ͖Δɻ
    ͪΐͬͱ·ͱΊΔͱ -JGFDZDMF

    View Slide

  33. ©2019 Wantedly, Inc.
    LiveData
    Observable data holder

    View Slide

  34. ©2019 Wantedly, Inc.
    -JGFDZDMFΛߟྀͯ͘͠ΕΔɺ0CTFSWBCMF
    ϑϨʔϜϫʔΫͷ-JGFDZDMFʹ͏·͘৐͔ͬͬͯ͘ΕΔ
    w -JGFDZDMFతʹɺը໘ͷߋ৽Λͯ͠΋ྑ͍ঢ়ଶͷ
    ࣌ʹ͸஋͕ྲྀΕͯ͘Δɻͦ͏͡Όͳ͍ͱ͖͸ྲྀΕ
    ͯ͜ͳ͍
    ‎ ը໘͕ࢮΜͩޙʹ7JFXΛߋ৽͠Α͏ͱͯ͠ࢮͳ
    ͳ͍
    ‎ ։ൃऀ͸-JGFDZDMF΁ͷҙࣝΛ͜Ε·ͰΑΓ΋ɺ
    ͠ͳ͘ͱ΋7JFXͷߋ৽ॲཧ͕Ͱ͖ΔΑ͏ʹͳͬ
    ͯɺޮ཰తͰɺੜ࢈ੑ͕ߴ͍
    ͦ΋ͦ΋ͲΜͳ΋ͷʁ -JWF%BUB

    View Slide

  35. ©2019 Wantedly, Inc.
    -JGFDZDMFΛߟྀͯ͘͠ΕΔɺ0CTFSWBCMF
    ϑϨʔϜϫʔΫͷ-JGFDZDMFʹ͏·͘৐͔ͬͬͯ͘ΕΔ
    w -JGFDZDMFతʹɺը໘ͷߋ৽Λͯ͠΋ྑ͍ঢ়ଶͷ
    ࣌ʹ͸஋͕ྲྀΕͯ͘Δɻͦ͏͡Όͳ͍ͱ͖͸ྲྀΕ
    ͯ͜ͳ͍
    ‎ ը໘͕ࢮΜͩޙʹ7JFXΛߋ৽͠Α͏ͱͯ͠ࢮͳ
    ͳ͍
    ‎ ։ൃऀ͸-JGFDZDMF΁ͷҙࣝΛ͜Ε·ͰΑΓ΋ɺ
    ͠ͳ͘ͱ΋7JFXͷߋ৽ॲཧ͕Ͱ͖ΔΑ͏ʹͳͬ
    ͯɺޮ཰తͰɺੜ࢈ੑ͕ߴ͍
    ͦ΋ͦ΋ͲΜͳ΋ͷʁ -JWF%BUB

    View Slide

  36. ©2019 Wantedly, Inc.
    -JGFDZDMFΛߟྀͯ͘͠ΕΔɺ0CTFSWBCMF
    ϑϨʔϜϫʔΫͷ-JGFDZDMFʹ͏·͘৐͔ͬͬͯ͘ΕΔ
    w -JGFDZDMFతʹɺը໘ͷߋ৽Λͯ͠΋ྑ͍ঢ়ଶͷ
    ࣌ʹ͸஋͕ྲྀΕͯ͘Δɻͦ͏͡Όͳ͍ͱ͖͸ྲྀΕ
    ͯ͜ͳ͍
    ‎ ը໘͕ࢮΜͩޙʹ7JFXΛߋ৽͠Α͏ͱͯ͠ࢮͳ
    ͳ͍
    ‎ ։ൃऀ͸-JGFDZDMF΁ͷҙࣝΛ͜Ε·ͰΑΓ΋ɺ
    ͠ͳ͘ͱ΋7JFXͷߋ৽ॲཧ͕Ͱ͖ΔΑ͏ʹͳͬ
    ͯɺޮ཰తͰɺੜ࢈ੑ͕ߴ͍
    ͦ΋ͦ΋ͲΜͳ΋ͷʁ -JWF%BUB

    View Slide

  37. ©2019 Wantedly, Inc.
    -JGFDZDMFΛߟྀͯ͘͠ΕΔɺ0CTFSWBCMF
    ϑϨʔϜϫʔΫͷ-JGFDZDMFʹ͏·͘৐͔ͬͬͯ͘ΕΔ
    w -JGFDZDMFతʹɺը໘ͷߋ৽Λͯ͠΋ྑ͍ঢ়ଶͷ
    ࣌ʹ͸஋͕ྲྀΕͯ͘Δɻͦ͏͡Όͳ͍ͱ͖͸ྲྀΕ
    ͯ͜ͳ͍
    ‎ ը໘͕ࢮΜͩޙʹ7JFXΛߋ৽͠Α͏ͱͯ͠ࢮͳ
    ͳ͍
    ‎ ։ൃऀ͸-JGFDZDMF΁ͷҙࣝΛ͜Ε·ͰΑΓ΋ɺ
    ͠ͳ͘ͱ΋7JFXͷߋ৽ॲཧ͕Ͱ͖ΔΑ͏ʹͳͬ
    ͯɺޮ཰తͰɺੜ࢈ੑ͕ߴ͍
    ͦ΋ͦ΋ͲΜͳ΋ͷʁ -JWF%BUB

    View Slide

  38. ©2019 Wantedly, Inc.
    -JGFDZDMF0XOFS
    -JGFDZDMFͷঢ়ଶΛ஌͍ͬͯΔଘࡏ
    public interface LifecycleOwner {
    /**
    * Returns the Lifecycle of the provider.
    *
    * @return The lifecycle of the provider.
    */
    @NonNull
    Lifecycle getLifecycle();
    }

    View Slide

  39. ©2019 Wantedly, Inc.
    0CTFSWF͢Δ࣌ʹɺ-JGFDZDMF0XOFSΛऔΔ
    -JWF%BUB
    viewModel.comments.observe(lifecycleOwner, Observer {
    // ͜͜ʹίϝϯτͷϦετ͕ྲྀΕͯ͘Δɻ
    })

    View Slide

  40. ©2019 Wantedly, Inc.
    -JGFDZDMFΛߟྀͯ͘͠ΕΔɺ0CTFSWBCMF
    ϑϨʔϜϫʔΫͷ-JGFDZDMFʹ͏·͘৐͔ͬͬͯ͘ΕΔ
    w -JGFDZDMFతʹɺը໘ͷߋ৽Λͯ͠΋ྑ͍ঢ়ଶͷ
    ࣌ʹ͸஋͕ྲྀΕͯ͘Δɻͦ͏͡Όͳ͍ͱ͖͸ྲྀΕ
    ͯ͜ͳ͍
    ‎ ը໘͕ࢮΜͩޙʹ7JFXΛߋ৽͠Α͏ͱͯ͠ࢮͳ
    ͳ͍
    ‎ ։ൃऀ͸-JGFDZDMF΁ͷҙࣝΛ͜Ε·ͰΑΓ΋ɺ
    ͠ͳ͘ͱ΋7JFXͷߋ৽ॲཧ͕Ͱ͖ΔΑ͏ʹͳͬ
    ͯɺޮ཰తͰɺੜ࢈ੑ͕ߴ͍
    ͦ΋ͦ΋ͲΜͳ΋ͷʁ -JWF%BUB

    View Slide

  41. ©2019 Wantedly, Inc.
    ViewModel
    Store and manage UI-related data in a lifecycle conscious way

    View Slide

  42. ©2019 Wantedly, Inc.
    7JFX.PEFM
    ఆٛࣗମ͸ͱͯ΋ബ͍
    public abstract class ViewModel {
    @SuppressWarnings("WeakerAccess")
    protected void onCleared() {
    }
    }
    ࣮ࡍʹ͸ߦఔͲ͸͋Δɻ͕ɺͦΕͰ΋ബ͍

    View Slide

  43. ©2019 Wantedly, Inc.
    ը໘ճసΛ৐Γ੾Δ͜ͱ͕Ͱ͖Δ
    ը໘͕ճసͨ࣌͠ɺը໘͸࠶ੜ੒͞ΕΔ͕ɺ7JFX.PEFM͸มΘΒͳ͍
    w ͭ·Γɺ7JFX.PEFM͸ը໘Λੜ੒ͨ࣌͠ʹ࡞Β
    ΕΔͦͷΠϯελϯεͱมΘΒͳ͍ͷͰɺը໘Λ
    ࠶ੜ੒ͨ࣌͠ʹ΋ɺಉ͡΋ͷΛ࢖͏͜ͱ͕Ͱ͖
    Δɻ
    ‎ Αͬͯɺը໘Λճసͨ࣌͠ͷॲཧͳͲΛؾΛͭ
    ͚ͯॻ͔ͳͯ͘΋Α͘ͳͬͨ
    7JFX.PEFMͷ͍͢͝ͱ͜Ζ 7JFX.PEFM

    View Slide

  44. ©2019 Wantedly, Inc.
    7JFX.PEFM4UPSF
    7JFX.PEFM͕ը໘ճసΛ௒͑ͯอଘ͞Ε͍ͯΔ৔ॴ
    w ͜ͷ৔ॴʹɺ7JFX.PEFMͷΠϯελϯε͕อ࣋͞Ε͍ͯΔɻ
    w ը໘࠶ੜ੒࣌͸ɺ͔͜͜Β7JFX.PEFMΛऔΓग़͢͜ͱͰɺ

    ৐Γ੾͍ͬͯΔ
    7JFX.PEFMͷ͍͢͝ͱ͜Ζ ը໘ճసΛ৐Γ੾Δ

    View Slide

  45. ©2019 Wantedly, Inc.
    7JFX.PEFM1SPWJEFS
    7JFX.PEFMͷΠϯελϯεΛఏڙͯ͘͠ΕΔ΋ͷ
    w ͜ͷɺ7JFX.PEFM1SPWJEFSΛܦ༝ͯ͠ɺ7JFX.PEFMͷΠϯελ
    ϯεΛऔಘ͓ͯ͘͜͠ͱͰɺ7JFX.PEFM4UPSFʹࣗಈతʹऔಘ
    ͨ͠7JFX.PEFMͷΠϯελϯε͕อଘ͞Ε͍ͯΔɻ
    7JFX.PEFMͷ͍͢͝ͱ͜Ζ ը໘ճసΛ৐Γ੾Δ

    View Slide

  46. ©2019 Wantedly, Inc.
    $PSPVUJOFT ը໘ؒͷ7JFX.PEFMͷڞ༗
    7JFX.PEFMͷ͍͍ͱ͜Ζ͸ଞʹ΋͋Δ
    w $PSPVUJOFTαϙʔτ
    w ҟͳΔը໘ͰͷಉҰ7JFX.PEFMΠϯελϯεͷڞ༗
    7JFX.PEFMͷ͍͍ͱ͜Ζ ͦͷଞ

    View Slide

  47. ©2019 Wantedly, Inc.
    Room
    Room Persistence Library

    View Slide

  48. ©2019 Wantedly, Inc.
    42-JUFͷΦϒδΣΫτϚούʔ
    ػೳϞϦϞϦͷ03.ͱ͍͏ΑΓ͸ɺ42-JUFͷந৅ԽϨΠϠ
    w $PSPVUJOFTαϙʔτ
    w 3Y+BWBαϙʔτ
    w -JWF%BUBαϙʔτ
    w ΫΤϦͷ"OESPJE4UVEJPʹΑΔิ׬
    w 7*&8
    w '54
    3PPN 3PPN1FSTJTUFODF-JCSBSZ

    View Slide

  49. ©2019 Wantedly, Inc.
    WorkManager

    View Slide

  50. ©2019 Wantedly, Inc.
    গ͠௕͍ॲཧ΍஗Ԇ͕Մೳͳ΋ͷΛ࣮ߦ͢Δͱ͖
    Ϣʔβʹͱͬͯ͸ଈ࣌ੑ͕ͳͯ͘΋ྑ͍΋ͷ
    w ΞφϦςΟΫεΠϕϯτͷૹ৴ॲཧ
    w ఆظతͳಉظ
    Ϣʔεέʔε 8PSL.BOBHFSΛศརʹ࢖͑Δέʔε

    View Slide

  51. ©2019 Wantedly, Inc.
    σόΠεͷঢ়ଶʁ
    εϚʔτϑΥϯ͸ෆ҆ఆͳঢ়ଶʹ͋Δ͜ͱ͕ଟ͍
    w ωοτϫʔΫ͸ྑ޷͔ʁ
    w όοςϦʔ͸े෼͔ʁ
    w ॆిத͔ʁ
    w ୺຤͕ΞΠυϧ͔ʁ
    w ετϨʔδ͸े෼͔ʁ
    σόΠεͷঢ়ଶͰ࣮ߦ͢Δ͔Ͳ͏͔ΛܾΊΔ 8PSL.BOBHFS

    View Slide

  52. ©2019 Wantedly, Inc.
    $POTUSBJOUT#VJMEFS
    8PSL.BOBHFSͷδϣϒͷىಈʹඞཁͳ੍໿Λઃ͚Δ
    w TFU3FRVJSFE/FUXPSL5ZQF
    w TFU3FRVJSFT#BUUFSZ/PU-PX
    w TFU3FRVJSFT$IBSHJOH
    w TFU3FRVJSFT%FWJDF*EMF
    w TFU3FRVJSFT4UPSBHF/PU-PX
    σόΠεͷঢ়ଶͰ࣮ߦ͢Δ͔Ͳ͏͔ΛܾΊΔ 8PSL.BOBHFS

    View Slide

  53. ©2019 Wantedly, Inc.
    Paging

    View Slide

  54. ©2019 Wantedly, Inc.
    1BHFE-JTU
    ϖʔδωʔγϣϯʹඞཁͳ1BHFͷσʔλΛ࣋ͭ
    w ͜ͷ1BHFE-JTUΛ-JWF%BUBͰฦ͢Α͏ͳ࣮૷Λࣗ෼Ͱ͔͘
    w ࠓ·ͰɺಠࣗʹΞΠςϜΧ΢ϯτΛͯ͠Լ·ͰߦͬͨΒʜͱ
    ߦͬͨ෩ʹॻ͍͍࣮ͯͨ૷Λڞ௨Խ͢Δ͜ͱ͕Ͱ͖Δ
    w ݱࡏ͸ओʹ3PPNͷσʔλ͔ΒͷಡΈࠐΈ͕ϝΠϯ
    w ωοτϫʔΫ͔ΒͷಡΈࠐΈΛαϙʔτ͸͍ͯ͠Δ͕ɺࠓޙ͞
    Βʹ࢖͍΍͘͢ͳΓͦ͏ͳػೳ͕ఏڙ͞ΕΔݟࠐΈ͕͋Δ
    1BHJOHͷओ໾ 1BHJOH

    View Slide

  55. ©2019 Wantedly, Inc.
    /BWJHBUJPO
    Πϝʔδ͸J04ͷ4FHVF
    w ը໘ભҠΛ(6*΍YNMͰఆٛ͠ɺͦΕΛίʔυ͔Βݺͼग़͢͜ͱ
    Ͱը໘ભҠΛߦ͏͜ͱ͕Ͱ͖Δ
    w όοΫελοΫͷ؅ཧͳͲ͕༰қʹͳΔ
    /BWJHBUJPO ୯७ͳը໘ભҠ͔Βෳࡶͳ΋ͷ·Ͱ

    View Slide

  56. ©2019 Wantedly, Inc.
    ศརʹ࢖͑ΔɺެࣜɺϞμϯ͞
    "OESPJEΞϓϦ։ൃͷਏ͍ͱ͜ΖΛ৭ʑͳ໘Ͱαϙʔτͯ͘͠ΕΔ
    "OESPJE"SDIJUFDUVSF$PNQPOFOUT
    w 6*69ͷվળ
    w ߴ଎Ͱݎ࿚ͳΞϓϦ։ൃ
    w ෦෼ಋೖ͕Մೳ

    View Slide

  57. ©2019 Wantedly, Inc.
    طଘϓϩμΫτ΁ͷಋೖͱͦͷมԽ

    View Slide

  58. ©2019 Wantedly, Inc.
    ઃܭʹมԽ͕ੜ·Εͨ
    ϢʔβମݧʹมԽ͕ੜ·Εͨ
    طଘϓϩμΫτ΁ͷಋೖͱͦͷมԽ
    AAC=Android Architecture Components

    View Slide

  59. ©2019 Wantedly, Inc.
    8BOUFEMZ1FPQMF
    ͍ΘΏΔ໊ࢗ؅ཧΞϓϦࣗ෼ͷϏδωεͷͭͳ͕ΓΛ؅ཧ
    w ໊ࢗΛຕҰؾʹόοͱಡΈࠐΜͰଈσʔλԽͨ͠Γ
    w ໊ࢗʹؔ࿈͢ΔχϡʔεΛݟ͚͖ͭͯͨΓ
    w 8BOUFEMZͷϓϩϑΟʔϧͷߋ৽͕ड͚औΕͨΓ
    w ΦϑϥΠϯঢ়ଶͰ΋࿈བྷઌͷ֬ೝΛ͢Δ͜ͱ͕Ͱ͖ͨΓ
    ͜͜Ͱ঺հ͢ΔϓϩμΫτ طଘϓϩμΫτ΁ͷಋೖͱͦͷมԽ

    View Slide

  60. ©2019 Wantedly, Inc.
    ౰ॳͷઃܭ
    ਆ"DUJWJUZਆ'SBHNFOU͕͍ͯɺڊେͳ.BOBHFSΫϥε͕͍ΔΈ͍ͨͳઃܭ
    w ͜Εࣗ਎͸ѱ͘ͳ͍ͱࢥ͍ͬͯΔ
    w ݶΒΕͨϦιʔεͷதͰϢʔβʹՁ஋Λಧ͚Δඞཁ͕͋ͬͨ
    w ݩʑͷ։ൃऀ͕ҰਓͰશͯ࡞Γ੾ͬͨͷͰɺҰਓ͕։ൃΛ͢Δ
    ʹ͋ͨͬͯ࠷଎ͷઃܭʹͳ͍ͬͯͨ
    w ڊେͳΫϥεͰ͸͋Δ͕ɺΠϯλʔϑΣΠεઃܭ͕͖ͪΜͱ͠
    ͍ͯͨͨΊɺΫϥε੹຿͕ͬͪ͝Όʹͳ͍ͬͯΔՕॴ͸গͳ
    ͔ͬͨ
    8BOUFEMZ1FPQMF طଘϓϩμΫτ΁ͷಋೖͱͦͷมԽ

    View Slide

  61. ©2019 Wantedly, Inc.
    ݱࡏͷઃܭ
    .77.Ͱɺ3FQPTJUPSZ 6TF$BTFͳͲ͕ଘࡏ͢Δܗ
    w େ͖ͳΫϥεͷ੹຿Λ΋͏গ͠ࡉ෼Խ
    w ڊେͳ6TF$BTFυϝΠϯϩδοΫͷմͷΑ͏ͳΫϥεΛ
    6TF$BTF΁ͱ੾Γग़͠
    w 3FQPTJUPSZͷΑ͏ͳ΋ͷΛ3FQPTJUPSZΫϥε΁ͱҠ͠ସ͑
    w େ͖ͳ"DUJWJUZ'SBHNFOU͔Β.77.Λϕʔεʹͨ͠ϨΠϠʔ
    υΞʔΩςΫνϟ΁ͷஈ֊తҠߦ
    8BOUFEMZ1FPQMF طଘϓϩμΫτ΁ͷಋೖͱͦͷมԽ

    View Slide

  62. ©2019 Wantedly, Inc.
    3FBMN3PPN
    ΑΓ࢖͍΍͘͢ɺςελϒϧͳ΋ͷΛ໨ࢦͯ͠
    w 3FBMN
    w ૣ͍ɺ࢖͍΍͍͢
    w εϨουपΓͷѻ͍͕೉͍͠ɺςετίετ͕ߴ͍
    w 3PPN
    w ໰୊ʹͳΒͳ͍଎͞ɺ࢖͍΍͍͢ɺεϨουʹ΋ෆ҆఺ͳ͠

    ͯελϏϦςΟ΋ߴ͍
    w ςʔϒϧͷఆ͕ٛ3FBMNʹൺ΂Δͱগ͠໘౗
    8BOUFEMZ1FPQMF ΠϯϑϥϨΠϠʔͷվળ

    View Slide

  63. ©2019 Wantedly, Inc.
    Ҡߦεςοϓ
    ·ͣ͸Ұ෦ͷςʔϒϧ͔Β
    w ΫϦςΟΧϧͳόάΛग़͠ʹ͍͘Օॴ͔Βஈ֊తʹ
    w αʔό͔Βͷઃఆ஋Λอଘ͢ΔΑ͏ͳςʔϒϧΛ·ͣ͸Ҡߦ
    w 3FBMNͱ3PPNΛಉ͡΋ͷͱͯ͠ѻ͑ΔΑ͏ͳΠϯλʔϑΣ
    ΠεΛఆٛ
    w औಘઌΛεΠον͢Ε͹3FBMNͰ΋3PPNͰ΋౷Ұతʹѻ
    ͑Δ͜ͱΛ໨ࢦͨ͠
    8BOUFEMZ1FPQMF ΠϯϑϥϨΠϠʔͷվળ

    View Slide

  64. ©2019 Wantedly, Inc.
    ϏδωεϩδοΫͷ੾Γग़͠
    6TF$BTF૚Λ༻ҙ͠ɺࡉ͔ͳ୯ҐͰͷ੹຿෼ׂ
    w %BUB.BOBHFSΫϥε͔ΒϏδωεϩδοΫʹؔ͢ΔՕॴΛ੾
    Γग़ͯ͘͠
    w ͜ΕΒͷ੾Γग़ͨ͠ϩδοΫΛ7JFX.PEFMͰ࢖͏͜ͱΛ໨
    తͱͨ͠
    w ը໘ʹ఺ࡏ͍ͯ͠ΔϏδωεϩδοΫ΋Ұ෦6TF$BTFʹ੾Γ
    ग़͠ɺ7JFX.PEFMͳͲ͔Β࢖͑Δঢ়ଶʹ
    w େ͖ͳը໘Λͳͦ͘͏ͱ͍͏ࢼΈ
    8BOUFEMZ1FPQMF ϏδωεϩδοΫ

    View Slide

  65. ©2019 Wantedly, Inc.
    .71ͷಋೖ
    .77.Ͱ7JFX.PEFMͷಋೖͷલʹ.71Ͱ·ͣ͸ബ͘࡞Δͱ͜Ζ͔Β
    w ੾Γग़ͨ͠ɺϩδοΫΛ1SFTFOUFSͰ࢖༻Ͱ͖Δ
    w ςετ͕͠΍͍͢
    w ςετ͕ॻ͖΍͍͢
    w ίʔυΛॻ͘ྔ͕ѹ౗తʹ૿͑Δ
    w ඇੜ࢈త
    w .77.Ͱ-JWF%BUBΛ࢖ͬͯYNMʹ௚઀όΠϯυͨ͠ํ͕ྑ͍ͷ
    Ͱ͸ʁͱ͍͏൑அʹͳΔ
    8BOUFEMZ1FPQMF 6*૚ͷվળ

    View Slide

  66. ©2019 Wantedly, Inc.
    .77.ͷಋೖ
    .71Ͱͷ൓লΛੜ͔͠ɺ.77.Λಋೖ
    w .71ʹൺ΂ͯॻ͘ྔ͕֨ஈʹݮͬͨ
    w YNMʹ௚઀తʹ-JWF%BUBΛ౉͢͜ͱͰɺࣗಈతʹϥΠϑαΠΫ
    ϧʹόΠϯυͯ͘͠ΕΔ
    w ஋Λ7JFX.PEFM͔Βྲྀ͠ࠐΊ͹ͦΕ͚ͩͰ6*͕ߋ৽͞ΕΔ
    w ը໘ؒͰͷ7JFX.PEFMͷڞ༗
    w ڞ௨ͷϩδοΫΛ͍࣋ͪͨͱͳͬͨ࣌ʹɺͱͯ΋΍Γ΍͍͢
    8BOUFEMZ1FPQMF 6*૚ͷվળ

    View Slide

  67. ©2019 Wantedly, Inc.
    ·ͱΊ
    ςελϏϦςΟͷ޲্ͱɺੜ࢈ੑͷ޲্
    w 3PPNͰΠϯϑϥ૚ͷςελϏϦςΟΛ޲্ͤͨ͞
    w 7JFX.PEFMͷಋೖͰɺ6*ͷ࡞੒ʹ͔͔Δ࣌ؒΛେ෯ʹ࡟ݮͨ͠
    w ಋೖ͸εςοϓόΠεςοϓͰՄೳ
    w ҰؾʹೖΕͳͯ͘΋ྑ͍
    w ·ͣ͸Ͱ͖ͦ͏ͳͱ͜Ζ͔Βগͣͭ͠Ͱ0,
    8BOUFEMZ1FPQMF ΞʔΩςΫνϟͷվળ

    View Slide

  68. ©2019 Wantedly, Inc.
    8PSL.BOBHFSͷಋೖ
    ୺຤ͷ࿈བྷઌͱͷಉظɺ஗Ԇ࣮ߦՄೳ͔ͭϩϯάλεΫ
    w 8BOUFEMZ1FPQMF͸໊ࢗΛ؅ཧ͢ΔΞϓϦ
    w ͭ·Γ͸৭ʑͳ࿈བྷઌΛΞϓϦ಺ʹอ࣋͢Δඞཁ͕͋Δ
    w Ϣʔβʹͱͬͯ͸ΞϓϦ಺͚ͩͰ͸ͳ͘ɺࣗ෼ͷ୺຤ͷ࿈བྷઌ
    ʹಉظ͍ͨ͠ͱ͍͏έʔε΋ɻ
    w ͦ͏͍ͬͨ࣌ʹɺΞϓϦ಺ͷ࿈བྷઌ͔Β୺຤ͷ࿈བྷઌ΁ͷΤΫ
    εϙʔτ͸࿈བྷઌ݅਺ʹ΋ΑΔ͕ϩϯάλεΫʹͳΓ͕ͪ
    8BOUFEMZ1FPQMF 69ͷվળ

    View Slide

  69. ©2019 Wantedly, Inc.
    ΩϟονΞοϓํ๏

    View Slide

  70. ©2019 Wantedly, Inc.
    "OESPJE%FWFMPQFST$PEFMBCT
    ·ͣ͸ެ͔ࣜΒ
    w IUUQTEFWFMPQFSBOESPJEDPNUPQJDMJCSBSJFTBSDIJUFDUVSF
    w ެࣜͷυΩϡϝϯτ͕ྑ͍
    w ڵຯͷ༙͍ͨίϯϙʔωϯτ͕͋Ε͹$PEFMBCTΛ࢖ͬͯɺ

    Ұ௨Γͷجຊతͳ࢖͍ํ͸ֶͿ͜ͱ͕Ͱ͖Δ
    w IUUQTEFWFMPQFSBOESPJEDPNUPQJDMJCSBSJFTBSDIJUFDUVSFBEEJUJPOBMSFTPVSDFTIUNM
    w 4BNQMFɺ$PEFMBCT΍#MPH΁ͷϦϯΫू
    w ͜͜ʹॻ͍ͯ͋Δ͜ͱΛಡΉͱ΋ͬͱ৭ʑͳ5JQTΛݟΔ͜ͱ͕Ͱ͖Δ
    ৘ใͷΩϟονΞοϓ Ͳ͕͍͍͜ʁ

    View Slide

  71. ©2019 Wantedly, Inc.
    "OESPJE%BHBTIJ
    5XJUUFS
    w IUUQTBOESPJEEBHBTIJHJUIVCJP
    w "OESPJEؔ࿈ͷ8FFLMZ/FXT
    ৘ใͷΩϟονΞοϓ Ͳ͕͍͍͜ʁ

    View Slide

  72. ©2019 Wantedly, Inc.
    "OESPJEք۾ͳ5XJUUFSϦετ
    5XJUUFS
    w IUUQTUXJUUFSDPNTZBSJIVMJTUTBOESPJEJOGP
    w "OESPJEͷڧͦ͏ͳਓ͕ͨͪू·͍ͬͯΔϦετ͕ެ։͞Ε͍ͯΔ
    w ΋ͪΖΜ5XJUUFSͳͷͰΈͳ͞Μࣗ༝ʹͭͿ΍͍͍ͯ·͢
    ৘ใͷΩϟονΞοϓ Ͳ͕͍͍͜ʁ

    View Slide

  73. ©2019 Wantedly, Inc.
    ·ͱΊ

    View Slide

  74. ©2019 Wantedly, Inc.
    ࠷ۙͷ"OESPJE։ൃ͸͍ͩͿΜਐԽͨ͠
    ""$͸طଘΞϓϦͷઃܭମݧΛஈ֊తʹվળͰ͖Δ
    w গͣͭ͠ಋೖͰ͖Δ
    w ಋೖεςοϓͷΦεεϝ͸ɺΞϓϦ಺ͷ௿͍ϨΠϠʔ͔Β͕Φεεϝ
    w 6*૚पΓ͸ࠓޙ΋มΘ͍ͬͯ͘ͱࢥ͍ͬͯΔ
    w J04ͳΒ4XJGU6* "OESPJEͳΒ+FUQBDL$PNQPTF
    w ΞϓϦ಺ͷσʔλपΓΛ͖ͪΜͱݻΊ͓ͯ͘ͷ͕େࣄ
    w ͦͷ఺ɺ3PPN͸ςελϏϦςΟ΋ߴ͘ɺ࠷ॳͷಋೖʹ͸Φεεϝ
    w ͨͩɺͦͷલʹݱࡏͷઃܭͱͷ݉Ͷ߹͍΋͋Δ͔Βͦ͜͸͏·͘΍ͬͯཉ͍͠
    ·ͱΊ

    View Slide

  75. ©2019 Wantedly, Inc.
    69ʹ΋د༩Ͱ͖Δ
    ϞόΠϧΞϓϦͳΒͰ͸ͷෆ҆ఆͳঢ়ଶΛߟྀͨ͠όοΫάϥ΢ϯυλεΫ༻ͷ8PSL.BOBHFS
    w ϞόΠϧΞϓϦͳΒͰ͸ͷෆ҆ఆͳঢ়ଶΛߟྀͨ͠όοΫάϥ΢ϯυλεΫ༻ͷ8PSL.BOBHFS
    w Ϣʔβ͕εϚʔτϑΥϯ͔Β཭Ε͍ͯΔλΠϛϯά΍ॆిதͳͲͷλΠϛϯάͰ

    σόΠεͷϦιʔεΛ࢖͏͜ͱ͕Ͱ͖Δ
    ‎ Ϣʔβʹ༩͑ΔετϨεΛܰݮͰ͖ΔݟࠐΈɻ
    ·ͱΊ

    View Slide

  76. ϖʔδλΠτϧ ϖʔδαϒλΠτϧ
    ©2019 Wantedly, Inc.
    ͋Γ͕ͱ͏͍͟͝·ͨ͠

    View Slide