View : 화면에 보이는 각각의 것들, layout, control 이나 위젯(버튼 ,text view 등)등이라 불리는 UI구성 요소
View Group : 뷰들을 포함하는 것(ex - constraint layout)
drawble폴더 : 이미지 주로 drawble에 저장 (drawble xml 파일로 이미지 만들거나 상태에 따른 이미지 설정 가능)
scrollView -> layout을 넣어서 활용가능
레이아웃 인플레이션 : XML 레이아웃에 정의된 내용이 메모리에 객체화되는 과정(setContentView())
(부분화면 inflation은 직접 LAYOUT_INFLATER_SERVICE를 이용)
ex) ( inflater.inflate(R.layout a,container,true) -> a 레이아웃을 container frameLayout에 인플레이션)
인텐트(intent) : system에게 요청하거나 데이터를 전달할 때 System이 알아들을 수 있는 객체(format)
(서로 다른 앱끼리, 서로 다른 구성요소끼리 intent를 이용해서 정보 주고받음)
-데이터는 intent 안의 bundle에 저장
메니페스트 : 앱이 설치되는 시점에 ,단말 OS쪽에 우리 앱에 대한 정보(구성 요소,권한 등)를 알려주는 파일
fragment : 하나의 액티비티가 여러 개의 화면을 가지도록 만들기위해 고안된 개념
activity위에서 동작하는 작은 activity (activity처럼 xml과 자바소스코드 쌍으로 이루어짐)
( 화면전환할 때 system까지 갈 필요가 없음) , 마치 process 와 thread느낌
Gradle : 앱을 빌드할 때 쓰임
dependencies : 외부 라이브러리 사용시 기록
( 반영할 때 sync now 를 눌러야 함, 안뜨면 코끼리 아이콘 누르기)
task - 서로다른 앱 프로세스끼리 부드럽게 하나의 앱처럼 이어줌
콜백 함수 ->프로그래머가 그 함수의 사용을 명령해주는 것이 아닌 이벤트, 메시지, 알람을 받았을때 자동으로 실행되는 함수 (called at the back)
<Layout>
ConstraintLayout : 제약 조건을 사용해 화면 구성(점과 연결선들을 이용)
LinearLayout : 한 쪽 방향으로 차례대로 뷰를 추가하며 화면 구성
- 버튼 0dp로 하고 버튼마다 weight주면 weight비율에 맞게 크기조정됨 (ex - 1:1:1, 2:1:1)
RelativeLayout : 속성을 이용해 상대적으로 구성 (어느 버튼 위, 어느 버튼 아래 등)
(RelativeLayout업그레이드 느낌이 ConstraintLayout)
FrameLayout : 한번에 하나의 뷰만 보여줌 (중첩으로 쌓임)
TableLayout : 가로 세로 격자 형태로쌓음, 잘쓰지는 않음.
<안드로이드 애플리케이션의 네 가지 구성요소>
구성요소는 안드로이드 시스템(OS)에서 관리함 (manifests 에 기록)
각 구성요소 사이에 데이터 전달은 intent를 사용
1.액티비티 ->XML 레이아웃 파일 + 자바 소스 코드 파일로 이루어짐. (모바일에서 한 화면)
2. 서비스 -> 화면없이 백그라운드로 실행됨 (ui없이 백그라운드에서 장시간 수행되는 컴포넌트)
3. 브로드캐스트 수신자 -> 이벤트 모델로 수행되는 컴포넌트 , 기기에서 브로드캐스트를 할 때 받아서 사용. ex)문자
4. 컨텐츠 제공자 ->ex 보안때문에 파일을 막 가져다 쓰지못하게 앨범쪽에서 컨텐츠 제공자를 제공해줌
- 콘텐트 제공자는 어플리케이션 내에서 사용할수 있는 데이터를 '공유'하기 위한 컴포넌트
- 주소록, 사진, 등 폰내의 데이터를 가져올수 있음.
<1. Activity>
<화면 전환>
startActivity : 해당activity 띄워줌 (띄워진 창에서는 getIntent로 intent얻음)
startActivityForResult(intent, 35) : 요청코드를 함께 보내면 응답을 보낼 때 어떤 화면에서 응답을 받았는지 알 수 있음
(onActivityResult 함수로 응답 데이터를 받을 수 있음)
intent.putExtra -> 데이터 넣기
intent.getStringExtra -> 데이터 얻기
intent.getSerializableExtra -> 객체 얻기
<Activity 플래그>
intent 에 플래그 옵션정보를 줌(intext.setFlags()) ->ex ) 인텐트로 설정하고 그다음 startActivity()
FLAG_ACTIVITY_SINGLE_TOP : 같은 activity가 activity_stack에 있으면 재사용 ->재사용 되는경우 oncreate이 아니라
onNewIntent가 실행됨
FLAG_ACTIVITY_CLEAR_TOP : 호출할 때 재사용되는 activity 위의 activity모두 제거
FLAG_ACTIVITY_NO_HISTORY : 해당 activity를 stack에 저장 안함.
FLAG_ACTIVITY_NEW_TASK : 서비스나 브로드캐스트 수신자같은 화면이 없는 곳에서 ACTIVITY를 띄울 때 필요한 옵션
<객체 전달>
<serializable> (arrayList 만 되나?)
- 객체를 전달하거나 저장할 때 데이터를 뽑아 내는 방법 (객체 -> 바이트, 객체를 바이트로 직렬화)
intent.putExtra -> intent에 객체 넣기
intent.getSerializableExtra -> 객체 얻기
<parcelable> (권장) (내가 만든 class같은거 다 가능)
- parcelable interface를 상속받아서 구현한 객체는 putExtra, getExtra로 전달가능.
intent.putExtra -> intent에 객체 넣기
intent.getParcelableExtra ->intent에서 객체 얻기
<Activity 수명주기(life cycle)>
onCreate() : activity가 생성될 때 호출되는 함수
onStart() : activity가 시작될 때 호출되는 함수(ex - stop을 풀 때)
*onResume() : activity가 재개될 때 호출되는 함수(ex - pause를 풀 때)
*onPause() : activity가 일시정지될 때 호출되는 함수(ex - 대화상자 같은 것에 포커스를 뺏길 때)
(데이터를 저장하는데 가장 많이 씀-SharedPreferences 이용, onResume()에서 복구)
(SharedPreferences는 단말내에 파일로 저장이 되기에 앱이 꺼져도 저장되어있음)
onStop() : activity가 중지될 때 호출되는 함수(ex - 다른 activity에 가려졌을 때)
onDestroy() : activity가 제거될 때 호출되는 함수
<참고> on함수들은 대체로 어떤 이벤트가 발생하면 자동으로 호출됨
<2. 서비스(service)>
서비스 : 화면없는 상태에서 백그라운로 실행됨(프로세스가 종료되어도 시스템에서 자동으로 재시작함)
(ex - 앱이 화면에 없는데 카톡이 오면 카카오톡을 띄워줌)
- onCreate(), onDestroy() 수명주기 존재.
-실행과 데이터 전달 역시 activity같이 intent를 이용함
- 재실행될 때(재 호출될 때) onCreate()가 아닌 onStartCommand()함수가 호출됨. 그러므로
intent의 데이터는 주로 onStartCommand()로 받음
(activity는 재실행되거나 재 호출될 때 onCreate()대신 onNewIntent()호출)
- (처음 이후)startService를 할때 주로 데이터를 넘겨주기위해 자주 사용함
-thread같이 동시에 실행되는게 아니라 activity처럼 main thread로 실행됨
(즉 activity 코드 실행되고 있으면 끝나고 service코드 실행되는 이런식, 동시x)
<3. 브로드캐스트 수신자(broadcast receiver)>
- 브로드캐스팅되는 인텐트를 받을 수 있음.
- 서비스 처럼 백그라운드로 동작함.
- manifest안에 intent-filter로 지정해 놓은 브로드캐스팅 intent를 받으면 onReceive가 호출됨.
- broadcast송신도 가능
<touch event>
view.setOnTouchListener -> 터치되는 이벤트를 listen함
->터치down, 터치up, 움직이는 순간순간 onTouch()호출됨 (action , 좌표 등 정보 줌)
-> onTouch의 event를 GestureDetector객체로 넘겨주면 여러 기능 사용가능(ex 속도 측정)
<key event>
- onKeyDown 같은 키 함수들을 오버라이딩 해서 눌렸을 때 발생하는 이벤트를 조작 가능
(true 반환하면 이후의 동작 무시)
<뷰페이저>
fragment와 adapter이용
<단말 방향 전환>
- 단말 방향이 전환되면 activity를 종료했다가 다시 실행, 데이터 사라지는 문제
(가로는 layout-land폴더에, 세로는 layout)
-> onSaveInstanceState() 로 bundle 객체에 데이터 저장 가능 (Activity가 메모리에서 없어지는 순간 onsave발동)
(가로 세로 각각의 위젯은 findviewbyid했을 때 null인지 아닌지로 판단해도 됨)
- 만약 가로 세로 화면이 다를 필요가 없을경우, 그냥 configChanges를 manifests에 입력하면 activity가 유지됨
(Activity가 새로만들어지지 않고 그대로 사용)
<다양한 위젯들>
-toast ->대화상자
-snack bar ->바닥에서 뜨는 bar
-AlertDialog(알림 대화상자) ->예,아니오
-progress bar(막대, 원) -> 진행상태 보여줌
-seek bar -> 막대에서 위치 움직일때마다 listener호출하며 위치 넘겨줌
<애니메이션>
ex) 동작방식을 xml로 정의함(anim 폴더) -> textView.startAnimation()하면 텍스트가 움직임.
<thread>
MainThread : 기본적으로 UI를 관리하는 thread.
(다른 thread에서는 mainThread에서 관리하는 view를 바로 접근 못함- 동시 접근 문제)
- mainThread와 다른 thread와는 handler로 데이터 전달
Thread 생성 방법1 : -> 1.Thread를 상속받은 클래스를 하나 정의하고 인스턴스를 하나만든 후 인스턴스.start()하면 쓰
레드의 run()이 실행됨. (Mainthread의 위젯들을 사용 못하니 handler를 통해 사용해야함)
- mainthread에서 만든 handler로 thread데이터 전달한 후 handler에서 위젯 사용(UI갱신)
(handler를 mainthread에서 만든거기 때문에 mainthread가 접근 가능)
(다른 thread에서mainthread에서 만든 handler로 데이터 전달 가능하고,
mainthread에서 다른 thread에서 만든 handler로도 데이터 전달 )
Thread 생성 방법2 : -> AsyncTask를 상속받은 클래스를 정의하고 인스턴스를 쓰레드로 사용하면 Mainthread의 위젯들
도 handler없이 사용가능.
(AsyncTask를 사용하면 하나의 클래스 안에서 thread동작할 코드와 handler로 처리할 코드(UI 업데이트)를 한꺼번에 넣을 수 있게 해줌 - thread생성 방법 1보다 깔끔하고 가독성 좋음)
<권한>
-uses-permission 메니페스트에 기록해서 권한 얻음, 앱 설치시에 허락 받음.
-일부 중요한 권한들은 위험권한으로 분류되어 앱 실행할때 다시 권한허락 받음
나인패치 : 이미지를 나인패치 이미지를 이용하면, 이미지를 확대해도 픽셀에 의해 깨지는 현상 완화