본문 바로가기

Study/Programming

안드로이드 액티비티와 인텐트

오케이3


안녕하세요 꼬로미입니다


안드로이드 프로그래밍


액티비티와 인텐트 포스팅입니다




애플리케이션, 액티비티, 액티비티 스택, 태스크

                                                                                                  



1. 애플리케이션

한 개이상의 액티비티들로 구성

액티비티들은 애플리케이션안에 느슨하게 묶임


2. 액티비티

애플리케이션을 구성하는 빌딩 블록


3. 태스크와 액티비티 스택

액비비티들을 스택 구조의 구조로 pop, push 개념으로 이뤄진 액티비티 스택

하나의 태스크는 스택에 있는 액티비티들로 구성

맨 위의 액티비티가 현재의 포커스를 가짐





멀티 태스킹

                                                                                                  



안드로이드에서 흔히 사용하는 HOME키를 누르는 것이 일반적인 멀티 태스킹의 방법

HOME키로 액티비티 일시중지 후 홈화면으로

BACK키로 액티비티를 종료





인텐트

                                                                                                  



다른 액티비티를 시작하려면 액티비티의 실행에 필요한 여러 가지 정보들을 보내주어야 되며

이때 사용하는 메시지가 인텐트(intent)가 됩니다

종류로는 명시적 인텐트와 암시적 인텐트가 있습니다

액티비티들은 모두 매니페스트파일(AndroidManifest.xml)에 등록이 되어야 합니다





명시적 인텐트(explicit intent)

                                                                                                  



타겟 컴포넌트의 이름을 지정하는 명시적 인텐트

컴포넌트의 이름이 보통 다른 개발자에게 알려져 있지 않기에 주로 내부에서 사용


Hello라는 새로운 액티비티를 시작하는 문장

  Intent intent = new Intent(getApplicationContext(), Hello.class);

  startActivity(intent);

특정 클래스를 명확히 지정해 줌으로 명시적 인텐트임을 알 수 있음


서브 액티비티로 부터 결과를 받을 때

  Intent in = new Intent(getApplicationContext(), SubActivity.class);

  startActivityForResult(in, COMMAND);

  startActivity(intent); 가 아닌 startActivityForResult(in, COMMAND); 사용


엑스트라(extras)

서브 액티비티가 보내는 결과 값의 전달은 인테트 객체 안의 액스트라(extras) 필드가 사용

Bundle 타입의 객체이며, 이름과 값의 쌍으로 저장

저장시 putExtra() , 추출시 getIntExtra() 메소드를 사용

int getIntExtra(String name, int defaultValue)

float getFloatExtra(String name, float defaultValue)

int[] getIntArrayExtra(String name)

String getStringExtra(String name)


putExtra(String name, int value)

putExtra(String name, float value)

putExtra(String name, int[] value)

putExtra(String name, String value)

name은 데이터 이름, defaultValue는 결과값이 없을 떄 반환되는 디폴트 값





암시적 인텐트(implicit intent)

                                                                                                  



타겟 컴포넌트의 이름을 지정하지 않으며 암시적으로 지정하는 것

안드로이드가 인텐트를 처리할 수 있는 가장 최적 컴포넌트를 탐색

컴포넌트가 가지고 있는 인텐트 필터를 암시적인 인텐트와 비교해 탐색 수행


암시적 인텐트 생성

  Intent intent = new Intent(Intent.ACTION_SEND);

  Intent.putExtra(Intent.EXTRA_EMAIL, recipientArray);

  startActivity(intent);

액션과 데이터를 지정해야 함


인텐트 객체

  • 컴포넌트 이름(component name) 
    인텐트를 처리하는 타깃 컴포넌트의 이름으로 완전한 이름과 패키지 이름을 적어줌
    이 이름이 없으면 암시적 인텐트가 되어 안드로이드가 컴포넌트를 찾아줌
    SetComponent(), setClass(), setClassName()로 설정 가능
    getComponent()로 읽기 가능

  • 액션(action)
    수행해야하는 작업을 나타내며, Intent 객체 안에 많은 액션이 String 타입의 상수로 정의

    상수

    타겟 컴포넌트

     액션 

      ACTION_VIEW

      액티비티

     데이터를 사용자에게 표시 

      ACTION_EDIT

      액티비티

     사용자가 편질할 수 있는 데이터 표시 

      ACTION_MAIN

      액티비티

     태스크의 초기 액티비티로 설정  

      ACTION_CALL

      액티비티

     전화 통화 시작  

      ACTION_SYNC

      액티비티

     모바일 장치의 데이터를 서버 상 데이터와 일치시킴  

      ACTION_DIAL

      액티비티

     전화번호를 누르는 화면을 표시  


  • 데이터(data)
    작업에 필요한 데이터를 나타냄
    ACTION_VIEW이면 사용자에게 무엇을 표시할 것인지 줘야됨
    URI 형식을 사용
    setData(), getData() 메소드를 사용해 인텐트 객체의 데이터를 설정하고 접근가능

       Intent in = new Intent(Intent.ACTION_CALL);

       in.setData(Uri.parse("tel:01011111111"));

       startActivity(in);



  • 카테고리(Category)
    액션에 대해 주가적인 정보를 제공

    상수

     설명 

     CATEGORY_BROWSABLE

    타깃 액티비티가 브라우저에 의하여 시작되어 이미지와 같은 데이를 표시할 수 있음 

     CATEGORY_GADGET

     액티비티가 다른 액티비티 안에 개짓으로 내장

     CATEGORY_HOME

     홈 화면을 표시하는 액티비티

    CATEGORY_LAUNCHER 

     액티비티가 최상위 애플리케이션으로 론처에 나열

    CATEGORY_PREFERENCE  타깃 액티비티가 환경 설정 패널임


  • 엑스트라(extra)
    엑스트라는 타깃 컴포넌트로 전달되어야 하는 추가적인 정보를 가짐
    키-값 쌍으로 지정
    ( ACTION_TIMEZONE_CHANGED 인텐트는 새로운 시간대를 나타내는 "time-zone" 엑스트라를 가짐)



