Activity 액티비티는 안드로이드 응용 프로그램을 구성하는 4가지 컴포넌트 중 하나로 가장 빈번히 사용되며 사용자를 대면한다는 면에서 실질적으로 가장 중요한 요소 화면 하나에 대응되며 입출력 기능이 없어 내부에 뷰나 뷰 그룹을 가짐 setContentView 메서드 - 액티비티가 생성될 때마다 호출되며 뷰를 배치하는 명령 액티비티 하나는 독립된 기능을 수행하며, 서로 중첩되지 않음
Activity 액티비티 추가 예제 레이아웃을 정의하는 xml 문서 하나와 동작을 정의하는 java 파일을 쌍으로 생성해야 액티비티 하나가 정의 activity_main.xml - 추가 액티비티를 호출할 버튼과 단순 문자열을 배치 activity_sub.xml - res/layout 폴더에 파일을 생성하고 텍스트 뷰와 버튼 하나를 배치 MainActivity.java - 액티비티를 호출할 때 startActivity 메서드를 사용, - 인수로 호출할 대상을 지정하는 Intent 객체를 전달 SubActivity.java - Activity 클래스를 상속받으며 onCreate를 반드시 재정의하고 super.onCreate까지 호출하여 기본적인 초기화 수행 - 이후 setContentView 메서드를 호출 - 액티비티 안에 뷰나 뷰 그룹을 채움
Activity 보안상의 이유로 응용 프로그램에 포함된 모든 액티비티는 반드시 매니페스트에 등록 (등록되지 않은 액티비티는 존재하지 않는 것으로 취급 ) 매니페스트에 SubActivity를 등록 - 액티비티의 이름과 타이틀 바에 표시할 제목은 최소한 지정 - 액티비티의 이름은 패키지명을 포함한 풀 경로로 지정하되 같은 패키지에 속해 있을 시 앞에 ‘.’을 찍음 ※ 액티비티 추가 절차 새로 만들 액티비티의 레이아웃을 XML 파일에 정의. 액티비티의 코드를 java 파일에 작성. 새로 추가한 액티비티를 매니페스트에 등록. startActivity 메서드로 액티비티 호출.
Activity ActivityExam
Activity ActivityExam
Activity ActivityExam
Activity ActivityExam
Activity ActivityExam
Intent 메인 액티비티 혼자 작업을 수행하면 반복이 심해지고 형식성도 떨어지므로 다른 액티비티를 호출하여 일을 분담 인텐트 - 메서드가 다른 메서드를 호출하여 작업을 분담하는 이유와 동일 인텐트 - 안드로이드의 컴포넌트끼리 통신하기 위한 메시지 시스템 - 액티비티 및 컴포넌트간 수행할 작업에 대한 정보 및 작업 결과 리턴을 위해서도 사용 - 액티비티 호출 메서드 - 인수 : 인텐트 안에 호출 대상 및 작업 내용 정보 - 메서드 호출 전에 먼저 인턴트 객체에 설정 인텐트 생성자
Intent 명시적 인텐트 (Explicit intent) - 인텐트에 호출할 대상 컴포넌트가 분명히 명시 - 주로 같은 응용 프로그램내의 서브 액티비티를 호출할 때 사용되며, 권한에 따라 외부 응용 프로그램의 액티비티도 호출 가능 암시적 인텐트 (Implicit intent) - 호출 대상이 분명히 정해지지 않은 인텐트 - 주로 다른 응용 프로그램의 컴포넌트를 호출할 때 사용 - 호출할 대상을 정확히 찾을 수 있도록 상세한 정보가 적성되어야 함 ※ 운영체제에는 인텐트의 정보를 참조하여 호출할 컴포넌트를 검색하는 알고리즘이 작성되어 있고, 시스템은 적절한 컴포넌트를 찾기 위해 설치된 모든 응용 프로그램의 컴포넌트를 조사 ※ 따라서 매니페스트에 컴포넌트의 정보를 가급적 상세히 밝혀 놓아야 함
Intent 정보 Action - 인텐트를 통해 어떤 작업을 수행할 지 지정 - 시스템이 제공하는 표준 동작 List
Intent 정보 Data - 동작에 필요한 상세 데이터를 제공하며, 단독 액션의 경우 정보인 데이터가 필요 - 대상의 종류가 광범위하여 임의의 대상을 가리킬 수 있는 URI 타입 - getData, setData : 데이터 액세스 시 사용 Type - 대부분 자동으로 판별 가능 - getType, setType : 자동 판별을 신뢰할 수 없는 경우 데이터의 MIME 타입 지정 Category - 실행할 액션에 대한 추가 정보를 제공 - addCategory, removeCategory : 카테고리 추가, 제거
액티비티간의 통신 인텐트는 액티비티간에 인수와 리턴값을 전달하는 도구로도 이용 이름과 값의 쌍으로 된 임의 타입의 정보를 원하는 개수만큼 전달 가능 Extras에 값을 저장하는 메서드 - 거의 모든 타입에 대해 오버로딩되어 있음 Extras 에 저장된 값은 아래의 메서드로 꺼냄
액티비티간의 통신 액티비티로 인수 전달, 결과를 리턴값으로 돌려받는 예제 - 인수와 리턴값 : 인텐트를 통해 전달 - 호출을 요청한 대상에 대한 정보가 포함되어야 함 - 리턴값을 돌려주는 액티비티는 아래의 메서드로 호출 호출된 액티비티가 종료 후 아래의 메서드가 호출 - 리턴값을 받으려면 메서드를 재정의 - requestCode : 액티비티를 호출할 때 전달한 요청 코드 - resultCode : 액티비티의 실행 결과 리턴값은 data 인텐트 안에 포함되어 있으므로 data 안에 Extras를 읽어 구할 수 있음
액티비티간의 통신 ActivityExam2
액티비티간의 통신 ActivityExam2
액티비티간의 통신 ActivityExam2
액티비티간의 통신 ActivityExam2
액티비티간의 통신 요청 코드는 호출 액티비티마다 하나씩 부여하며 누가 리턴했는지를 식별한다. protected void onActivityResult (int requestCode, int resultCode, Intent data) { switch (requestCode) { case ACT_EDIT: // 리턴된 문자열 사용 break; case ACT_FONT: // 리턴된 폰트 사용 } 한 액티비티가 2개 이상의 요청 코드를 가질 수도 있다.
암시적 인텐트 특정 액티비티를 명시적으로 호출 가능 - 다른 패키지에 속한 임의의 액티비티나 서비스를 호출할 수 있으며, 권한이 있을 시에 특정 패키지의 액티비티를 호출 가능 인텐트는 운영체제가 제공하는 시스템 전역적인 메시지 시스템 - 응용 프로그램끼리 철저히 격리되는 안드로이드에서 인텐트를 사용하여 경계를 넘나들 수 있음
암시적 인텐트 외부로 공개할 만큼 재사용성과 활용성이 높다면 암시적 인텐트를 처리할 수도 있다. 처리하는 액션과 데이터를 인텐트 필터에 기술한다. <activity android:name=".Add" android:label="Add"> <intent-filter> <action android:name=“com.example.activityexam3.ADD" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity> 액션명은 중복되어서는 안되므로 풀 패키지명을 접두로 붙인다. 호출할 때는 인텐트에 액션을 지정하고 데이터를 전달한다.
암시적 인텐트 ActivityExam3
암시적 인텐트 ActivityExam3
암시적 인텐트 ActivityExam3
암시적 인텐트 ActivityExam3
암시적 인텐트 ActivityExam3
암시적 인텐트 ActivityExam3
생명주기 안드로이드는 멀티태스킹을 지원하나, 적은 용량의 메모리, 좁은 화면 등 여러 가지 제약을 가짐 - 여러 개의 프로그램을 동시에 실행, 오버랩시켜 한번에 하나의 프로그램만 표시 생명 주기 - 액티비티는 시작, 실행, 활성, 비활성화, 정지, 종료되는 일련의 상태를 순환 - 사용자 또는 시스템의 자원 사정에 따라 액티비티의 상태는 끊임없이 변함 시스템은 태스크의 실행중인 액티비티들을 스택으로 관리 - 실행 : 사용자가 직접 사용하는 상태 - 일시정지 : 사용자에게 보이는 상태. - 정지 : 다른 액티비티에 의해 완전히 가려진 상태 사용자의 눈에 보이지는 않지만, 모든 정보를 다 유지하고 있음 시스템은 메모리 부족 시 정지 상태의 액티비티를 언제든지 강제 종료할 수 있음
생명주기 메서드
생명주기 메서드
생명주기 메서드 onCreate 나머지 메서드는 필요 시 구현 - 액티비티가 생성될 때 호출되며 반드시 구현. super의 onCreate를 호출, Activity의 기본 초기화를 먼저 수행해야 하며, 다른 메서드들도 모두 동일 - 다음은 setcontentView 메서드를 호출, 액티비티 안을 뷰로 채움 나머지 메서드는 필요 시 구현 - onStart, onStop의 경우 실용성이 떨어지며 onDestroy도 구현하는 경우가 많지 않고, onPause 메서드는 대부분의 경우 구현 - onPause가 호출된 이후를 킬러블(Killable) 상태라 하며 시스템이 언제든지 액티비티를 강제 종료 가능 - 강제 종료된 프로그램은 onStop와 onDestroy가 호출되지 않으므로 호출이 보장된 onPause가 실질적으로 생명 주기의 마지막이며, 미저장 정보들은 onPause에서 반드시 저장 - 시스템은 액티비티를 중지시키기 전에 onSaveInstanceState 메서드를 호출, 임시적인 데이터를 저장할 기회를 제공하며, 이 메서드의 인수로 Bundle 객체가 전달 ※ 시스템은 응용 프로그램을 임의로 죽이기 전에 onPause 메서드의 호출을 보장하여 정보를 저장할 최소한의 기회를 제공하므로, 저장할 데이터가 있는 경우 onPause 메서드는 반드시 구현해야 함
생명주기 메서드 ActParent.java 생명주기 로그 확인
생명주기 메서드 상태 저장 - 메모리 부족 등 여러 가지 이유로 프로그램이 강제 종료되는 상황은 흔하지 않으나, 낮은 확률로 강제 종료될 가능성이 존재하므로 모든 프로그램은 이에 대한 대비가 필요 - 강제 종료를 유도할 수 있는 가장 쉬운 방법은 화면의 방향은 전환 - 모바일 장비에서 화면의 방향 전환 시 액티비티가 재생성되며, 언어나 입력 장치 등이 변경될 때도 비슷한 상황이 발생 ㆍ환경 변화에 대해 액티비티를 재생성하는 이유는 조건에 따라 사용할 리소스가 완전히 달라질 수 있기 때문 ㆍ레이아웃이 판이하게 다를 경우 실행 상태에서 전환하는 것보다 재생성하는 것이 가장 안전하고 깔끔함 ㆍ레이아웃은 onCreate에서 전개되어 액티비티 내부에 채워지므로 리소스가 바뀌면 생명 주기를 onCreate부터 다시 시작해야 변경된 리소스 적용 가능
생명주기 메서드 ActivityExam4 예제
생명주기 메서드 방향전환 강제종료 확인 화면을 터치하여 원 이동 후 Ctrl + F11 화면 전환
생명주기 메서드 방향전환 강제종료 확인 종료 전 저장 시작 후 복구 - 액티비티가 종료되기 전 값을 저장한 뒤 재실행될 때 원래대로 복구 - 시스템은 액티비티가 종료하기 직전에 onSaveInstanceState 메서드를 호출, 정보를 저장할 기회를 제공 - 문자열로 된 이름과 임의값을 저장하는 일종의 맵인 Bundle 객체를 인수로 전달 ㆍ인텐트의 Extras 멤버가 Bundle 타입이며, 임의의 정보들을 원하는 만큼 저장 ㆍ이 메서드를 재정의하여 저장하고자 하는 값을 번들에 저장해두고 종료 종료 전 저장 시작 후 복구
탭 구성 액티비티에는 뷰 계층을 통해 많은 차일드 뷰를 배치할 수 있으나, 모바일 장비의 화면이 넓지 않으므로 보여줄 수 있는 정보의 양에 제약 입출력해야 할 정보가 많을 시 성격에 따라 그룹을 나누어 화면을 겹쳐서 표현하며, 탭 위젯을 주로 사용 - TabHost 클래스가 탭 화면을 구성하며 이 안에 페이지들이 배치 - 상단의 탭과 중앙의 프레임 등 두 개의 차일드로 구성 ㆍ상단의 TabWidget은 페이지 구성을 보여주고 사용자로부터 탭 클릭을 입력 받아 페이지를 전환 ㆍ아래쪽 프레임에는 각 페이지의 내용물에 해당하는 뷰나 액티비티들이 배치
탭 구성 예제
탭 구성 예제
탭 구성 예제
탭 구성 예제
탭 구성 예제