로딩...
android
개발
개발자 콘솔
물리 디바이스 연결
- 실기기 개발자모드 활성화
- 설정 -> 시스템 -> 휴대폰 정보 -> 소프트웨어 정보 -> 빌드 번호 7회 터치
- USB 디버깅 활성화
- 설정 -> 시스템 -> 개발자 옵션 -> USB 디버깅 활성화 -> 추가 다이얼로그 확인
adb devices
로 물리 디바이스가 연결된 것 확인 가능
SHA-1 인증서 디지털 지문
- keytool 참고
- google 인증에서 사용됨
Android android-studio
- Actions -> New Module
mac -> android 파일복사
android file transfer 를 통한 복사
brew install --cask android-file-transfer
- 설치하고 나서 안드로이드 기기를 연결하면, finder 형태로 디바이스 스토리지가 보인다
adb 를 이용한 복사
adb push app/build/outputs/apk/release/app-release.apk /storage/self/primary/Download/
설정
Android Studio
Auto import
- Settings -> Editor -> General -> Auto import -> Kotlin
- Add unambiguous imports on to fly
- Optimize imports on the fly (for current project)
Emulator|에뮬레이터
- 아래서 위로 스와이프 -> 시스템
- Auto Rotate
- System Language -> 테스트할 언어 첫번째로
Layout|레이아웃
- LinearLayout
- RelativeLayout
- FrameLayout
- GridLayout
- ConstraintLayout
viewBinding
- as-is
overridefunonCreate(savedlnstanceState: Bundle?) {
super.onCreate(savedlnstanceState)
setContentView(R.layout.main_activity)
findViewById(R.id.text1)
}
- to-be
findViewById 사용을 피하기 위해서 gradle 에서
viewBinding
설정이 사용된다.
android {
viewBinding {
enabled true
}
}
overridefunonCreate(savedlnstanceState: Bundle?) {
super.onCreate(savedlnstanceState)
val binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
}
Event|이벤트
- Single Abstract Method(SAM) - 오브젝트 대신 메소드를 할당하여 처리한다.
override fun onCreate(savedlnstanceState: Bundle?) {
super.onCreate(savedlnstanceState)
val binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
binding.startButton.setOnClickListener {
// 이벤트 처리
}
}
Life Cycle|생명주기
- 액티비티 시작
- onCreate call setContentView
- onStart
- onResume
- 액티비티 실행(setContentView 에서 지정한 UI)
- onPause 포커스가 없는상태, 화면 분할 등 -> onResume
- onStop 비활성화 상태, 홈 버튼을 눌러서 나간 상태 등-> onRestart -> onStart
- onDestroy -> onCreate
- 액티비티 종료 @todo restart 등 추가 필요
화면을 회전화는 경우
onResume -> onPause -> onStop -> onSaveInstanceState -> onDestroy -> onCreate -> onStart -> onRestoreInstanceState -> onResume
Intent|인텐트
인텐트를 통해 시스템에 액티비티의 생성을 요청한다.
val intent = Intent(this, MainActivity::class.java)
intent.putExtra("key", "value")
startActivity(intent)
startActivityForResult(intent, intrequestCode)
생성 후 받는 쪽에서는 getIntent
를 통해서 인텐트를 얻고 인자를 가져올 수 있다.
인텐트 실행시에 특정 앱을 지정하고싶다면 패키지를 설정한다.
intent.setPackage("com.google.android.apps.maps")
error
없는 activity 를 지정한 경우(없는 intent)
실행한 쪽에서 에러가 난다.
Coludn't sign in
There was a problem communicating with Google servers.
액티비티 실행
명시적
앱의 내부에서는 명시적으로 클래스를 지정해서 실행, 암시적으로도 가능하나 권장된다. 암시적으로는 실행할 수 없는 경우도 존재한다.
val intent = Intent(this, MainActivity::class.java)
암시적
외부에서 액티비티를 실행할 수 있도록 manifest 파일에 intent 설정을 해줘야한다.
<activity android:name=".oneActivity" />
<activity android:name=".TwoActivity">
<intent-filter>
<actlon android:name="ACTION EDIT" />
</intent-filter>
</activity>
<service ... />
<receiver ... />
인텐트 필터
데이터 전달
- android:name 은 유일하지 않아도된다. 기능을 보여주는 이름을 사용하자. eg, android.intent.action.MAIN - android:name -> android.intent.category.LAUNCHER - - 필요한 데이
런처앱은
android.intent.category.LAUNCHER
카테고리의action.intent.action.MAIN
을 가져와서 리스트업하는 액티비티다.
Resource|리소스
구성 한정자
- [URL] https://developer.android.com/guide/topics/resources/providing-resources?hl=ko 해당 리스트를 통해 리소스 디렉토리에 suffix 를 붙임으로써 특정 상황에서 사용되는 리소스 임을 명시한다. 언어, 디바이스 방향 상태, 해상도 등이 포함된다. 중복 명시도 가능한데 순서가 존재한다.
- res/layout/activity_main.xml - 세로 모드에서 사용
- res/layout/
land
/activity_main.xml - 가로 모드에서 사용
error
설치 실패
- firebase app distribution, app tester 등을 통해서 앱을 설치하려고하는데 계속 에러가 난다면 빌드를 universal apk 로 진행한다 [diary] diary:2023-12-31
배포 버전에서 구글로그인 로그인 안됨
- 플레이스토어 버전은 자체 핑거 프린트를 가지고 있음
- play-console 에 접속 -> 설정 -> 앱 서명 -> SHA-1 지문 복사
- console.cloud.google.com -> SHA-1 참조하여 OAuth 2.0 클라이언트 ID 생성 -> 추가적으로 제공되는 json 은 신경쓸 필요 없음