액티비티 생애주기(life cycle)

                                                                                                  



액티비티는 실행되는 동안 어떤 상태를 가지게 됩니다




  • 실행상태(resumed, running)
    액티비티가 전경에 위치
    사용자의 포커스를 가지는 상태

  • 일시멈춤 상태(paused)
    다른 액티비티가 전경에 보이면서 현재 액티비티의 일부가 아직 화면에 보이고 있는 상태
    모든 상태를 유지하고 있으며 정보를 기억하고 있음

  • 정지상태(stopped)
    액티비티가 화면에서 전혀 보이지 않는 상태
    액티비티는 배경에 위치
    상태와 멤버 정보는 가지고 있음

  • 액티비티 생성시
    onCreate(), onStart(), onResume() 등이 호출되며 액티비티 상태를 높임

  •  사용자가 액티비티를 떠날시
    onPause(), onStop(), onDestroy()를 호출해 상태를 변경

  • 정지되었다 다시 실행하는 경우
    onStop() 상태의 액티비티가 다시 실행되면 onRestart()가 호출
    onStop() 상태에서는 사용중인 대부분의 리소스를 반납해야 함 (메모리 누수 발생)
    반대로 onRestart()에서는 반납되었던 리소스들을 다시 생성





인텐트 필터

                                                                                                  



컴포넌트의 기능을 기술하고 컴포넌트가 수신할 수 있는 인텐트의 집합을 기술하며

원하는 타입의 인텐트는 받아들이고 원하지 않는 타입의 인텐트는 받아들이지 않음(암시적 인텐트의 경우)

하나의 컴포넌트에 여러개의 인텐트 필터를 가질 수 있음


매니페스트 파일에서 <intent-filter> 엘리멘트로 정의된 인텐트 필터의 예

<Intent-filter>

          <action android:name = "android.intent.action.MAIN" />

          <category android:name="android.intent.category.LAUNCHER" />

</intent-filter>

인텐트의 액션, 카테고리, 데이터를 필터의 액션, 카테고리, 데이터와 비교해서 하나라도 일치하지 않으면 안드로이드 시스템은 해당 인텐트를 컴포넌트에 전달하지 않음






액티비티 상태 저장

                                                                                                  



액티비티가 일시멈추거나 정지될 때도 액티비티 상태는 보존 (액티비티 객체는 메모리에 존재하고 있기 때문)

액티비티가 제거되기 전의 상태를 저장하려면 onSaveInstanceState() 메소드를 사용

액티비티가 다시 시작되면 onStart()에 이어 호출되는 메소드인 onRestoreInstanceState()로 저장된 상태를 다시 복원

  • onRestoreInstanceState() : 액티비티의 상태를 복구

  • onSaveInstanceState() : 액티비티의 상태를 저장






로그캣(logcat)

                                                                                                  



애플리케이션이 실행되면서 각종 유용한 정보를 특별한 윈도우에 표시하는 것을 의미

이클립스에서도 볼 수 있고, DDMS(Dalvik Debug Monitor Service)에서도 볼 수 있음





슬퍼2

읽어주셔서 감사드립니다

도움이 되셨다면 덧글을 부탁드립니다~ㅎ




'Study > Programming' 카테고리의 다른 글

쓰레드 동기화 세마포어(Semaphore)  (1) 2014.06.03
쓰레드 동기화 뮤텍스(Mutex)  (0) 2014.06.02
워커(Worker) 쓰레드 모델  (0) 2014.05.28
MySQL 설치 및 확인  (0) 2014.05.19
안드로이드 스레드 AsyncTask 사용  (0) 2014.05.17