본문 바로가기

컴퓨터학원(복습)(수료)

자바(JAVA)기반 안드로이드 웹&앱 개발 42일차 (브로드캐스트수신자, SMS 내용 나타내기, 수신자 동작 방식, 위험 권한, 리소스와 매니페스트)

시간이 안되서 다 정리하지 못하고, 예시도 못올렸습니다.

내일 평가가 있어서.. 내일 추가해서 올리겠습니다.

jpeg 로 올려서 많이 깨지네요.. 다음부턴 png로 올리겠습니다.

[브로드캐스트수신자 이해하기]

1. 안드로이드에서 브로드캐스팅(Broadcasting)이란 메시지를 여러 객체에 전달하는 것을 말합니다.

2. 예를들어, 다른 사람으로부터 문자를 받았을 때 이 문자를 SMS 수신 앱에 알려줘야 한다면 브로드캐스팅으로 전달하면 됩니다. 이런 메시지 전달 방식은 단말 전체에 적용될 수 있겠죠? 그래서 이런 메시지 전달 방식을 ‘글로벌 이벤트(GlobalEvent)'라고 부릅니다. 글로벌 이벤트의 대표적인 예로는 ’전화가 왔습니다‘, ’문자 메시지가 도착했습니다‘와 같은 사용자 알림을 들 수 있습니다.

3. 여러분이 만든 앱에서 브로드캐스팅 메시지를 받고 싶다면 브로드캐스트 수신자(Broadcast Receiver)를 만들어 앱에 등록하면 됩니다.

4. 따라서 새로운 브로드캐스트 수신자를 만들면 매니페스트 파일에 등록해야 시스템이 알 수 있고 화면도 없게 됩니다. 단, 브로드캐스트 수신자는 매니페스트 등록 방식이 아닌 소스코드에서 registerReceiver() 메서드를 사용해 시스템에 등록할 수 있습니다. 소스코드를 이용하여 브로드캐스트 수신자를 등록하면 액티비티 안에서 브로드캐스트 메시지를 전달받아 바로 다른 작업을 수행하도록 만들 수 있는 장점이 있습니다.

 

[브로드캐스트 수신자 등록하고 사용하기]

1. 브로드캐스트 수신자에는 onReceive() 메서드를 정의해야 합니다. 이 메서드는 원하는 브로드캐스트 메시지가 도착하면 자동으로 호출됩니다.

2. 하지만 시스템의 모든 메시지를 받을 수는 없습니다. 만약 원하는 메시지만 받으려면 어떻게 해야 할까요? 모든 메시지는 인텐트 안에 넣어 전달되므로 운하는 메시지는 인텐트 필터를 사용해 시스템에 등록하면 됩니다.

※ 브로드캐스트 수신자 등록하고 사용하기 예시

☞ SMS를 받으면 onReceive()메서드가 자동으로 호출됩니다.

☞ parseSmsMessage() 메서드는 한번 입력해 놓으면 다른 앱을 만들 때도 재사용할 수 있습니다. 왜냐하면 SMS 데이터를 확인할 수 있도록 안드로이드 API에 정해둔 코드를 사용하므로 수정될 일이 거의 없기 때문입니다.

☞ 인텐트 객체 안에 부가 데이터로 들어 있는 SMS 데이터를 확인하려면 SmsMessage 클래스의 createFromPdu() 메서드를 사용하여 SmsMessage 객체로 변환하면 SMS 데이터를 확인할 수 있습니다.

☞ Build.VERSION.SDK_INT 는 단말의 OS 버전을 확인할 때 사용합니다. 안드로이드 OS는 계속 업데이트 되면서 새로운 기능이 추가되어왔으므로 단말의 OS 버전에 따라 코드가 약간씩 달라져야 할 때가 있습니다. 다음과 같은 코드가 버전에 따라 다른 코드를 넣을 때 사용하는 전형적인 코드 중 일부입니다.

★ if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M)

☞ 발신자 번호를 확인하려면 getOriginatingAddress() 메서드를 호출합니다.

☞ 문자 내용을 확인하려면 getMessageBoody().toString() 코드를 사용합니다.

☞ 앱에서 SMS를 수신하려면 RECEIVE_SMS라는 권한이 있어야 합니다.

★ 이 권한은 위험 권한입니다. 위험 권한의 경우네는 소스 파일에서 앱 실행 후에 사용자가 권한을 부여할 수 있도록 별도의 코드가 추가되어야 합니다.

★ AndroidManifest에서 권한을 추가하고 build.gradle(Module:app) 파일에서 위험 권한을 추가하는 코드를 넣어줍니다.

 

[SMS 내용 액티비티에 나타내기]

1. 브로드캐스트 수신자는 화면이 없으므로 보여주려는 화면은 액티비티로 만든 후 그 화면을 띄워야 합니다. 따라서 브로드캐스트 수신자에서 인텐트 객체를 만들고 startActivity() 메서드를 사용해 액티비티 쪽으로 인텐트 객체를 전달해야 합니다.

