Skip to content

Files

Latest commit

2be3d6f Β· Sep 23, 2018

History

History
205 lines (124 loc) Β· 9.98 KB

android jetpack.md

File metadata and controls

205 lines (124 loc) Β· 9.98 KB

android jetpack

1.android jetpackμ΄λž€?

  • android앱을 λ§Œλ“€κΈ° μœ„ν•œ μ»΄ν¬λ„ˆνŠΈ, 도ꡬ 및 μ§€μΉ¨ μ„ΈνŠΈ

  • κΈ°μ‘΄ 지원 λΌμ΄λΈŒλŸ¬λ¦¬μ™€ μ•„ν‚€ν…μ²˜ μ»΄ν¬λ„ˆνŠΈλ₯Ό ν•˜λ‚˜λ‘œ λͺ¨μ•„μ„œ, λ‹€μŒκ³Ό 같이 λ„€κ°€μ§€ λ²”μ£Όλ‘œ λ‚˜νƒ€λƒ„

    jetpack

    ​

android jetpack은 κΈ°λ³Έ Android ν”Œλž«νΌμ— μ†ν•˜μ§€ μ•Šμ€ "λ³„λ„μ˜" λΌμ΄λΈŒλŸ¬λ¦¬λ‘œμ„œ μ œκ³΅λœλ‹€.

λ˜ν•œ android jetpack은 νŠΉμ • 버전에 관계 없이 κΈ°λŠ₯을 μ œκ³΅ν•˜λ„λ‘ λΉŒλ“œλ˜κ³  이전 λ²„μ „κ³Όμ˜ ν˜Έν™˜μ„±μ„ μ œκ³΅ν•˜κΈ° λ•Œλ¬Έμ—, λ‹€μ–‘ν•œ λ²„μ „μ˜ ν”Œλž«νΌμ—μ„œ 앱을 μ‹€ν–‰ν•  수 μžˆλ‹€.

μƒˆλ‘­κ²Œ μΆ”κ°€ 된 것

  • WorkManager
  • Navigation
  • Paging
  • Slices
  • Android KTX

####μš©μ–΄μ •λ¦¬

  • μ»΄ν¬λ„ŒνŠΈ: μœ μ €κ°€ μ‚¬μš©ν•˜λŠ” μ‹œμŠ€ν…œμ— λŒ€ν•œ μ‘°μž‘μž₯치

2. Permission

  • Android 6.0 Marshmallow 이후, 선택적인 κΆŒν•œ λΆ€μ—¬ 방식 채택
  • 6.0미만 λ²„μ „μ—μ„œλŠ” androidMainfest.xml에 κΆŒν•˜λŠ” μ„€μ •ν•˜λŠ” κ²ƒλ§ŒμœΌλ‘œ 영ꡬ적으둜 μ•±μ˜ κΆŒν•œμ„ 선택할 수 μžˆμ—ˆμ§€λ§Œ, 6.0μ΄μƒμ—μ„œλŠ” 비동기, μ½œλ±… ν˜•νƒœλ‘œ μ•± μ‹€ν–‰ μ‹œμ— μ•± κΆŒν•œμ„ μ–Έμ œλ“ μ§€ μ‹œμŠ€ν…œ μ„€μ •μ—μ„œ μ·¨μ†Œν•  수 μžˆμœΌλ―€λ‘œ, 맀번 νŠΉμ • κΆŒν•œμ΄ ν•„μš”ν•œ κΈ°λŠ₯을 μ‹€ν–‰ν•˜κΈ° 전에 λ°˜λ””μ‹œ κΆŒν•œ νšλ“ μ—¬λΆ€λ₯Ό 확인해야 ν•œλ‹€λŠ” 점이 μžˆλ‹€.

μ•± κΆŒν•œ νšλ“ μˆœμ„œ

μ•± κΆŒν•œ νšλ“ μˆœμ„œ

λ¨Όμ € AndroidMainfest.xml에 κΆŒν•œμ„ μ„€μ •ν•œ ν›„

<uses-permission android:name="android.permission.CALL_PHONE" />

μ‚¬μš©μžμ˜ os 버전이 λ§ˆμ‹œλ©œλ‘œμš° 이상인지 μ²΄ν¬ν•œλ‹€.

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { 

}

###3.Animation

κ°œμš”

