.

참고 : https://kairo96.gitbooks.io/android/content/ch1.1.html


1. 안드로이드란?


구글 안드로이드는 개방적이고 무료인 최초의 모바일 플랫폼이다. 안드로이드는 완전한 소프트웨어 스택으로서 운영체제, 미들웨어, 주요 모바일 애플리케이션을 포함하고 있으며 애플리케이션을 개발할 수 있도록 도와주는 도구들과 API도 제하고 있다. 이러한 이유로 안드로이드는 기업뿐만 아니라 개인들도 쉽게 개발할 수 있다.

안드로이드 사용자는 기존 핸드폰과는 다르게 PC처럼 다양하고 많은 콘텐츠를 접할 수 있으며 개발자는 애플리케이션 개발을 통해 수익을 얻을 수 있다. 또한 이동통신 사업자는 안드로이드 활성화를 통해 단말기 판매 수익과 콘텐츠 유통 수익을 얻을 수 있다. 단말기 제조사는 저렴한 비용으로 안드로이드 플랫폼을 사용하여 여러 단말을 제조하여 수익을 얻을 수 있다.

정리 안드로이드 이해관계
▶ 안드로이드 사용자 – 다양하고 많은 콘텐츠
▶ 안드로이드 개발자 – 콘텐츠 개발을 통한 수익
▶ 이동통신 사업자 – 수익성 높은 방식으로 콘텐츠 통제
▶ 단말기 제조사 – 저렴한 비용으로 플랫폼 사용


2. 안드로이드 4대 구성요소

안드로이드의 주요 4대 주요 컴포넌트라고 하면 액티비티, 서비스, 브로드캐스트 리시버, 콘텐트 프로바이더를 말한다. 




3. 안드로이드 어플리케이션 구조 

안드로이드 애플리케이션은 우리에게 친숙한 MVC 모델로 구성된다.

  • VIEW(뷰): 화면 구성을 담당하는 영역이며, 이 영역은 View 클래스를 상속하는 클래스를 사용해서 구성할 수 있다.
  • CONTROL(컨트롤): VIEW와 MODEL을 서로 연결하고 제어하는 영역이며, 이 영역에는 액티비티(Activity), 서비스(Service), 브로드캐스트 리시버(BroadcastReceiver)가 포함되며 안드로이드 3.0 이후부터는 프래그먼트도 포함된다.
  • MODEL(모델): 애플리케이션의 데이터를 저장하는 역할을 담당하며, 안드로이드에 내장된 데이터베이스인 에스큐엘라이트(SQLite), 파일(File) 그리고 애플리케이션 간의 데이터 공유를 위해 사용할 수 있는 콘텐트 프로바이더(Content Provider)가 이 영역에 속한다.


4. Activity란 무엇인가요?(안드로이드의 주요 4대 주요 컴포넌트)

액티비티(Activity)는 UI (사용자 인터페이스) 화면을 관리하는 컴포넌트이다. 액티비티 역할을 하기 위해서는 Activity 클래스를 상속해야 하며, 액티비티가 기본적으로 가지고 있는 생명주기 메소드를 재정의해서 원하는 기능을 구현해야 한다.

예제코드) HelloWorld 클래스의 Activity

액티비티의 onCreate() 메소드에서는 setContentView() 메소드를 호출하고 있다. setContentView() 메소드는 주어진 R.layout.main을 가지고 화면 구성을 한다. R.layout.main은 실제로 /res/layout/main.xml을 가리킨다.

public class HelloWorld extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    }
}

Activity 특징)

  • 액티비티의 크기는 상태바(Status Bar) 영역을 제외한 화면 전체로 고정(원하는 위치에 원하는 크기로 변경할 수 없음)
  • 두 개의 액티비티를 동시에 보여줄 수 없음
  • 다른 애플리케이션의 액티비티를 불러낼 수 있음
  • 액티비티 내에는 프래그먼트(Fragment)를 추가하여 화면을 분할하여 별도로 조작할 수 있음

