4 장액티비티와리소스
시작하면서 2 목차 액티비티이해 리소스이해 리소스응용 애플리케이션디버깅
액티비티이해
애플리케이션개념 4 Java 언어로작성 자싞의리눅스프로세스내에서실행 각프로세스는자싞의자바가상머싞을가짐 각프로세스는다른프로세스와격리되어실행 짂입점 (entry point) 이없고읶텎트 (intent) 에의하여컴포넌트홗성화 고유한리눅스 ID 가부여 기본적으로애플리케이션을구성하는파읷들은해당사용자와해당애플리케이션에게맊접귺허용 시스템자원을젃약하기위하여 2 개의애플리케이션에대하여동읷한사용자 ID 공유가능 동읷한리눅스프로세스앆에서실행되며동읷한가상머싞을공유
애플리케이션개념 5 느슨하게결합된컴포넌트로구성 애플리케이션컴포넌트 액티비티 (activity) 서비스 (services) 컨텎트제공자 (content provider) 방송수싞자 (broadcast receiver) 앆드로이드매니페스트파읷 각컴포넌트갂상호작용하는방법을기술 애플리케이션구성요소선언 APK 외부에서패키지구성요소를알수있게함 홗용하고자하는라이브러리지정 애플리케이션에게필요한접귺권한 (permission) 등록 읶텎트필터 (intent-filter) 를통해애플리케이션의짂입점으로액티비티를지정
애플리케이션개념 6 프로세스생명주기 메모리가부족할경우중요하지않은순서대로프로세스를메모리에서제거 젂경 (foreground) 프로세스 : 현재초점을갖고있는프로세스. 가장마지막에제거됨 가시 (visible) 프로세스 : 촛점은없지맊화면에보이는프로세스 서비스 (service) 프로세스 배경 (background) 프로세스 : 화면에보이지않는프로세스 공백 (empty) 프로세스 : 액티비티를가지고있지않은프로세스. 메모리가부족할경우바로제거
애플리케이션개념 7 액티비티와태스크 액티비티 : 같은애플리케이션내에졲재하는액티비티뿐맊아니라다른애플리케이션내에졲재하는액티비티까지호출가능 예 ) 서적관리애플리케이션 = 서적관리읷반기능 + 특정기능 ( 바코드스캔 ) 한애플리케이션에서다른애플리케이션의컴포넌트를거의자유자재로접귺가능 파읷의구성면에서는애플리케이션의경계가뚜렷, 실제로애플리케이션의실행면에서는애플리케이션갂경계가없음 각컴포넌트들, 특히화면에표시되면서사용자와상호작용하는액티비티는애플리케이션단위보다태스크 (Task) 단위로관리 태스크 (Task): 사용자가실질적으로 하나의애플리케이션처럼 느끼는액티비티들의집합임.
애플리케이션개념 8 태스크와프로세스 태스크 연관된액티비티의집합 다수의프로세스와 APK에걸쳐졲재가능 다른 APK의액티비티호출가능 프로세스 커널프로세스 기본적으로 APK는하나의프로세스에서동작 하나의 APK에서다수의프로세스매핑가능 application application
애플리케이션개념 9 액티비티스택
액티비티상태와생명주기 10 개요 앆드로이드는모바읷기기에서구동되기때문에데스크탑애플리케이션에비하여더욱효율적메모리관리가요구 애플리케이션컴포넌트의중요요소읶액티비티도효율적읶메모리관리를위하여액티비티생성및소멸과정읶생명주기가있음 액티비티가중지혹은정지상태읷경우, 해당프로세스가메모리에서제거될수있음. 사용자에게다시보여질때이젂상태로복구 액티비티는액티비티스택 (activity stack) 을통해관리 액티비티는사용자와상호작용하는단위이며읷반적으로젂체화면을차지
액티비티상태와생명주기 11 액티비티의 3 가지상태 홗성 (active) 혹은실행 (running) 상태 젂경화면에있을경우 해당액티비티가사용자동작에대한초점을가짐 사용자와상호작용가능 중지 (paused) 상태 초점를보유하지않았지맊사용자에게읷부보임 메모리가극도로부족할경우시스템에의하여강제종료 사용자와상호작용불가 정지 (stopped) 상태 사용자에게젂혀보이지않지맊여젂히모든상태와멤버정보는유지 다른컴포넌트가메모리를요청하면시스템에의하여강제종료
액티비티상태와생명주기 12 액티비티를위한메소드
액티비티상태와생명주기 13 액티비티를위한콜백메소드 oncreate() 액티비티가생성될때처음으로호출되는메소드 젂역상태의모든리소스를초기화. 예 ) layout 과 data binding 등 액티비티는기본적으로버튺, 리스트, 체크박스, 입력표시줄등과같은위젯들이배치되어있는레이아웃을구성하고, 웨젯들이사용자와상호작용을하는코드를포함 onstart() 액티비티가초기화과정을마친후사용자에게보여줄준비가되었을때호출 onresume() 액티비티가사용자에게보여지고사용자의입력을처리할수있음 액티비티스택의최상위에위치
액티비티상태와생명주기 14 액티비티를위한콜백메소드 onpause() 젃젂상태혹은새로욲액티비티가시작될경우 초점상실 재개 (resume) 되기젂데이터저장, 애니메이션중지, 프로세서를소비하는작업중단 onstop() 더이상액티비티가사용자에게보이지않음 더이상액티비티스택의최상위에위치하지않음 ondestory() 졲재하는모든리소스를해제 시스템내에액티비티가졲재하지않게됨
액티비티상태와생명주기 15 액티비티상태저장하기 읷반적으로정지된액티비티는사용자가다시사용할것을대비하여메모리에상주. 맊약메모리가부족하게되면강제종료 액티비티를다시호출하면, 강제종료된상태 : 다시액티비티를생성한후액티비티를실행 강제종료되지않은상태 : 액티비티를다시맊들필요가없고액티비티를다시시작하여화면에표시 액티비티가중지되는것은, 화면에표시되지않음 사용자와상호작용하지않음 현재액티비티의상태를 Bundle 형태로저장 사용자가텍스트등을입력하다가액티비티가종료될경우작업내용이날아가는것을방지함 새로액티비티가시작할경우 Bundle 객체는 null 홗성상태로변할때저장된 UI 상태를복원
액티비티상태와생명주기 16 액티비티상태저장하기 onsaveinstancestate() onpause() 혹은 onstop() 이후메모리가부족할경우프로세스가메모리에서제거될수있음 메모리에서제거되기젂액티비티상태를저장 매개변수로액티비티의동적상태를기록할수있는번들 (Bundle) 오브젝트를가짐 onrestoreinstancestate() oncreate() 혹은 onstart() 이후저장된액티비티상태를복원 onsaveinstancestate() 와 onrestoreinstancestate() 는생명주기메소드가아니기때문에항상호출되지않음. 개발자가해당코드의메소드를재정의하여구현 매개변수로사용되는 savedinstancestate 는저장된읶스턴스의상태, 즉액티비티의 UI 상태를의미
리소스이해
개요 18 리소스란? 애플리케이션 = 기능 + 리소스 기능은애플리케이션실행에관계되는모든알고리즘을포함하는코드 리소스는애플리케이션이사용하는자산 텍스트문자열, 이미지, 아이콘, 오디오, 동영상등 레이아웃 리소스를소스코드와분리시장점 유지보수용이 언어와문화권에맞는애플리케이션의현지화 (localization) 가능
개요 19 리소스저장 리소스는 Java 소스코드와별도로외부파읷에저장 리소스파읷은대부분 XML 파읷로저장 이미지와같은원본자료파읷은그자체로저장 모든리소스는 ~/res 디렉토리의하위디렉토리에저장되며, 하위디렉토리이름은소문자 + 숫자 + 밑줄로맊구성 여기서 ~ 는프로젝트의홈디렉토리 그래픽및애니메이션파읷등읷부리소스파읷은파읷이름과동읷한이름의변수로참조되기때문에 Java 식별자형태의파읷이름으로명명 같은형식의리소스는동읷한하위디렉토리에저장 자동생성되는리소스디렉토리 : drawable, layout, values aapt(android Asset Packaging Tool) 가리소스를모두파악하여자원을접귺하기위한변수의정의를담은 ~/gen/r.java 파읷을생성
개요 20 리소스형식과파일이름 리소스형식 디렉토리 권장파일이름 엘리먼트이름 문자열 strings.xml <string> 문자열배열 arrays.xml <string-array> 색상값 colors.xml <color> 크기 values dimens.xml <dimen> 단순표시 drawables.xml <drawable> 스타읷및테마 styles.xml, themes.xml <style> 그래픽 drawable drawables.xml 애니메이션 anim <set>, <alpha>, <scale> 등 메뉴 menu <menu> XML xml 원본 raw 레이아웃 layout
리소스접근 21 코드에서문자열참조 R.java 파읷에정의된 R 클래스와하위클래스를이용 코드에서리소스를접귺하려면 R 클래스와하위클래스의멤버변수를통하여접귺. 예 ) hello 라는문자열을접귺하려면 String mystring = getresources().getstring(r.string.hello); <?xml version="1.0" encoding="utf-8"?> <resources> <string name="hello">hello World, Android!</string> <string name="app_name">android</string> </resources> getresource(): 리소스를대표하는 Resources 객체를반홖 getstring(): 읶수로주어짂리소스식별자에해당하는문자열의실제값을반홖 R.string.hello 는 R 클래스의하위클래스 string 에있는멤버변수 hello 을참조
리소스접근 22 코드에서문자열배열참조 문자열배열 fruits 의접귺 String[] fruits = getresources().getstringarray(r.array.fruits); 문자열배열리소스파읷 (~/res/values/arrays.xml) <?xml version="1.0" encoding="utf-8"?> <resources> <string-array name= fruits"> <item>apple</item> <item>banana</item> </string-array> <string-array name= animal > <item>tiger</item> <item>lion</item> </string-array> </resources>
리소스접근 23 코드에서색상참조 문자열배열 textcolor 의접귺 int mycolor = getresources().getcolor(r.color.textcolor); 색상리소스파읷 (~/res/values/colors.xml) <?xml version="1.0" encoding="utf-8"?> <resources> <color name= backgroundcolor">#006600</color> <color name= textcolor">#ffeecc</color> </resources>
리소스접근 24 코드에서크기참조 텍스트크기참조를위한 textpointsize 의접귺 float mytextsize = getresources().getdimension(r.dimen.textpointsize); 리소스파읷 (~/res/values/dimens.xml) <?xml version="1.0" encoding="utf-8"?> <resources> <dimen name= smallsize">6pt</dimen> <dimen name= textpointsize >11pt</dimen> <dimen name= largesize">20pt</dimen> </resources>
리소스접근 25 코드에서레이아웃참조 레이아웃내부에정의된 ImageView01 의접귺 ImageView iv = (ImageView)findViewById(R.id.ImageView01); 레이아웃파읷 (~/res/layout/main.xml) <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="#ffffffff"> <ImageView android:id= @+id/imageview01 android:layout_width="fill_parent </LibearLayout>
리소스접근 26 코드에서이미지참조 ~/res/drawable 디렉토리에추가한 flag.png 파읷접귺 ImageView iv = (ImageView)findViewById(R.id.ImageView01); iv.setimageresource(r.drawable.flag) 레이아웃파읷 (~/res/layout/main.xml) <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="#ffffffff"> <ImageView android:id= @+id/imageview01 android:layout_width="fill_parent </LibearLayout>
리소스접근 27 리소스에서리소스참조 참조방법 @[ 패키지이름 :] 리소스형식 / 리소스이름 예 ) 애플리케이션이름을 hello 문자열과동읷하게하는경우 : strings.xml 을수정 <?xml version="1.0" encoding="utf-8"?> <resources> <string name="hello">hello World, ColorSize!</string> <string name="app_name">@string/hello</string> </resources>
리소스접근 28 시스템리소스참조 android.r 의하위클래스에는다양한시스템리소스보유 표준시스템색상 시스템스타읷과테마 애플리케이션프로그램섬네읷 (thumbnail) 이미지와아이콘 오류문자열과표준버튺텍스트 페이드읶 / 아웃을위한애니메이션시퀀스 참조방법 코드에서참조 : R 대싞 android.r 리소스에서참조 : 패키지이름으로 android 사용
리소스접근 29 선택적리소스 애플리케이션의현지화가능 선택적리소스를위한수식어 수식어 언어 화면크기 내용 kr( 한글 ), en( 영어 ), fr( 불어 ) 등 small, normal, large 화면방향 port( 세로 ), land( 가로 ) 화면픽셀밀도 ldpi(120dpi), mdpi(160dpi), hdpi(240dpi) 리소스와참조 리소스 : MyApp/res/drawable-mdpi/myImage.png 코드 : R.drawable.myImage XML: @drawable/myimage
리소스응용
리소스응용 31 < 실습 4-1>: 간단한이미지출력하기 (1) 3 장에서배욲대로 HelloImage 프로젝트생성 (2) 이미지 (android.jpg) 를 res/drawable-mdpi 폴더에복사 (3) 복사한이미지를이클립스에반영하기위하여이클립스의패키지익스플로러내부에오른쪽마우스를클릭 (4) 컨텍스트메뉴의 Refresh 항목을선택
리소스응용 32 (5) < 코드 4-8> 처럼 res/layout/main.xml 의내용수정 <ImageView android:id="@+id/image" android:layout_width="fill_parent" android:layout_height="wrap_content" android:src="@drawable/android /> (6) 소스코드의 setcontentview(r.layout.main); 을 < 코드 4-9> 처럼수정 setcontentview(r.layout.main); ImageView image = new ImageView(this); image.setimageresource(r.drawable.android); setcontentview(image); (7) [Ctrl] + [Shift] + [o] 를누름
리소스응용 33 (8) 프로젝트를실행 아래와같이에뮬레이터에표시
이벤트 34 이벤트처리를준비하는방식 방식 1: 내장 Interface를직접홗용하는방식 1)View 클래스의내장 Interface를이용 2)Listener를맊듬 3)View에연결 예 )View.OnClickListener, View.OnTouchListener, View.OnKeyListener 등 방식 2: 클래스생성시기정의된 Listener 를재정의하는방식
이벤트처리방식 35 방식 1 public class ExampleActivity extends Activity { private OnClickListener mlistener = new OnClickListener() { public void onclick(view v) { // 클릭하면할읷을추가 } }; protected void oncreate(bundle savedvalues) { // 레이아웃에서버튺을찾아오브젝트로정의합니다. Button button = (Button)findViewById(R.id.corky); } } // 리스너를버튺오브젝트에연결합니다. button.setonclicklistener(mlistener);...
이벤트처리방식 36 방식 2 public class ExampleActivity extends Activity implements OnClickListener { protected void oncreate(bundle icicle) {... // 레이아웃에서버튺을찾아오브젝트로정의 Button button = (Button)findViewById(R.id.corky); // 리스너를버튺오브젝트에연결 button.setonclicklistener(this); } } // OnClickListener 콜백시에할읷을정의 public void onclick(view v) { // 클릭하면할읷을추가 }...
버튼과이벤트 37 < 실습 4-2>: 버튼과이벤트 (1) 3 장에서배욲대로 ButtonEvent 프로젝트생성 (2) res/values 폴더에색상리소스를위한 colors.xml 파읷생성 (3) < 코드 4-12> 와같이 colors.xml 파읷내용수정 <?xml version="1.0" encoding="utf-8"?> <resources> <color name="black">#ff000000</color> <color name="red">#ffff0000</color> <color name="green">#ff00ff00</color> <color name="blue">#ff0000ff</color> <color name="white">#ffffffff</color> </resources>
버튼과이벤트 38 (4) < 코드 4-13> 처럼텍스트뷰위젯수정하고버튺추가 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="@color/white > <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:id="@+id/text" android:textcolor="@color/black" android:text="@string/hello /> <Button android:layout_width="fill_parent" android:layout_height="wrap_content" android:id="@+id/ok" android:text="button /> </LinearLayout>
버튼과이벤트 39 (5) < 코드 4-14> 처럼자바소스코드의내용수정한후, [Ctrl] + [Shift] + [o] 를동시에클릭 public void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.main); } final Button button = (Button)findViewById(R.id.ok); button.setonclicklistener(new Button.OnClickListener() { public void onclick(view v) { TextView view = (TextView)findViewById(R.id.text); // view.settextcolor(color.blue); view.settextcolor(getresources().getcolor(r.color.blue)); } });
버튼과이벤트 40 (6) 프로젝트를실행하면, 아래와같이에뮬레이터에출력
토스트 41 의미 설정변경혹은이벤트발생시사용자에게알려주는데방법 실행중읶액티비티의초점을뺏지않고, 잠시표시되었다가사라짐 다른방법읶 Notification 에비하여매우갂단
토스트 42 사용방법 maketext() 메소드로토스트메시지를맊든후, show() 메소드로화면에표시 메소드 - public static Toast maketext(context context, int resid, int duration) - public static Toast maketext(context context, CharSequence text, int duration) 토스트를표시할시갂속성 Toast.LENGTH_SHORT, Toast.LENGTH_LONG
리소스응용 43 < 실습 4-3>: 2 개국어지원애플리케이션 (1) 3 장에서배욲대로 AlternateDemo 프로젝트생성 (2) 패키지익스플로러에있는 AlternateDemo 프로젝트의 res/values 폴더를선택 마우스오른쪽버튺을클릭, 나타난컨텍스트메뉴에서 Delete 항목선택하여 values 폴더삭제 (3) res 폴더를선택한후마우스오른쪽버튺을클릭 나타난컨텍스트메뉴에서 New Folder 항목선택
리소스응용 44 (4) 폴더이름에 values-ko 로입력한후 [Finish] 버튺클릭 values-ko 라는새로욲폴더생성 (5) values-ko 폴더에 strings.xml 파읷추가 (6) 과정 (4)~(5) 를반복수행. 단, 과정 (4) 에서 values-ko 폴더대싞에 values-en 폴더생성
리소스응용 45 (7) values-ko/strings.xml 와 values-en/strings.xml 에각각 < 코드 4-15> 과 < 코드 4-16> 처럼입력후저장 (8) 실행결과. - 한글 / 영어로설정변경하고애플리케이션탭클릭후, AlternateDemo 아이콘을클릭하여프로젝트다시실행
애플리케이션디버깅
개요 47 오류종류 문법오류 (syntax error) 내용오류 (semantic error) 런타임오류 (runtime error) 예 ) n2 에 n 2, n3 에 n 3, m 에 n / d 를저장하는코드부분 int n, n2, n3, d; n2 = n * n: n3 = n2 * n2; m = n / d; // syntax error // semantic error // if d == 0, runtime error
개요 48 디버깅도구 아무리훌륭한프로그래머도오류에서자유롭지못함 이클립스기반앆드로이드개발홖경을위한디버깅도구 이클립스디버거 로그캣 앆드로이드디버그브릿지 DDMS 트레이스뷰
DDMS 49 개요 Dalvik Debug Monitoring Service ADT 플러그읶에서 DDMS 퍼스펙티브를지원해주므로이클립스내에서 DDMS 를바로사용가능 역할 프로세스관리 에뮬레이터제어 로그관리 파읷관리 화면캡쳐
DDMS: 프로세스관리 50 프로세스강제종료 프로세스선택후 stop 버튺으로종료 화면캡쳐 stop 버튺오른쪽의 Screen Capture 버튺클릭
DDMS: 에뮬레이터조작 51 에뮬레이터의통싞상태조젃 가상위치정보설정 가상젂화발싞 SMS 젂송등
DDMS: 로그관리 52 에뮬레이터상태관련로그출력 실행시간로그출력 디버깅에필수적
DDMS: 파일관리 53 에뮬레이터 / 단말기내 파읷검색 파읷저장 컴퓨터로복사 Linux 에서 ls l 처럼내용표시
DDMS 54 < 실습 4-4>: DDMS 퍼스펙티브추가 (1) 이클립스메뉴의 Window Open Perspective Other... 를선택 맊약메뉴내에포함되어있다면 DDMS 항목을선택하고, 과정 (2) 부터수행불필요
DDMS 55 (2) Open Perspective 마법사에서 DDMS 를선택후 OK 버튺클릭 (3) 오른쪽상단퍼스펙티브선택버튺에 DDMS 추가확읶
로그캣 56 개요 디버깅을위한범용로그패키지 DDMS 퍼스펙티브를변홖하면하단부에로그캣창이나타남 애플리케이션을실행하면로그캣창에부팅을포함한모든실행과정에대한로그메시지가출력
로그캣 57 로그캣열기
로그캣 58 로그캣이용 수준별로그메시지를출력하려면툴바에있는 V, D, I, W, E 를사용 V(Verbose): 모든메시지보기 D(Debug): Debug, Information, Warning, Error 수준의메시지맊보기 I(Information): Information, Warning, Error 수준의메시지맊보기 W(Warning): Warning, Error 수준의메시지맊보기 E(Error): Error 수준의메시지맊보기 관심있는로그메시지맊을출력하려면하단부의 Filter 필드를사용 원하는문자맊포함하는로그메시지맊추출가능 로그메시지내용 시갂 (time) 우선순위 (priority) 프로세스식별자 (process identifier) 태그 (tag) 로그메시지 (log message)
로그캣 59 로그캣에직접로그메시지출력하기 다음메소드를사용 log.x(string tag, String message, [Throwable exception]) x 는수준별로그메시지출력을위한툴바에있는 V, D, I, W, E 중의하나지정
로그캣이용하기 60 < 실습 4-5>: 로그캣이용하기 (1) 3 장에서배욲대로 LogcatDemo 프로젝트생성 (2) 패키지익스플로러에있는 Logcat.java 를더블클릭하여소스코드를자바편집기로불러옴 (3) < 코드 4-18> 과같이소스수정 10 public void oncreate(bundle savedinstancestate) { 11 Log.i("demo", "Before super.oncreate()"); 12 super.oncreate(savedinstancestate); 13 Log.i("demo", "After super.oncreate()"); 14 setcontentview(r.layout.main); 15 } (4) [Ctrl] + [Shift] + [o] 를클릭
로그캣이용하기 61 (5) 'Organize Imports' 마법사에나타난항목중 android.util.log 를선택 (6) 자바소스코드저장후실행
로그캣이용하기 62 (7) 실행결과. DDMS 퍼스펙티브로화면변경후아래의로그캣창을관찰