μ• λ‹ˆλ§€μ΄μ…˜μ€ μ‚¬μš©μžμ—κ²Œ μ•±μ˜ μ§„ν–‰ 상황을 μ•Œλ¦¬λŠ” μ‹œκ°μ  λ‹¨μ„œλ₯Ό μΆ”κ°€ ν•  수 있음

UIκ°€ μƒνƒœλ₯Ό λ°”κΏ€λ•Œ μœ μš©ν•¨(예 μƒˆ λ‚΄μš©λ‘œλ“œ λ˜λŠ” μƒˆ μž‘μ—…μ„ ν•  λ•Œ)

더 높은 ν’ˆμ§ˆμ˜ λ³΄μ—¬μ§€λŠ” 것 처럼 λŠλ‚Œμ„ μ œκ³΅ν•¨

Animate bitmaps

μ•„μ΄μ½˜μ΄λ‚˜ μΌλŸ¬μŠ€νŠΈλ ˆμ΄μ…˜κ³Ό 같은 λΉ„νŠΈ λ§΅ κ·Έλž˜ν”½μ„ μ• λ‹ˆλ©”μ΄μ…˜μœΌλ‘œ λ§Œλ“€λ €λ©΄ drawable animation APIλ₯Ό μ‚¬μš©ν•΄μ•Ό ν•œλ‹€.

일반적으둜 μ΄λŸ¬ν•œ μ• λ‹ˆλ©”μ΄μ…˜μ€ drawable resource둜 μ •μ μœΌλ‘œ μ •μ˜ 됨

runtime에 μ• λ‹ˆλ©”μ΄μ…˜μ— λŒ€ν•œ 행동을 μ •μ˜ ν•  수 μžˆλ‹€.

예λ₯Ό λ“€μ–΄ μž¬μƒ λ²„νŠΌμ„ νƒ­ν•˜λ©° μΌμ‹œ 쀑지 λ²„νŠΌμœΌλ‘œ λ³€ν™˜λ˜μ–΄ 두 μž‘μ—…μ΄ κ΄€λ ¨λ˜μ–΄ μžˆλ‹€λŠ” 것을 μ‚¬μš©μžμ—κ²Œ μ•Œλ¦¬λŠ” 쒋은 방법이면 λ‹€λ₯Έ ν•˜λ‚˜λ₯Ό λˆ„λ¦¬λ©΄ λ‹€λ₯Έ λ²„νŠΌμ΄ ν‘œμ‹œλ©

#####- AnimationDrawable μ‚¬μš©

μ• λ‹ˆλ©”μ΄μ…˜μ„ λ§Œλ“œλŠ” ν•œ κ°€μ§€ 방법은 Drawablesν΄λ”μ˜ 사진을 Drawble resouce에 차래둜 λ‘œλ“œν•˜μ—¬ μ• λ‹ˆλ§€μ΄μ…˜μ„ λ§Œλ“œλŠ” 것이닀. 이것은 필름 λ‘€ 처럼 μˆœμ„œλŒ€λ‘œ μž¬μƒλ˜λŠ” μ μ—μ„œ 전톡적인 μ• λ‹ˆλ§€μ΄μ…˜μ΄λ‹€. AmimationDrawble ν΄λž˜μŠ€λŠ” Drawable μ• λ‹ˆλ©”μ΄μ…˜μ˜ κΈ°μ΄ˆμ΄λ‹€.

AnimationDrawable 클래슀 APIλ₯Ό μ‚¬μš©ν•˜μ—¬ μ½”λ“œμ—μ„œ μ• λ‹ˆλ©”μ΄μ…˜ ν”„λ ˆμž„μ„ μ •μ˜ ν•  μˆ˜λŠ” μžˆμ§€λ§Œ μ• λ‹ˆλ©”μ΄μ…˜μ„ κ΅¬μ„±ν•˜λŠ” ν”„λ ˆμž„μ„ λ‚˜μ—΄ν•˜λŠ” xml파일둜 κ°„λ‹¨ν•˜κ²Œ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

xmlνŒŒμΌμ€ <animation-list>루트 λ…Έλ“œμ˜ μš”μ†Œμ™€ <item> 각 ν”„λ ˆμž„μ„ μ •μ˜ν•˜λŠ” 일련의 ν•˜μœ„ λ…Έλ“œλ‘œ ꡬ성됨

<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
    android:oneshot="true">
    <item android:drawable="@drawable/rocket_thrust1" android:duration="200" />
    <item android:drawable="@drawable/rocket_thrust2" android:duration="200" />
    <item android:drawable="@drawable/rocket_thrust3" android:duration="200" />