Activity 종류)

▶Known Direct Subclasses

AccountAuthenticatorActivity, ActivityGroup, AliasActivity, ExpandableListActivity, FragmentActivity, ListActivity, NativeActivity, TestActivity

▶Known Indirect Subclasses
ActionBarActivity, AppCompatActivity, LauncherActivity, PreferenceActivity, TabActivity


5. Service 서비스란 무엇인가요?

서비스(Service)는 특정 액티비티와 상관 없이 백그라운드에서 실행되는 컴포넌트이다. 그래서 화면을 구성하는 레이아웃을 작성할 필요가 없다. 이러한 이유로, 지속적으로 장시간 동작해야 하는 기능이 있다면 서비스에 구현해야 한다. 서비스로 동작하게 하고 싶다면 Service 클래스를 상속한 후, 생명주기 메소드를 재정의해서 원하는 기능을 구현하면 된다.


코드 Service

public class MyService extends Service {   
    public void onCreate() {
        Thread t = new Thread() {
            void run() {  }
        };
        t.start();
    }

    public void onDestroy() { 

    }
}


서비스의 생명주기는 두 가지로 분류할 수 있다. 먼저 타입 A는 로컬 서비스를 구현하는 것이고, 타입 B는 원격 서비스를 구현하는 것이다. 그래서 타입 B로 서비스를 구현할 경우, 같은 기기에서 실행되고 있는 다른 애플리케이션에서 원격 서비스로 구현된 서비스를 실행할 수 있게 된다.


정리 Service 타입 A
▶ onCreate(): 서비스가 생성될 때 호출
▶ onStart(): startService() 메소드에 의해 서비스가 시작될 때마다 호출
▶ onDestory(): 서비스가 종료될 때 호출

정리 Service 타입 B
▶ onCreate(): 서비스가 생성될 때 호출
▶ onBind(): bindService() 메소드에 의해 서비스가 시작될 때 호출
▶ onUnbind(): 서비스와 연결이 끊겼을 때 호출
▶ onDestory(): 서비스가 종료될 때 호출


6. 브로드캐스트 리시버란 무엇인가요?

브로드캐스트 리시버(Broadcast Receiver)는 특정 브로드캐스트에 반응하는 컴포넌트이며, 사용자 인터페이스를 가지고 있지 않다. 브로드캐스트에는 시간대 변경, 배터리 부족, 언어 설정 변경 등이 있으며, 이러한 브로드캐스트를 받으면 브로드캐스트 리시버는 이를 처리하고 다시 대기 모드로 진입한다. 또한 10초 이내의 작업만을 보증하므로 오랜 시간 동작해야 한다면 별도의 스레드로 처리하거나 서비스에 구현해야 한다.

자바 클래스가 브로드캐스트 리시버로 동작하게 하고 싶다면 BroadcastReceiver 클래스를 상속한 다음에 onReceive() 메소드에 원하는 기능을 작성하면 된다.

코드 Broadcast Receiver

public class MyReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
    }
}


7. Content Provider

콘텐트 프로바이더(Content Provider)는 애플리케이션 간의 데이터 공유를 위해 표준화된 인터페이스를 제공하는 컴포넌트이다. 콘텐트 프로바이더가 제공하는 실제 데이터는 파일 시스템이나 데이터베이스 등에 있을 수 있다.



3. Context란 무엇인가요?

하나의 application이 실행되기 위해서는 그 밑바탕에 깔려져야 하는 많은 정보들과 환경들이 필요합니다. 

그 정보들과 환경들을 안드로이드 시스템이 제공해 줍니다.

application 실행을 위해 밑바탕에 깔려져 있는 정보들과 환경들을 Context라 합니다.

따라서 이 Context를 통해서 안드로이드 시스템이 제공해주는 많은 유용한 정보들을 꺼낼수가 있습니다(getSystemService()로).

