- 하드코딩 대신 res/values/strings.xml에 정의하고 사용하는 이유 : 다국어 지원을 위함
- 나인 패치(9-Patch) 이미지 : 이미지에서 늘어날 수 있는 영역과 원본 크기대로 표시되어야 할 영역을 구분하여, 리니어 레이아웃 등을 사용할 때, 원본 이미지가 깨지지 않으면서 자연스럽게 확장되도록 만들어진 것
- Constraint Widget은 최소 3개의 연결이 있어야 오류가 발생하지 않는다.
ㄴ(추가) 정확히는 Start or End 중 1개, Top과 Bottom 중 하나씩은 제약조건이 필수적이다.
ㄴ(추가) ConstraintLayout에서 절대 배치는 사용하지 말 것
- res/values/Style.xml에 커스텀 디자인을 정의할 수 있다. (커스텀 컴포넌트 아님)
LinearLayout
ㄴ LinearLayout
ㄴ RelativeLayout
ㄴ ConstraintLayout
위의 구조로 UI 구현 연습해보기
-> 새롭게 알게된 점 RelativeLayout에서 아래를 의미하는 키워드는 below이다.
<Button
android:id="@+id/button6"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/button4"
android:layout_marginLeft="10dp"
android:text="Button6" />
4주차 학습 내용 (추가 03/19)
- R.java파일 : app이 컴파일 될 때, 자동 생성됨
- AndroidManifest.xml에서 <activity>중 <intent-filter>로 category를 LAUNCHER로 준 액티비티가 가장 처음 실행되는 액티비티다.
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
- 안드로이드 4대 컴포넌트
1. Activity
설명 : 사용자가 직접 상호작용하는 화면
역할 : UI 담당, 사용자의 입력에 반응하는 이벤트 기반 프로그래밍 가능
2. Service
설명 : 백그라운드에서 오랜 시간 동안 실행되어야 하는 작업을 수행 (ex. 음악 재생, 파일 다운로드 등)
역할 : App의 백스테이지에서 일어나는 작업을 담당
3. Broadcast Receiver -> BLE 통신 때 썼던 것 같은데
설명 : 안드로이드 시스템으로부터 발송되는 다양한 이벤트나 정보를 App이 받을 수 있게 해줌
(ex. 배터리 부족 경고, 화면 꺼짐, BLE 통신, Wi-Fi 등등?)
역할 : App은 broadcast message를 구독하고, 해당 이벤트가 발생했을 때, 반응할 수 있음
4. Content Provider
설명 : App 간에 데이터 공유를 가능하게 함
역할 : 데이터를 저장하고 관리하는 DB의 역할을 하며, 다른 App에 안전하게 데이터를 공유함
- 인텐트의 2가지 유형
1. 명시적 인텐트(Explicit Intent) : 시작할 구성 요소의 이름을 인텐트 객체에 설정하고 이를 startActivity() or startService()에 넘긴다.
2. 암시적 인텐트(Implicit Intent) : 특정한 컴포넌트를 명시하지 않고, 수행하고자 하는 작업(전화걸기, 지도보기 등)을 인텐트 객체에 설정하여 startActivity()에 넘긴다.
- 인텐트 객체 파라미터 분석
1. Name(컴포넌트 이름) : 타겟 컴포넌트 이름을 명시(명시적 인텐트에서 사용함)
val intent = Intent(this, AnotherActivity::class.java)
2. Action(작업) : 인텐트가 수행해야 할 일반적인 작업을 정의
Intent.ACTION_VIEW // 사용자에게 데이터를 보여줄 때 사용
Intent.ACTION_DIAL // 전화 다이얼을 열기 위해 사용
3. Data(데이터) : 작업에 필요한 데이터(URI, 전화번호 등)
Uri.parse("tel:114")
-> 데이터는 보통 Uri 객체로 액션과 결합하여 사용
val call_intent = Intent(Intent.ACTION_DIAL, Uri.parse("tel:114"))
startActivity(call_intent)
4. Category(카테고리) : 인텐트의 유형을 구체적으로 지정, 어떤 컴포넌트가 처리할 수 있는지 알려줌
Intent.CATEGORY_HOME : 홈 화면 애플리케이션을 시작할 때 사용
5. Extras(엑스트라) : 복잡한 데이터를 인텐트에 전달하기 위한 키-값 쌍의 추가 정보 - 많이 사용함~
intent.putExtra("key", "value") // 다음 액티비티에 데이터 전달 가능
- finish()를 통해서 현재의 액티비티를 종료할 수 있음 -> onDestroy() 호출됨
- 2개의 컴포넌트가 같은 메서드를 호출해도, 해당 메서드는 view.getId()를 통해 호출한 컴포넌트를 구분할 수 있음
fun doOnBtnClick(view: View) {
when (view.getId()) {
R.id.buttonDialActivity -> {}
R.id.buttonMapActivity -> {}
}
}
- 암시적 인텐트를 수신하는 App을 만들 경우, Manifest.xml의 해당 activity 하위 요소로 인텐트 필터를 추가해야 한다.
ex) PDF 뷰어 App을 만든다면, action.view라는 action을 가진 intent-filter를 추가로 명시해야 함
--> 그래야 PDF 파일을 열 때, Viewer app으로 내 앱이 보임
<activity android:name=".SecondActivity"
<!--라벨값-->
android:label="Second Activity">
<!--추가된 인텐트 필터 시작-->
<intent-filter>
<action android:name="android.intent.action.DIAL" />
<category android:name="android.intent.category.DEFAULT" />
<data android:scheme="tel" />
</intent-filter>
<!--추가된 인텐트 필터 끝-->
</activity>
- 만약, label 값이 지정되어 있지 않다면 아래와 같이 지정하는 것이 좋다? 그 이유는,,
-> 암시적 인텐트를 통과시킨 인텐트 필터가 여러 곳에 있다면 anroid:label 속성 값을 바탕으로 나열되기 때문에!
'Android' 카테고리의 다른 글
[학습 1장] findViewById / Kotlin Extensions / ViewBinding / DataBinding 정리 (0) | 2024.03.28 |
---|---|
[docs] 앱 아키텍처 가이드 읽어보기 (1) | 2024.03.22 |
호출한 액티비티에서 결과 가져오기, registerForActivityResult (0) | 2024.03.20 |
ViewPager2 사용해서 반복되는 화면 작업하기 (0) | 2024.02.20 |
많이 사용했지만, 까먹는 단축키 (1) | 2024.02.16 |