OPEN between Secret

애플리케이션 구성하기 본문

T.N.V/안드로이드

애플리케이션 구성하기

해가꿈꾸는달 2017. 12. 19. 17:14
반응형

* 액티비티 

-> 하나의 화면을 의미.


1. 레이아웃 인플레이션(Inflation)

-> xml 레이아웃에 정의된 내용이 메모리에 로딩된 후 객체화되는 과정

-> xml 레이아웃 파일은 앱이 실행되는 시점에 로드되어 메모리에 객체화 된다.

-> xml 레이아웃 파일 안에 button 태그를 정의해 두었더라도 앱은 그 정보를 미리 알고 있는 것이 아니라 실행하면서 확인하게 된다.


* setContentView()

1. 화면에 나타낼 뷰를 지정하는 역할

2. xml 레이아웃의 내용을 메모리에 객체화 하는 역할


* 화면 전체를 보여줄 xml 말고 화면중 일부분만 차지하는 레이아웃을 불러올때는?

-> LayoutInflater 클래스를 사용

-> 시스템 서비스로 제공

-> 시스템 서비스는 단말이 시작되면서 항상 실행되는 서비스

-> getSystemService(Context.LAYOUT_INFLATER)SERVICE)


* 시스템 서비스로 제공되는 기능들은 getSystemService() 메소드를 사용하여 객체를 참조한 후 사용할 수 있음.


2. 화면 구성 과 화면 간 전환 (Intent)

안드로이드 애플리케이션 기본 구성 요소 - 

 * 중요한 이유 - 앱을 만들어 단말에 설치했을떄 안드로이드가 이들에 대한 정보를 요구하기 때문

   - 그렇다면 얘네들은 어디에 있느냐 = Manifest.xml에 이 정보들을 담고 있음.

1. 액티비티(Activity)

- 만약 새로운 액티비티를 추가한다면 동시에 이 매니페스트 파일에 그 액티비티 정보를 추가해야 함

메소드

-> startActivity()

-> 화면을 새로 띄움

-> startActivityForResult()

-> 화면을 새로 띄우고 화면으로부터 응답을 받을 수 있음

  넘기는 파라미터

->인텐트

-> 정수로 된 코드값(각각의 액티비티를 구분하기 위함)


2. 서비스(Service)


3. 브로드캐스트 수신자(Broadcast Receiver)


4. 내용 제공자(Content Provider)


3 인텐트 살펴보기

-> 다른 액티비티를 띄우거나 기능을 동작시키기 위한 수단으로 사용

-> 무언가 작업을 수행하기 위해 사용되는 일종의 명령 또는 데이터 전달 수단.

-> 애플리케이션 구성 요소가 해야 할 일을 지정

-> startActivity() 

-> 액티비티를 화면에 띄울 때 사용

-> startActivityForResult

-> startService()

-> 서비스를 시작할때

-> bindService()

-> broadcastIntent()

->브로드캐스팅을 수핼할 때 사용

기본 구성 요소

-> 액션(Action)

-> 수행할 기능

-> 데이터(Data)

-> 수행될 대상 데이터

속성 

설명 

ACTION_DIAL tel:xxxxxxxxxxx

주어진 전화번호를 이용해 전화걸기 화면을 보여줌 

ACTION_VIEW tel:xxxxxxxxxxx

주어진 전화번호를 이용해 전화걸기 화면을 보여줌. URL값의 유형에 따라 VIEW 액션이 다른 기능을 수행 

ACTION_EDIT content://contacts/people/2 

전화번호부 데이터베이스에 있는 정보 중에서 ID 값이 2인 정보를 편집하기 위한 화면을 보여줌

 ACTION_VIEW content://contacts/people

전화번호부 데이터베이스의 내용을 보여줌 

-> 명시적 인텐트(Explicit Intent)

-> 인텐트에 클래스 객체나 컴포넌트 이름을 지정하여 호출할 대상을 확실히 알 수 있는 경우

-> 암시적 인텐트(Implicit Intent)

-> 액션과 데이터를 지정하긴 했지만 호출할 대상이 달라질 수 있는 경우

-> MIME 타입에 따라 안드로이드 시스템에서 적절한 다른 앱의 액티비티를 찾은 후 띄우는 방식을 사용