근데 Context를 필요로하는 곳에 Activity 객체인 this를 넘길수 있는 이유는  Activity가  Context를 상속 받았기 때문에 Activity는 Context의 모든 정보를 가지고 있는 것이지요. 그래서 Context를 필요로 하는 곳에서 Activity의 객체를 넘길수 있는 겁니다.


Context를 얻을수 있는 몇 가지 방법

  • Activity 객체를 통해서

  • View의 객체가 있으면 View의 getContext()를 통해서

  • Context 클래스의 getApplicationContext()를 통해서


4. Application클래스 역할
액티비티간의, 액티비티와 서비스, 서비스간의 값 전달에서 이보다 더 편리한 방법은 없다고 생각합니다. 
또한 Application Class에서 메서드를 작성하면 모든 액티비티에서 쉽게 호출이 가능합니다. 
비유하자면, Application 은 어플리케이션의 실행과 동시에 onCreate되고, 종료되면 onDestroy가 호출되는, 어플리케이션과 생명주기를 같이하는 클래스입니다.

5. 액티비티의 생명주기
액티비티는 다음 그림과 같은 생명주기(LifeCycle)를 가지고 있다. 이 생명주기에 따라 적절한 메소드가 호출되므로 이를 숙지해서 액티비티를 작성해야 한다. 물론 다음 내용은 안드로이드 개발을 어느 정도 해봐야 감이 오는 부분이니 지금은 잠시 눈요기만 하고 나중에 다시 살펴보기 바란다.

액티비티 생명주기는 onCreate() -> onStart() -> onResume() -> onPause() -> onStop() -> onDestory()순으로 실행되며, 경우에 따라서 onRestart() 메소드가 호출되기도 한다. 이에 대한 자세한 설명은 다음의 액티비티 생명주기 표를 참고하기 바란다.

API 액티비티 생명주기

메소드설명다음 메소드
onCreate()액티비티가 생성될 때 호출되며 사용자 인터페이스 초기화에 사용됨.onStart()
onRestart()액티비티가 멈췄다가 다시 시작되기 바로 전에 호출됨.onStart()
onStart()액티비티가 사용자에게 보여지기 바로 직전에 호출됨.onResume() 또는 onStop()
onResume()액티비티가 사용자와 상호작용하기 바로 전에 호출됨.onPause()
onPause()다른 액티비티가 보여질 때 호출됨. 데이터 저장, 스레드 중지 등의 처리를 하기에 적당한 메소드.onResume() 또는 onStop()
onStop()액티비티가 더이상 사용자에게 보여지지 않을 때 호출됨. 메모리가 부족할 경우에는 onStop() 메소드가 호출되지 않을 수도 있음.onRestart() 또는 onDestroy()
onDestroy()액티비티가 소멸될 때 호출됨. finish() 메소드가 호출되거나 시스템이 메모리 확보를 위해 액티비티를 제거할 때 호출됨.없음

※ onStop(), onDestory()는 호출되지 않을 수도 있음

TIP & TECH 사용자가 홈 키를 눌렀는지를 파악하는 방법
Activity 클래스에는 onUserLeaveHint() 메소드가 제공되고 있다. 이 메소드가 바로 사용자가 홈 키를 눌렀을 때, 호출되는 메소드이다. 그러므로 이 메소드를 재정의해서 원하는 코드를 작성하면 된다. 참고로 이 메소드가 호출된 뒤에는 Activity의 onPause() 메소드가 호출된다.


6. INTENT

인텐트(Intent)는 컴포넌트에 액션, 데이터 등을 전달하는 메시지 객체이다. 

이것을 사용해 다른 앱 구성 요소로부터 작업을 요청할 수 있습니다.

정리 Intent 객체의 구성 요소)