</animation-list>

android:oneshot 의 속성을 true둜 μ„€μ •ν•˜λ©΄ ν”„λ ˆμž„μ΄ ν•œ 번만 μˆœν™˜ ν•œ ν›„ λ§ˆμ§€λ§‰ ν”„λ ˆμž„μ„ μ€‘μ§€ν•˜κ³  μœ μ§€ ν•©λ‹ˆλ‹€. false둜 μ„€μ •ν•˜λ©΄ μ• λ‹ˆλ©”μ΄μ…˜μ΄ λ°˜λ³΅λ©λ‹ˆλ‹€.

AnimationDrawable rocketAnimation;

public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.main);

  ImageView rocketImage = (ImageView) findViewById(R.id.rocket_image);
  rocketImage.setBackgroundResource(R.drawable.rocket_thrust);
  rocketAnimation = (AnimationDrawable) rocketImage.getBackground();
//이벀트 처리 λ¦¬μŠ€λ„ˆ λ©”μ†Œλ“œλ₯Ό ν†΅ν•΄μ„œ νŠΉμ • 이벀트 λ°œμƒμ‹œ start() λ©”μ†Œλ“œλ‘œ μ• λ‹ˆλ©”μ΄μ…˜μ„ μ‹€ν–‰ν•˜λŠ” 것이 κ°€λŠ₯ν•˜λ‹€.
  rocketImage.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View view) {
        rocketAnimation.start();
      }
  });
}

rocketAnimation.start()을 ν•˜λ©΄ μ• λ‹ˆλ©”μ΄μ…˜μ΄ 싀행이 λ©λ‹ˆλ‹€.

μ£Όμ˜μ‚¬ν•­

  • start() λ©”μ†Œλ“œλŠ” onCreate() μ—μ„œλŠ” 싀행이 λΆˆκ°€λŠ₯ν•˜κΈ° λ•Œλ¬Έμ— μ²˜μŒλΆ€ν„° μ• λ‹ˆλ©”μ΄μ…˜μ΄ μ‹€ν–‰λ˜λŠ” 것을 μ›ν•œλ‹€λ©΄ onWindowFocusChanged() λ©”μ†Œλ“œλ₯Ό μ˜€λ²„λΌμ΄λ”©ν•΄μ„œ μ‹€ν–‰ν•΄μ£ΌλŠ” 것이 κ°€λŠ₯ν•˜λ‹€.

    ​

Physics-based motion