-> 설치된 앱 정보를 알고있는 안드로이드 시스템이 인텐트를 이용해 요청한 정보를 처리할 수 있는 적절한 컴포넌트를 찾아본 다음 사용자에게 그 대상과 처리 결과를 보여주는 과정을 거침

** 컴포넌트란 = 액티비티와 같은 독립적인 구성 요소

->시스템이 전달 받은 인텐트 안의 데이터를 해석한 후 단말에 설치된 앱 중에서 이 데이터를 처리하기 적절한 것을 찾아야 함. 즉 일종의 중개 역할만 하므로 안드로이드가 기존 언어와는 조금 다른 구조를 갖고 있음?

-> 범주(Category)

-> 액션이 실행되는데 필욯나 추가적인 정보를 제공

-> 타입(Type)

-> 인텐트에 들어가는 데이터의 MIME 타입을 명시적으로 지정

-> 컴포넌트(Component)

-> 인텐트에 사용될 컴포넌트 클래스 이름을 명시적으로 지정

-> 이 속성이 지정될 경우 지정된 컴포넌트가 실행.

-> 부가데이터(Extra Data)

-> 인텐트는 추가적인 정보를 넣을 수 있도록 번들(Bundle) 객체를 담음.

ex) 이메일을 보내는 액션

-> 이메일에 들어갈 제목, 내용, 등을 부가 데이터로 넣어 전달해야 이메일 애플리케이션이 그 데이터를 받아 처리함


!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ex !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

-> 인텐트에 액션과 데이터를넣어 다른앱의 액티비티를 띄우는 경우


ex)  전화걸기 action 

Intent intent = new Intent(Intent.ACTION_DIAL, Uri.pase(data));


-> 컴포넌트 이름을 이용해 새로운 액티비티를 띄우는 경우

ex) 컴포넌트

Intent intent = new Intent();

ComponentName name = new ComponentName("패키지이름", "클래스이름");

intent.setComponent(name);

startActivityForResult(intent, REQUEST_CODE_MENU);


PDF 파일 보여주기

인텐트 필터(Intent Filter)?

-> 시스템이 요청하는 인텐트의 정보를 받아 처리할 애플리케이션 구성 요소를 찾기 위해 필요한 정보

-> 인텐트가 가지는 액션 정보를 동일하게 가질 수 있는데 이 인텐트 필터에 지정한 인텐트만 전달 받겠다는 의미

-> 명시적 인텐트가 많이 쓰이는 경우.

1. PDF 파일을 읽어야 하는데 핸드폰에 저장되있는 많은 PDF reader 중에서 택하는 경우

2. 어떤 것을 실행할 때 그것을 돌리는 많은 App 중 어떤것을 선택하는 창이 뜬다면 그건 명시적 인텐트를 사용한것.

** SD 카드에 접근 하려면 매니페스트에 권한을 추가해야함.(<user-permission> 사용)

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

-> SD 카드에서 파일을 읽어올 떄 필요한 권한

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

-> SD 카드에 파일을 쓸 때 필요한 권한

!! 이 권한은 마시멜로(API 23) 버전부터 위험 권한으로 분류됨 -> 매니페스트에 추가하는것 의외에도 소스 코들르 수정하여 앱을 실행했을때 사용자에게 권한을 부여 받을 수 있도록 해야함.



4. 액티비티를 위한 플래그와 부가 데이터

액티비티로 만들어진 화면이 한 번 메모리에 만들어졌는데도 계속 startActivity() 또는 startActivityForResult() 메소드가 반복적으로 호출되면 동일한 액티비티가 여러개 만들어짐. 이때는 플래그를 사용해 액티비티가 동작하는 방식을 조정할 수 있음


액티비티 동작 방법

1. 액티비티는 '액티비티 스택(Atcivity stack) 이라는 것으로 관리됨.

2. 먼저 들어오는게 stack 구조이기때문에 밑으로 쌓임.

3. 화면을 숨기게 되면 뒤에있던 화면이 보이게 되는 구조


  !! 만약 동일한 액티비티를 여러번 실행한다면 동일한 액티비티가 여러 스택에 들어가게 되고 동시에 데이터를 여러 번 접그하거나 리소스를 여러번 사용하는 문제가 발생할 수 있음.

   이러한 문제를 해결하기 위한 것이 FLAG

Flag 종류 

1. FLAG_ACTIVITY_SINGLE_TOP

