Skip to content

Latest commit

Β 

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을 처음 μš”μ²­ν–ˆμ„ λ•ŒλΆ€ν„° μ‘΄μž¬ν•œλ‹€.