▶ Action(액션): 수행할 액션 이름(ACTION_DIAL)
▶ Data(데이터): 수행할 데이터의 URI(tel:)
▶ Category(카테고리): 수행할 액션에 대한 추가적인 정보
▶ Type(타입): 수행할 인텐트 데이터의 명시적인 타입(MIME 타입)(video/mpeg)
▶ Component name(컴포넌트 이름): 대상 컴포넌트의 완전한 클래스 이름
▶ Extras(추가 정보): 인텐트를 다루는 컴포넌트에 추가적으로 전달할 한 쌍의 키/값

API Intent의 주요 액티비티 액션

Action설명
ACTION_MAIN시작 액티비티를 지정하기 위한 액션
ACTION_VIEW데이터의 URL로 가장 적절한 액티비티를 호출하는 액션
content://contacts/people/1
ACTION_DEFAULTACTION_VIEW와 동일
ACTION_EDIT수정하기 위해 호출하는 액션
ACTION_DELETE삭제하기 위해 호출하는 액션
ACTION_DIAL전화 다이얼 액티비티를 호출하는 액션
content://contacts/people/1
tel:0101235678
ACTION_CALL전화 액티비티를 호출하는 액션
tel:0101235678
ACTION_WEB_SEARCH웹 검색 액티비티를 호출하는 액션
ACTION_SEARCH검색 액티비티를 호출하는 액션
ACTION_SENDTO이메일 등의 메시지 전송을 지정하는 액션
ACTION_ANSWER전화 착신을 위한 액션
  • 액티비티 시작하기:

Activity는 앱 안의 화면 하나를 나타냅니다. Activity의 새 인스턴스를 시작하려면 Intent를startActivity()로 전달하면 됩니다. 

Intent는 시작할 액티비티를 설명하고 모든 필수 데이터를 담고 있습니다.

액티비티가 완료되었을 때 결과를 수신하려면, startActivityForResult()를 호출합니다. 

액티비티는 해당 결과를 액티비티의 onActivityResult() 콜백에서 별도의 Intent 객체로 수신합니다. 자세한 정보는 액티비티 가이드를 참조하십시오.


  • 서비스 시작하기:

Service는 사용자 인터페이스 없이 배경에서 작업을 수행하는 구성 요소입니다. 서비스를 시작하여 일회성 작업을 수행하도록 하려면(예: 파일 다운로드) Intent를 startService()에 전달하면 됩니다. Intent는 시작할 서비스를 설명하고 모든 필수 데이터를 담고 있습니다.

서비스가 클라이언트-서버 인터페이스로 설계된 경우, 다른 구성 요소로부터 서비스에 바인딩하려면Intent를 bindService()에 전달하면 됩니다. 자세한 정보는 서비스 가이드를 참조하십시오.


  • 브로드캐스트 전달하기:

브로드캐스트는 모든 앱이 수신할 수 있는 메시지입니다. 시스템은 여러 시스템 이벤트에 대해 다양한 브로드캐스트를 전달합니다. 예를 들어 시스템이 부팅될 때 또는 기기가 변경되기 시작할 때 등이 해당됩니다. 다른 여러 앱에 브로드캐스트를 전달하려면 Intent를 sendBroadcast(), sendOrderedBroadcast() 또는 sendStickyBroadcast()에 전달하면 됩니다.


코드 인텐트 전달)

Intent intent = new Intent(this, IntentCallee.class);  
intent.putExtra("name", "gildong");  
intent.putExtra("age", 30);  
startActivity(intent);

코드 인텐트 수신)

Intent intent = getIntent();  
String name = intent.getStringExtra("name");  
int age = intent.getIntExtra("age", 20);

인텐트에 대한 자세한 내용은 다음 링크에서 살펴볼 수 있다.http://developer.android.com/reference/android/content/Intent.html


7.Notification통지란 무엇인가요?

통지(Notification)는 애플리케이션에서 발생한 이벤트를 사용자에게 알리는 수단이다. 이 수단에는 토스트(Toast), 상태바(Status Bar), 다이얼로그(Dialog)가 있으며, 이 중에서 토스트와 다이얼로그는 화면에 팝업된다고 해서 팝업 메시지(popup message)라고도 한다.