일반적인 물리 기반 μ• λ‹ˆλ©”μ΄μ…˜μ€ λ‹€μŒκ³Ό κ°™λ‹€.

  • Spring animation

    • Lifecycle of a spring animation(μŠ€ν”„λ§ μ• λ‹ˆλ©”μ΄μ…˜ 생λͺ…μ£ΌκΈ°)

      • μŠ€ν”„λ§ 기반 μ• λ‹ˆλ©”μ΄μ…˜μ—μ„œ SpringForce 클래슀λ₯Ό μ‚¬μš©ν•˜λ©΄ μŠ€ν”„λ§μ˜ κ°•μ„±, 감쇠 λΉ„μœ¨ 및 μ΅œμ’… μœ„μΉ˜λ₯Ό μ‚¬μš©μž μ •μ˜ ν•  수 있음
      • μ• λ‹ˆλ©”μ΄μ…˜μ΄ μ‹œμž‘ 되 자마자 μŠ€ν”„λ§ λ ₯은 각 ν”„λ ˆμž„μ˜ μ• λ‹ˆλ©”μ΄μ…˜ κ°’κ³Ό 속도λ₯Ό μ—…λ°μ΄νŠΈν•©λ‹ˆλ‹€.
      • μ• λ‹ˆλ©”μ΄μ…˜μ€ μŠ€ν”„λ§ λ ₯이 ν‰ν˜•μ— 도달 ν•  λ•ŒκΉŒμ§€ κ³„μ†λ©λ‹ˆλ‹€.
      • 예λ₯Ό λ“€μ–΄ ν™”λ©΄μ—μ„œ μ•± μ•„μ΄μ½˜μ„ λ“œλž˜κ·Έ ν•œ λ‹€μŒ μ•„μ΄μ½˜μ—μ„œ 손가락을 λ–Όμ–΄ λ†“μœΌλ©΄ λ‚˜μ€‘μ— 보이지 μ•Šμ§€λ§Œ μ΅μˆ™ν•œ λ°©μ‹μœΌλ‘œ μ›λž˜ μœ„μΉ˜λ‘œ λŒμ•„κ°‘λ‹ˆλ‹€.
    • Build a spring animation(μŠ€ν”„λ§ μ• λ‹ˆλ©”μ΄μ…˜ λ§Œλ“€κΈ°)

      • μŠ€ν”„λ§ μ• λ‹ˆλ©”μ΄μ…˜ 클래슀λ₯Ό μ‚¬μš©ν•˜λ €λ©΄ ν”„λ‘œμ νŠΈμ— 지원 라이브러리λ₯Ό μΆ”κ°€ν•΄μ•Όν•©λ‹ˆλ‹€.

        dependencies {
              implementation 'com.android.support:support-dynamic-animation:27.1.1'
          }
        

        ​

      • κΈ°λ³Έ λ‹¨κ³„λŠ” SpringAnimation 클래슀의 μΈμŠ€ν„΄μŠ€λ₯Ό λ§Œλ“€κ³  λͺ¨μ…˜ λ™μž‘ 맀개 λ³€μˆ˜λ₯Ό μ„€μ •ν•œλ‹€

        final View img = findViewById(R.id.imageView);
        // 뷰의 translationY 속성에 μ• λ‹ˆλ©”μ΄μ…˜μ„ μ μš©ν•˜λŠ” μŠ€ν”„λ§ μ• λ‹ˆλ©”μ΄μ…˜ μ„€μ •
        // 0μ—μ„œ μŠ€ν”„λ§ μœ„μΉ˜
        final SpringAnimation springAnim = new SpringAnimation(img, DynamicAnimation.TRANSLATION_Y, 0);
        

        μŠ€ν”„λ§ 기반 μ• λ‹ˆλ©”μ΄μ…˜μ€ λ·° 객체의 μ‹€μ œ 속성을 λ³€κ²½ν•˜μ—¬ ν™”λ©΄μ—μ„œ 뷰의 μ• λ‹ˆλ©”μ΄μ…˜μ„ λ§Œλ“€ 수 μžˆμŠ΅λ‹ˆλ‹€. μ‹œμŠ€ν…œμ—μ„œ λ‹€μŒλ³΄κΈ°λ₯Ό μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

        • TRANSLATION_X, TRANSLATION_Y: 이 속성은 λ ˆμ΄μ•„μ›ƒ μ»¨ν…Œμ΄λ„ˆμ—μ„œ μ„€μ • ν•œ μ™Όμͺ½ μ’Œν‘œ, μœ„μͺ½ μ’Œν‘œ 및 κ³ λ„μ—μ„œ λΈνƒ€λ‘œ λ·°κ°€μžˆλŠ” μœ„μΉ˜λ₯Ό μ œμ–΄ν•©λ‹ˆλ‹€.
      • Demping ratio(감쇠 λΉ„μœ¨)

        감쇠 λΉ„μœ¨μ„ μ‚¬μš©ν•˜μ—¬ 진동이 ν•œ λ°”μš΄μŠ€μ—μ„œ λ‹€μŒ λ°”μš΄μŠ€λ‘œ μ–Όλ§ˆλ‚˜ 빨리 κ°μ†Œν•˜λŠ”μ§€ μ •μ˜ ν•  수 μžˆμŠ΅λ‹ˆλ‹€

        • getSpring () λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•˜μ—¬ 감쇠 λΉ„μœ¨μ„ μΆ”κ°€ ν•  μŠ€ν”„λ§μ„ κ²€μƒ‰ν•œλ‹€
        • setDampingRatio () λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•˜κ³  μŠ€ν”„λ§μ— μΆ”κ°€ ν•  감쇠 λΉ„μœ¨μ„ μ „λ‹¬ν•œλ‹€. λ©”μ„œλ“œλŠ” 감쇠 λΉ„μœ¨μ΄ μ„€μ •λœ μŠ€ν”„λ§ λ ₯ 객체λ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.
          • 1.DAMPING_RATIO_HIGH_BOUNCY
          • 2.DAMPING_RATIO_MEDIUM_BOUNCY
          • 3.DAMPING_RATIO_LOW_BOUNCY
          • 4.DAMPING_RATIO_NO_BOUNCY

κΈ°λ³Έ 감쇠 λΉ„μœ¨μ€ DAMPING_RATIO_MEDIUM_BOUNCYμ„€μ •λ©λ‹ˆλ‹€.