-> 액티비티를생성할 때 이미 생성된 액티비티가 있으면 그 액티비티를 그대로 사용해라

-> 그러나 액티비티가 새로 만들어지지 안고 기존에 있는 것이 보인다면 시스템에 전달하는 인텐트 객체는 어떻게 전달받나 ??

-> 액티비티가 재 사용된다면 액티비티의 onCreate() 메소드가 호출되지 않음.

-> 이런 경우는 새로 띄워지는 액티비티에서 인텐트를 전달 받아 처리하는 방법이 따로 있어야 함

-> onNewIntent()

-> 액티비티가 새로 만들어지지 않았을 때 인텐트 객체만 전달 받을 수 있음

2. FLAG_ACTIVITY_NO_HISTORY

-> 처음 이후에 실행된 액티비티는 액티비티 스택에 추가되지 않음.

-> 이 플래그를 사용하지 않았을땐 이전에 실행되었던 액티비티가 스택에 추가되어 [back] 시 이전의 액티비티가 보이는데 이 플래그를 사용하면 항상 맨 처음에 실행되었던 액티비티가 보임

-> 알람 이벤트가 발생하여 사용자에게 한 번 알림 화면을 보여주고 싶을때 사용.

3. FLAG_ACTIVITY_CLEAR_TOP

-> 이 액티비티 위에 있는 다른 액티비티를 모두 종류시킴.

-> 홈 화면와 같은 다른 액티비티보다 항상 우선하는 액티비티를 만들때 유용하게 사용


부가 데이터(Extra data) -> 다시 봐야함

-> 한 화면에서 다른 화면을 띄울 때 데이터를 전달해야 하는 경우가 있음

ex) 로그인 화면에서 로그인 버튼을 눌러 로그인 과정을 진행할 때.

-> 인덴트 안에는 번들 객체가 있음. 번들 객체는 해시테이블과 유사하여 putExtra() 와 getxxxExtra() 메소드로 데이털르 넣거나 뺄 수 있음(xxx는 데이터 타입)

ex) getStringExtra()

-> 번들 객체 안에 넣은 데이털르 부가 데이터라 함.


5. 액티비티의 수명주기

-> 액티비티의 상태 정보가 변화하는 것을 수명주기라 함.

Running

-> 화면 상에 액티비티가 보이면서 실행되어 있는 상태. 액티비티 스택의 최상위에 있으며 포커스를 가지고 있음

Paused

-> 사용자에게 보이기는 하지만 다른 액티비티가 위에 있어 포커스를 받지 못하는 상태. 대화상자가 위에 있어 일부가 가려져 있는 경우 등.

Stopped

-> 다른 액티비티에 의해 완전히 가려져 보이지 않는 상태

294P 그림 확인


 상태 메소드 

 설명 

 onCreate() 

 액티비티가 처음 만들어졌을 떄 호출

화면에 보이는 뷰들의 일반적인 상태를 설정하는부분
이전 상태가 저장되어 있는 경우 번들 객체를 참조하여 이전 상태 복원가능
이 메소드 다음에는 항상 onStart()가 호출됨 

  onStart()

 액티비티가 처음 만들어졌을 떄 호출

화면에 보이는 뷰들의 일반적인 상태를 설정하는부분
이전 상태가 저장되어 있는 경우 번들 객체를 참조하여 이전 상태 복원가능
이 메소드 다음에는 항상 onStart()가 호출됨 

  onResume()

 액티비티가 사용자와 상호작용하기 바로 전에 호출

 onRestart()

액티비티가 중지된 이후에 호출되는 메소드로 다시 시작되기 바로 전에 호출됨
이 메소드 다음에는 항상 onStart() 메소드가 호출됨

 onPause()

 또 다른 액티비티를 시작하려고 할 떄 호출됨
저장되지 않은 데이터를 저장소에 저장하거나 애니메이션 중인 작업을 중지하는 등의 기능을 수행하는 메소드
이 메소드가 리턴하기 전에는 다음 액티비티가 시작될 수 없으므로 이 작업은 매우 빨리 수행된 후 리턴되어야 함
액티비티가 이 상태에 들엉가면 시스템은 액티비티를 강제 종료할 수 있음

 onStop()

 액티비티가 사용자에게 더 이상 보이지 않을 때 호출됨