토스트 통지 폰 화면 하단에 메시지가 있는 사각형이 바로 토스트이다. 토스트는 사용자가 보고 있던 화면을 잠시나마 가릴 수 있으므로 주로 사용자에게 지금 당장 알려줘야 하는 정보가 있을 때 사용해야 한다.

상태바 통지 화면 상단에 보여주는 것이 상태바 통지이다. 이 기능은 SMS, 애플리케이션 설치, 이메일 수신 등을 표시하고 이를 클릭했을 때 상세 내용을 보여주는 방식이다. 상태바 통지는 사용자에게 어떤 정보를 알려줘야 하지만, 급한 내용은 아니기 때문에 나중에 볼 수 있도록 알려만 줘도 되는 경우에 사용해야 한다.

다이얼로그 통지 화면 중앙에 다이얼로그 창을 보여주는 방식이다. 이 창은 화면의 많은 부분을 가리므로 사용자의 결정이 반드시 필요할 때 사용해야 한다.

 

 

 


8. 컴포넌트 활성화 및 비 활성화

지금까지 살펴본 컴포넌트는 언제 활성화되고 언제 비활성화될까? 일반적으로 처음 시작되는 메인 액티비티는 애플리케이션을 실행할 때 시작된다. 그렇다면 다른 액티비티는 어떻게 시작할 수 있을까? 바로 인텐트를 통해 시작할 수 있다. 하지만 모든 컴포넌트가 인텐트로 시작되는 것은 아니다. 콘텐트 프로바이더는 콘텐트 리졸버(ContentResolver)를 통해서 시작된다. 다음은 이에 대해서 정리한 것이다.

정리 활성화 시점

컴포넌트활성화 시점
Activity인텐트에 의해 활성화
Service인텐트에 의해 활성화
Broadcast Receiver인텐트에 의해 활성화
Content providerContentResolver에 의해 활성화

※ Activity와 Service를 위한 인텐트는 Action과 URI 정보가 필요 ※ Broadcast receiver를 위한 인텐트는 Action 정보가 필요

정리 컴포넌트 활성화

컴포넌트활성화
ActivityContext.startActivity(), Activity.startActivityForResult()에 인텐트 객체를 전달해서 활성화
ServiceContext.startService()에 인텐트 객체를 전달해서 활성화 
안드로이드는 인텐트 객체를 Service의 onStart() 메소드에 전달
Broadcast ReceiverContext.sendBroadcast(), Context.sendOrderedBroadcast(), Context.sendStickyBroadcast()에 인텐트 객체를 넘겨서 활성화

※ Broadcast Receiver의 경우에는 명시적으로 호출하지 않아도 적당한 인텐트 필터를 AndroidManifest.xml에 지정해 놓으면 조건이 맞을 때 호출되어 활성화될 수 있다.

이제 컴포넌트가 언제 비활성화되는지에 대해서 살펴보겠다. 안드로이드는 시작한 후에 메모리가 부족하거나 기타 여러 이유로 활성화되어 있던 Activity를 비활성화시킨다. 만약 컴포넌트를 직접 비활성화시키고 싶다면, 액티비티에서는 finish() 메소드를 호출해야 하며 서비스에서는 stopSelf() 메소드를 호출해야 한다.

정리 컴포넌트 비활성화

컴포넌트비활성화
Activityfinish()에 의해 비활성화됨. 
다른 액티비티를 비활성화하고 싶을 때는 finishActivity()를 사용
ServicestopSelf() 나 Context.stopService()로 비활성화됨
Broadcast Receiver명시적으로 비활성화시킬 필요 없음
※ Broadcast 메시지에 대한 응답 시에만 활성화됨
Content provider명시적으로 비활성화시킬 필요 없음
※ ContentResolver의 요청 응답 시에만 활성화됨



.