본문 바로가기

CS(Computer Science)/안드로이드(studio)

안드로이드 스튜디오(Android Studio)

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보다 깔끔하고 가독성 좋음)

 

<참고>  apphappy.tistory.com/63

 

 

 

 

 

<권한>

-uses-permission 메니페스트에 기록해서 권한 얻음,  앱 설치시에 허락 받음.

-일부 중요한 권한들은 위험권한으로 분류되어 앱 실행할때 다시 권한허락 받음

 

 

 


나인패치 : 이미지를 나인패치 이미지를 이용하면, 이미지를 확대해도 픽셀에 의해 깨지는 현상 완화

 

반응형