액티비티가 소멸되거나 또 다른 액티비티가 화면을 가릴 떄 호출됨
액티비티가 이 상태에 들어가면 시스템은 액티비티를 강제 종료할 수 있음

 onDestroy()

 액티비티가 소멸되어 없어지기 전에 호출됨
이 메소드는 액티비티가 받는 마지막 호출이 됨
액티비티가 애플리케이션에 의해 종료되거나(finish()) 시스템이 강제로 종료시키는 경우에 호출될 수 있음
위의 두 가지 경우를 구분할 떄 siFinishing() 메소드를 이용함
액티비티가 이 상태에 들어가면 시스템은 액티비티를 강제 종료할 수 있음


-> 화면이 보일때와 보이지 않을때 항상 호출되는 메소드가 있음

-> 앱이 갑자기 중지되거나 또는 다시 화면에 나타날 때 앱 데이터 저장과 복원이 필요함

-> 이럴때 사용하는 클래스 = SharedPreferences(데이터를 저장하고 복원 할수 있음)

-> onPause

-> 데이터를 저장하고

-> onResume

-> 데이터를 불러옴



6. 서비스

-> 앱이 실행했을 떄 항상 화면이 보이는 것은 아니다

-> 카카오톡 채팅 앱이 실행되어 있지 않아도 다른 사람이 보낸 메시지를 받을 수 있음.

-> 화면 없이 백그라운드에서 실행되는 서비스가 있기 때문

-> 서비스는 백그라운드에서 실행된느 프로세스를 의미.

-> 새로만든 서비스는 매니페스트 파일에 등록해야함

-> 단말이 항상 실행되어 있는 상태로 다른 단말과 데이털르 주고받거나 단말의 상태를 모니터링하는 것

-> 서비스의 수명주기 메소드 = onCreate(), onDestory()

-> 인텐트 객체를 전달 받기 위해 onStartCommand()가 사용 -> 서비스 객체가 이미 생성되어 있으면 onCreate() 메소드가 호출되지 않으므로 onStartCommand()를 사용해야함

-> 액티비티에서 서비스로 데이터를 전달 -> startService()

     서비스에서 액티비티로 데이터 전달  -> startActivity()

-> 서비스에서 액티비티를 부를때 

-> 서비스는 화면이 없기 때문에 액티비티를 부를때 새로운 TASK를 추가해야한다

->Intent.Flag_ACTIVITY_NEW_TASK

-> 부르는 액티비티가 이미 만들어져 있을 떄 재사용 하도록 2개 추가

->Intent.Flag_ACTIVITY_SINGLE_TOP

->Intent.Flag_ACTIVITY_CLEAR_TOP

-> 서버에 데이터를 요청하고 응답을 기다리는 네트워킹 작업을 서비스로 분리하여 구현하면 사용자가 보는 화면과 관계없이 서버와 통신이 가능하다


7. 브로드캐스트 수신자

-> 브로드캐스팅(Broadcasting)

-> 메시지를 여러 객체에게 전달하는 것

-> 그룹 채팅시?

-> 글로벌 이벤트(Global Event)

-> 전화가 왔습니다. 문자 메시지가 도착했습니다. 등등

-> 내가 만든 앱에서 브로드캐스팅 메시지를 받고 싶다면 브로드캐스트 수신자(Broadcast Reciver)를 만들어 등록하면 된다.

-> 매니페스트에 등록해야 함. 그래야 시스템이 알 수 있음. 자바 코드에서 registerReciver() 메소드를 이용해서 사용할수도 있음.

-> 화면 없음. 

-> 받고 싶은 메시지를 고르는 방법 -> 메시지는 다 인텐트를 통해서 넘어옴 -> 인텐트 필터를 사용하면 된다.

-> 텔레포니(Telephony) 모듈

-> 단말에서 다른사람으로부터 SMS 문자를 받아 처리 후 인텐트에 담겨 브로드캐스팅 방식으로 다른 앱에 전달

-> 주의할점!

-> 브로드캐스트 수신자를 사용할떄 앱이 실행되어 있지 않아도 원하는 브로드캐스트 메시지가 도착하는 시점에 앱이 실행될 수 있다는것.

-> 앱을 실행하지 않은 상태에서도 인텐트 안에 들어 있는 메시지를 받아볼 수 있다는 점은 브로드캐스트 수신자가 갖고 있는 가장 중요한 특징.