※ SMS 내용 액티비티에 나타내기 예시

 

☞ 브로드캐

스트 수신자로부터 인텐트를 전달받을 것이므로 onCreate() 메서드 안에서 getIntent() 메서드를 호출하여 processIntent() 메서드를 호출하도록 합니다.

☞ Intent 객체를 만들 때 두번째 파라미터로 SmsActivity 객체(SmsActivity.class)를 전달했으므로 startActivity() 메서드를 사용해 이 인텐트를 시스템으로 전달하면 시스템이 그 인텐트를 SmsActivity 쪽으로 전달합니다.

 브로드캐스트 수신자는 화면이 없으므로 인텐트의 플래그로 FLAG_ACTIVITY_NEW_TASK 를 추가해야 한다는 점을 잊지 말아야 합니다. 그리고 이미 메모리에 만든 SmsActivity가 있을 때 액티비티를 중복 생성하지 않도록 FLAG_ACTIVITY_SINGLE_TOP 플래그도 추가합니다.

☞ 여러분이 만든 브로드캐스트 수신자는 매니페스트 파일 안에 <receiver> 태그로 추가되어 있지만 매니페스트에 등록하지 않고 소스파일에서 registerReceiver() 메서드를 사용해 등록할 수도 있습니다. 이렇게 소스 파일에서 등록하면 화면이 사용자에게 보일 때만 브로드캐스트 수신자에서 메시지를 받도록 만들 수 있습니다.

 

[브로드캐스트 수신자 동작 방식 정리하기]

1. 단말에서는 다른 사람으로부터 SMS 문자를 받았을 때 텔레포니(Telephony) 모듈이 처리하도록 합니다.

2. 브로드캐스트 수신자를 사용하면서 주의할 점은 앱 A가 실행되어 있지 않아도 앱 A가 원하는 브로드캐스트 메시지가 도착하면 다른 앱 B를 실행하고 있는 도중에도 앱 A가 실행될 수 있다는 점입니다.

3. 이 때문에 구 개발 버전의 앱을 한 번 설치한 후 앱의 패키지 이름을 수정하는 등의 방법으로 새 개발 버전의 앱을 만들었을 경우에는 구 개발 버전의 앱을 삭제하는 것이 좋습니다.

 

[위험 권한 부여하기]

1. 마시멜로(API23) 부터는 중요한 권한들을 분류하여 설치 시점이 아니라 앱을 실행했을 때 사용자로부터 권한을 부여받는 것으로 변경되었습니다.

 

[일반 권한과 위험 권한의 차이점 알아보기]

1. 위험 권한(Dangerous Permission)으로 분류된 주요 기능으로는 LOCATION(위치), CAMER, MICROPHONE, CONTACTS, PHONE, SMS, CALENDAR, SENSORS, STORAGE가 있습니다.

 

[ 위험 권한 부여하는 방법 알아보기]

※ 코드를 추가로 입력하는 방법

 

※ 외부 라이브러리를 이용한 위험 권한 자동부여방법 예시

 

[리소스와 매니페스트 이해하기]

[매니페스트]

1. 매니페스트가 리소스는 아니지만 설치된 앱의 구성요소가 어떤 것인지, 그리고 어떤 권한이 부여되었는지 시스템에 알려주기 때문에 매우 중요합니다.

2. 모든 안드로이드 앱은 가장 상위 폴더에 매니페스트 파일이 있어야 하며, 이 정보는 앱이 실행되기 전에 시스템이 알아야 할 내용들을 정의하고 있습니다.

3. 매니패스트의 역할

☞ 앱의 패키지 이름 지정 ☞ 앱 구성 요소에 대한 정보 등록

☞ 각 구성 요소를 구현하는 클래스 이름 지정

☞ 앱이 가져야 하는 권한에 대한 정보 등록

☞ 다른 앱이 접근하기 위해 필요한 권한에 대한 정보 등록

☞ 앱 개발 과정에서 프로파일링을 위해 필요한 instrumentation 클래스 등록

☞ 앱에 필요한 안드로이드 API의 레벨 정보 등록

☞ 앱에서 사용하는 라이브러리 리스트

4. 애플리케이션을 의미하는 <application> 태그는 매니페스트 안에 반드시 하나만 있어야 합니다.

 

[리소스의 사용]

1. 리소스를 자바 코드와 분리하는 이유는 이해하기 쉽고 유지관리가 용이하기 때문입니다.

 

[스타일과 테마]

1. 스타일과 테마는 여러 가지 속성들을 한꺼번에 모아서 정의한 것으로 가장 대표적인 예로 대화상자를 들 수 있습니다.

 

[그래들 이해하기]