final View img = findViewById(R.id.imageView);
final SpringAnimation anim = new SpringAnimation(img, DynamicAnimation.TRANSLATION_Y);
…
//Setting the damping ratio to create a low bouncing effect.
anim.getSpring().setDampingRatio(DAMPING_RATIO_MEDIUM_BOUNCY);

4.ViewModel

λ“€μ–΄κΈ°κΈ° 전에...

μ•ˆλ“œλ‘œλ“œ μ•± 개발 μ‹œ ν•œ 번쯀 κ²ͺμ–΄ λ³Έ 어렀움 쀑 ν•˜λ‚˜λŠ” μ•ˆλ“œλ‘œμ΄λ“œ μ»΄ν¬λ„ŒνŠΈμ˜ 수λͺ…μ£ΌκΈ°κ°€ μ•„λ‹κΉŒ μ‹Άλ‹€. 특히 λŸ°νƒ€μž„μ— ν™”λ©΄ λ°©ν–₯이 μ „ν™˜λ˜κ±°λ‚˜ μ–Έμ–΄, κΈ€κΌ΄ 배율과 같은 κΈ°κΈ° ꡬ정이 λ³€κ²½λ˜λŠ” 경우λ₯Ό 닀루렀면 μ„Έμ‹¬ν•œ μ²˜λ¦¬κ°€ ν•„μš”ν–ˆλ‹€.

μ΄λŸ¬ν•œ 변경이 μΌμ–΄λ‚œλŠ” 경우, μ•ˆλ“œλ‘œμ΄λ“œλŠ” μ‹€ν–‰ 쀑인 μ•‘ν‹°λΉ„ν‹°λ₯Ό μ’…λ£Œν•˜κ³ , λ©”λͺ¨λ¦¬μ—μ„œ 제거 ν›„ λ‹€μ‹œ μƒμ„±νžˆκΈ° λ•Œλ¬Έμ— 이 κ³Όμ •μ—μ„œ 앑티비티에 μ’…μ†λœ UI데이터λ₯Ό μœ μ§€ν•˜λŠ” 것은 손이 많이 κ°€λŠ” μž‘μ—…μ΄λ‹€.

ViewModelꡬ성 μš”μ†Œ

μƒˆλ‘œμš΄ μ•„ν‚€ν…μ²˜ ꡬ성 μš”μ†Œ 쀑 κ°€μž₯ μ€‘μš”ν•œ 클래슀 쀑 ν•˜λ‚˜μΈ viewModel은 UI와 κ΄€λ ¨λœ 데이터λ₯Ό λ³΄μœ ν•˜κ³  ν™”λ©΄ νšŒμ „κ³Ό 같은 ꡬ성 λ³€κ²½ 쀑에 무결성을 μœ μ§€ν•˜λ„λ‘ μ„€κ³„λ˜μ–΄ μžˆλ‹€. viewModel은 Repository와 λŒ€ν™”ν•˜κ³ , LiveDataλ₯Ό 가져와 λ·°μ—μ„œ λ³Ό 수 μžˆλ„λ‘ ν•œλ‹€. ꡬ성 λ³€κ²½ ν›„ Repositoryλ₯Ό μƒˆλ‘œ ν˜ΈμΆœν•  ν•„μš”κ°€ μ—†μœΌλ―€λ‘œ μ½”λ“œκ°€ 많이 μ΅œμ ν™”λ˜μ—ˆλ‹€

γ…‡γ„΄

일반적으둜 μ‹œμŠ€ν…œμ΄ 처음으둜 ν™œλ™ 객체의 onCreate () λ©”μ†Œλ“œλ₯Ό 호좜 ν•  λ•Œ ViewModel을 μš”μ²­ν•œλ‹€. μ‹œμŠ€ν…œμ€ νœ΄λŒ€ν° 화면을 νšŒμ „ ν•  λ•Œμ™€ 같이 ν™œλ™μ΄ 끝날 λ•ŒκΉŒμ§€ μ—¬λŸ¬ 번 onCreate ()λ₯Ό 호좜 ν•  수 μžˆμŠ΅λ‹ˆλ‹€. ViewModel은 μ•‘ν‹°λΉ„ν‹°κ°€ λλ‚˜κ³  μ†Œλ©Έ 될 λ•ŒκΉŒμ§€ ViewModel을 처음 μš”μ²­ν–ˆμ„ λ•ŒλΆ€ν„° μ‘΄μž¬ν•œλ‹€.