-> 어떤 특정한 상황에서 필요한 작업을 할 수 있도록 앱을 구성할 수 있기 때문


8 위험 권한 부여하기

-> 매니페스트에 넣어준 권한은 앱을 설치할 때 사용자가 허용하면 한꺼번에 권한이 부여됨

-> 마시멜로(API 23) 

->중요한 권한들을 분류하여 설치 시점이 아니라 앱을 실행했을 떄 사용자로부터 권한을 부여받도록 변경됨

-> 일반권한(Normal Permission)

-> 위험권한(Dangerous Permission)

-> 대부분 개인정보가 담겨있는 정보에 접근

-> 개인정보를 만들어 낼 수 있는 단말의 주요 장치에 접근

-> 위치, 카메라, 마이크, 연락처, 전화, 문자, 일정, 센서

분류(Permission Group) 

세부 권한(Permission) 

LOCATION (위치) 

ACCESS_FINE_LOCATION
ACCESS_COARSE_LOCATION 

CAMERA

CAMERA 

MICROPHONE 

RECORD_AUDIO 

 CONTACTS

READ_CONTACTS
WRITE_CONTACTS
GET_ACCOUNTS 

 PHONE

READ_PHONE_STATE
CALL_PHONE
READ_CALL_LOG
WRITE_CALL_LOG
ADD_VOICEMAIL
USE_SIP
PROCESS_OUTGOING_CALLS 

 SMS

SEND_SMS
RECEIVE_SMS
READ_SMS
RECEIVE_WAP_PUSH
RECEIVE_MMS 

 CALENDAR

READ_CALENDAR
WRITE_CALENDAR 

 SENSORS

BODY_SENSORS 

 STORAGE

READ_EXTERNAL_STORAGE
WRITE_EXTERNAL_STORAGE 

-> 권한그룹(pERMISSION GROUP)

: 동일한 기능을 접근하는데 몇 가지 세부 권한을 하나로 묶어주는 역할


9 리소스와 매니페스트

안드로이드 앱 = 자바 코드 + 리소스

-> 자바코드 

-> 앱의 흐름과 기능을 정의

-> 리소스(res)

-> 레이아웃이나 이미지와 같은 주로 앱에서 사용자에게 보여주기 위해 사용하느 ㄴ파일이나 데이터를 관리

매니페스트

-> 설치된 앱의 구성 요소가 어떤건지, 어떤 권한이 부여되었는지 시스템에 알려주기 때문에 매우 중요

-> 모든 안드로이드 앱은 가장 상위 폴더에 매니페스트 파일이 있어야 함

-> 이 정보는 앱이 실행되기 전에 시스템이 알아야 할 내용들을 정의하고 있음

-> action, activity, activity-alias, application, category, data, grant-uri-permission, instrumentation, intent-filter, manifest, meta-data, permission, permission-group, permission-tree, provider, receiver, service, uses-configuration, uses-library, uses-permission, uses-sdk


!!사용자가 아무런 생각 없이 앱을 설치하는 경우 앱을 설치시 모든 권한을 부여하게 되면 앱들이 단말의 주요 기능을 맘대로 작동시켜서 문제가 됨

  리소스의 사용

-> /res

-> /assets

둘의 차이점

-> assets은 동영상이나 웹페이지와 같이 용량이 큰 데이터를 의미

-> 리소스는 빌드되어 설치파일에 추가되지만 에셋은 빌드되지 않음.

! 리소스의 유형마다 저장 방식과 처리 방식이 다르다

/res/value -> 문자열이나 기타 기본 데이터 타입에 해당하는 정보들, strings.xml

/res/drawable ->이미지를 저장



312P 받은 메시지 파싱하는 방법

-> 메세지를 받으려면 권한이 필요하다 RECEIVE_SMS = 위험권한 -> 자바 소스 파일에서 앱 실행 후에 사용자가 권한을 부여할 수 있도록 별도의 코드가 추가되어야 함


반응형

'T.N.V > 안드로이드' 카테고리의 다른 글

안드로이드 토스트 & 대화상자 & 프로그래스  (0) 2017.12.29
안드로이드 방향전환에 대하여  (0) 2017.12.29
기본 위젯들  (0) 2017.12.19
대표적 레이아웃  (0) 2017.12.18