1. 안드로이드 앱을 실행하거나 앱 스토어에 올릴 때는 소스파일이나 리소스 파일을 빌드하거나 배포하는 작업이 필요합니다. 이때 사용되는 것이 그래들(Gradle)입니다. 다시 말해, 그래들은 안드로이드 스튜디오에서 사용하는 빌드 및 배포도구인 것입니다.

2. build.gradle(Module:app)에 applicationId 는 앱의 id 값입니다. 여러분이 만든 앱은 id 값으로 구분되기 때문에 id 값은 전 세계에서 유일한 값으로 설정되어야 합니다.

3. compileSdkVersion 은 빌드를 진행할 때 어떤 버전의 SDK를 사용할 것인지를 지정합니다. 보통 최신 버전의 SDK 버전을 지정하게 됩니다.

4. minSdkVersion은 이 앱이 어ᄄᅠᆫ 하위 버전까지 지원하도록 할 것인지를 지정하게 됩니다.

5. dependencies에는 외부 라이브러리를 추가할 수 있습니다.

 

[선택 위젯 만들기]

[나인패치 이미지 알아보기]

1. 나인패치(Nine Patch)는 이미지가 늘어나거나 줄어들 때 생기는 이미지 왜곡을 해결하는 방법을 정의한 것입니다.

2. 나인패치로 수정한 이미지의 파일 이름은 ooo.9.png 처럼 파일 확장자 앞에 ’.9‘를 붙여야 합니다.

※ 나인패치 사용 예시

 

[새로운 뷰 만들기]

1. API에서 제공하는 위젯을 사용하면 거의 대부분의 화면을 만들 수 있지만, 여러분이 원하는 기능을 가진 위젯을 따로 구상해야 할 때는 새로운 뷰나 위젯을 만들어야 합니다.

2. API에서 제공하는 뷰를 사용하려면 API의 뷰를 상속해야 합니다. 뷰의 영역과 크기는 그 뷰를 포함하고 있는 레이아웃의 영향을 받아 정해집니다. 이때 개발자가 뷰의 상태에 따라 추가적인 코드를 넣을 수 있도록 콜백 메서드가 호출됩니다.

3. 뷰가 스스로의 크기를 정할 때 자동으로 호출되는 메서드는 onMeausre()이고 스스로를 레이아웃에 맞게 그릴 때는 onDraw() 메서드가 자동으로 호출됩니다.

★ public void onMeause(int widthMeausreSpec, int heightMeausreSpec)

★ public void onDraw(Canvas canvas)

 

[onDraw() 메서드와 invalidate() 메서드 이해하기]

1. 뷰가 화면에 보일 때는 onDraw() 메서드가 호출됩니다.

2. 새로운 뷰를 클래스로 정의하고 그 안에 onDraw() 메서드를 다시 정의한 후 필요한 코드를 넣어 기능을 구현하면 다른 모양으로 보이는 뷰를 직접 만들 수 있는 것입니다.

3. 손가락으로 터치하여 화면에 그려진 뷰를 이동시키려고 할 때는 뷰가 이동한 후에 그 뷰의 그래픽을 다시 그려야 할 필요가 있는데 이때 invalidate() 메서드를 호출하면 됩니다. invalidate() 메서드가 호출되면 자동으로 onDraw() 메서드가 다시 호출되어 이동한 좌표에 뷰의 그래픽을 다시 그리도록 만들 수 있습니다.

※ onDraw() 메서드 예시

 

☞ 안드로이드는 UI 객체를 만들 때 Context 객체를 전달받도록 되어 있으므로 생성자에는 항상 Context 객체가 전달되어야 합니다.

☞ 첫번째 생성자는 이 뷰를 소스코드에서 new 연산자로 생성하는 경우 사용됩니다.

★ public MyButton(Context context)

★ public MyButton(Context context, AttributeSet attrs)

☞ 두개의 생성자에서 모두 init() 메서드를 호출하도록 할 수 있어 어ᄄᅠᆫ 생성자가 호출되든 상관없이 동일한 초기화 작업이 진행되도록 만들 수 있습니다.

 

[레이아웃 정의하고 카드뷰 넣기]

1. 카드뷰는 프로필과 같은 간단 정보를 넣기 위해 각 영역을 구분하는 역할을 합니다.

※ 카드뷰 사용하기 예시

 

☞ 새로 정의한 Layout1이라는 이름의 뷰는 메인 레이아웃에 추가되어 사용할 것이므로 소스코드에서 이미지뷰의 이미지나 텍스트뷰의 글자를 바꿀 수 있도록 setImage, setName, setMobile 이라는 이름의 메서드를 정의합니다.

☞ 이미지뷰에 보이는 이미지를 바꿀 수 있는 메서드 중의 하나가 setImageResource() 메서드인데, 이 메서드는 /app/res/drawable 폴더 안에 들어 있는 이미지 파일을 참조하는 정수 값을 파라미터로 전달받습니다.(resId)