12 주차 인텐트
학습내용 1. 서브액티비티 2. 인텐트 3. 액티비티의생명주기
서브액티비티
액티비티 액티비티개요 - 안드로이드응용프로그램을구성하는주요콤포넌트의하나이며, 각예제마다하나씩액티비티를만들었는데각예제의화면하나가바로액티비티임
액티비티 액티비티개요 - 윈도우와유사한개념이지만 하나의화면 이라고이해하는것이옳음 - 즉, 액티비티는사용자와상호작용할수있는하나의윈도우라고생각하면옳음
액티비티 액티비티개요 - 사용자와의인터페이스를구성하지만그자체는출력기능이없으므로직접적으로보이지않음
액티비티 액티비티와 View - 사용자눈에실제로보이는것은 View 이며, 액티비티는반드시내부에 View 나 View 그룹을가져야함 - 액티비티가생성될때마다호출되는 setcontentview 메소드가액티비티안에 View 를배치하는명령임
액티비티 실제응용프로그램 - 실제응용프로그램에서는한화면에서복잡한동작을다수행할수없으므로기능별로작업을실행할수있는여러개의액티비티가필요함 - 또한여러개의액티비티를생성하였기때문에액티비티간에통신할수있는방법이필요함
예제 1. 액티비티 - 메인액티비티 에서 서브액티비티 를호출할수있는장치가있어야하므로 Button 을하나배치하고 메인액티비티 라는것을표시하기위한문자열도하나배치함
액티비티 예제 1. CALLactivity.xml <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text= Main Activity android:typeface= serif" android:textcolor= #0100FF android:textsize= 25sp" />
액티비티 예제 1. CALLactivity.xml <Button android:id="@+id/call" android:layout_width="wrap_content" android:layout_height="wrap_content" android:onclick="monclick" android:text="call" /> </LinearLayout>
예제 1. 액티비티 - CALLactivity.xml 파일 ( 새로만든실습프로젝트라면 activity_main.xml) 을작성하여레이아웃을정의함 - MainActivity 라는설명문자열과 CALL Button 만배치함
액티비티 예제 1. subactivity.xml - 레이아웃을정의하는 XML 문서하나와동작을정의하는 java 파일이작성되어야액티비티하나가정의됨
액티비티 예제 1. subactivity.xml - 따라서 res/layout 폴더에 subactivity.xml 파일을만들고메인액티비티와마찬가지로 TextView 와 Button 을하나씩배치함
액티비티 예제 1. subactivity.xml <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text= Sub Activity android:typeface= serif android:textcolor="#ff5e00" android:textsize= 25sp" />
액티비티 예제 1. subactivity.xml <Button android:id="@+id/close" android:layout_width="wrap_content" android:layout_height="wrap_content" android:onclick="monclick" android:text="close" /> </LinearLayout>
액티비티 예제 1. subactivity.xml - TextView 는서브액티비티라는것을표시하고 Button 은종료명령을수행함 - 서브액티비티를위한코드는 SubActivity.java 라는이름으로소스코드를작성함
액티비티 예제 1. SubActivity.java package exam.callactivity; import android.app.*; import android.content.*; import android.os.*; import android.view.*; import android.widget.*; public class SubActivity extends Activity { public void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.subactivity); } } public void monclick(view v) { finish(); }
액티비티 예제 1. SubActivity.java - 액티비티이므로당연히 Activity 클래스로부터상속을받으며 oncreate 를재정의하고 super.oncreate 까지호출하여기본적인초기화를수행해야함
액티비티 예제 1. SubActivity.java - 이후의초기화를위해 setcontentview 메소드를호출하여액티비티안에 View 나 View 그룹을채움
액티비티 예제 1. SubActivity.java - 앞에서정의해놓은 subactivity 레이아웃을채웠으며 Button 의클릭이벤트에서 finish 메소드를호출하여액티비티를종료함
액티비티 예제 1. - CallActivity.java - 호출될액티비티가준비 (Subactivity.java, subactivity.xml 의작성 ) 되었으며, 메인에서 CALL 버튼을누를때서브액티비티를호출할수있음
액티비티 예제 1. - CallActivity.java - CALL 버튼의클릭이벤트핸들러에액티비티호출문을작성함
액티비티 예제 1. - CallActivity.java package exam.callactivity; import android.app.*; import android.os.*; import android.widget.*; import android.content.*; import android.view.*; public class CallActivity extends Activity { public void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.callactivity); }
액티비티 예제 1. - CallActivity.java } public void monclick(view v) { Intent intent = new Intent(this, SubActivity.class); startactivity(intent); }
예제 1. 액티비티 - 액티비티를호출할때는 startactivity 메소드를사용하며, 호출할대상을지정하는 Intent 객체는 startactivity 의인수로전달됨 - 모든코드가다구현되었으므로 CALL 버튼을누르면 서브액티비티 는아직동작하지않음
액티비티 예제 1. 에러결과화면 - 메인액티비티 에서 CALL 버튼을누르면다음과같은예외가발생하며다운되어버릴것임
액티비티 예제 1. 에러결과화면
예제 1. 액티비티 - 보안상의이유로응용프로그램에포함된모든액티비티는반드시매니페스트파일에등록되어야함
예제 1. 액티비티 - 매니페스트파일에등록되지않은액티비티는존재하지않는것으로취급되므로 startactivity 메소드가 SubActivity 를찾지못하는것임
액티비티 예제 1. AndroidManifest.xml - 매니페스트파일에 subactivity 를등록함 <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="exam.firstactivity" android:versioncode="1" android:versionname="1.0" > <uses-sdk android:minsdkversion="16" android:targetsdkversion="16" />
액티비티 예제 1. AndroidManifest.xml <application android:allowbackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/apptheme" > <activity android:name="exam.callactivity.callactivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.main" /> <category android:name="android.intent.category.launcher" /> </intent-filter>
액티비티 예제 1. AndroidManifest.xml </activity> <activity android:name=.subactivity android:label= SubActivity" /> </application> </manifest>
예제 1. 액티비티 - 액티비티의이름과타이틀바에표시할제목은최소한지정해야함 - 액티비티의이름은패키지명을포함한전체경로로지정하며같은패키지에속해있을때는앞에. 을찍음
예제 1. 액티비티 - 인텐트필터나권한등에대한여러가지지정을더포함할수있음
액티비티 예제 1. 결과화면
예제 1. 액티비티 - 최초메인액티비티가실행됨 - 메인화면에서 CALL 버튼을누르면서브액티비티가호출됨 - 메인액티비티위에새로운액티비티가추가로열린상태임
예제 1. 액티비티 - 화면의 CLOSE 버튼을누르거나장비의 Back 버튼을누르면서브액티비티가종료되고메인액티비티로다시돌아감
액티비티 서브액티비티절차 - 액티비티를새로추가하는절차 1 새로만들서브액티비티의레이아웃을 XML 파일에정의함 2 새로만들서브액티비티에서실행될코드를 java 파일로작성함 3 새로추가한서브액티비티를매니페스트에등록함 4 메인액티비티에서 startactivity 메소드로서브액티비티를호출함
인텐트
인텐트 인텐트 (Intent) - 액티비티끼리서로호출하기위해필요한 통신장치 혹은 메시지전달방법
인텐트 인텐트 (Intent) - 인텐트는액티비티뿐만아니라서비스, CP(Content Provider), BR(Broadcast Receiver) 등의콤포넌트들이수행해야할작업에대한정보를가지며작업결과를돌려주기위해서도사용됨
인텐트 인텐트예 ) - 그림을보여주는액티비티를호출한다면출력해야할그림이무엇인지를알려주어야함 - 입력을받는액티비티를호출한경우에는사용자가입력한정보가무엇인지반환해야함
인텐트 인텐트예 ) - 함수의인수나반환값과유사하게사용됨
인텐트 액티비티호출 - 액티비티를호출하는메소드 void startactivity (Intent intent) - 인텐트하나만을인수로취하는데인텐트안에호출상대, 요청작업에대한정보가들어있음
인텐트 액티비티호출 - 액티비티를호출하기전에요청작업에대한정보를인텐트객체에먼저정의해야함
인텐트 인텐트생성자 Intent (Context packagecontext, Class<?> cls) Intent (String action, Uri uri, Context packagecontext, Class<?> cls) - 내부의서브액티비티를호출할때주로사용하는첫번째생성자 - 액티비티클래스를구현하는콘텍스트와호출될액티비티의클래스정보가인수로전달됨
인텐트 인텐트생성자 - 콘텍스트는호출자의정보인데주로 this 이며 cls 는호출되는액티비티의클래스정보임 - 실행중에액티비티를생성해야하므로클래스정보가필요함
호출문 인텐트 Intent intent = new Intent(CallActivity.this, SubActivity.class); startactivity(intent); - 호출자는메인액티비티자신이고 SubActivity 를호출한다는뜻임
호출문 인텐트 - startactivity 메소드는인텐트의정보를참조하여 CallActivity 를부모로하는 SubActivity 를호출함
인텐트 명시적인텐트 - 인텐트에호출할대상콤포넌트가분명히명시되어있는것을명시적인텐트 (Explicit intent) 라고함
인텐트 명시적인텐트 - 같은응용프로그램내의서브액티비티를호출할때사용하며, 권한만있다면외부응용프로그램의액티비티도호출할수있음
인텐트 암시적인텐트 - 호출대상이분명히정해지지않은인텐트를암시적인텐트 (Implicit intent) 라고함 - 주로다른응용프로그램의콤포넌트를호출할때사용됨
인텐트 암시적인텐트 - 운영체제에는인텐트의정보를참조하여호출할콤포넌트를검색하는알고리즘이작성되어있으며시스템은적절한콤포넌트를찾기위해설치된모든응용프로그램의콤포넌트를조사함
인텐트 인텐트 (Intent) (= 의도 ) - 의도를명확히하기위해여러가지정보들 (Action, Data, Type, Category, Component 등 ) 이포함됨 - 이정보들을생성자로전달하여초기화할수도있지만객체를생성한후메소드로변경하거나조사할수도있음
Action 인텐트 - 프로그래머가실행하고자하는동작을의미하며, 인텐트를통한수행작업을지정함 - BR 콤포넌트는발생사건에대한정보를알려줌
인텐트 Action 값 액션대상설명 ACTION_CALL 액티비티통화를시작한다. ACTION_EDIT 액티비티데이터를표시하고편집한다. ACTION_MAIN 액티비티 ACTION_VIEW 액티비티뭔가를보여준다. ACTION_DIAL 액티비티전화를건다. ACTION_BATTERY_LOW BR 배터리가부족하다. 메인액티비티를실행한다. 입출력되는데이터는없다. ACTION_HEADSET_PLUG BR 헤드셋이장비에접속되거나분리되었다. ACTION_SCREEN_ON BR 화면이켜졌다. ACTION_TIMEZONE_CHANGED BR 타임존이변경되었다.
Action 인텐트 - 시스템이미리정의해놓은동작을사용할수도있고사용자가임의의동작을정의할수도있음 - Action 의종류가다양하여정수타입이아니라문자열타입으로정의되어있음
Action 인텐트 - Action 을조사하거나변경할때는 getaction, setaction 메소드를사용함
Data 인텐트 - Action 에필요한상세데이터를제공함 - 단독 Action 의경우는별도의 Data 가필요없지만대부분의 Action 은수행작업에대한정보가필요하며 Data 로지정함
Data 인텐트 - 예 ) ACTION_EDIT 액션에대해서는 어떤파일을편집할것인지 를지정해야하며, ACTION_CALL 액션에대해서는 누구에게전화를걸것 인가를 지정해야함
Data 인텐트 - Action 의목적이되는대상은광범위하기때문에, 임의의대상을유일하게가리킬수있는 URI 타입으로되어있음
Data 인텐트 - URI 는웹사이트주소인 URL, 로컬저장장치의파일경로, 주소록의레코드하나까지도유일하게지정할수있는범용적인포맷이므로데이터로전달하기에적합함
Data 인텐트 - Data 를액세스할때는 getdata, setdata 메소드를사용함
인텐트 Action 과 Data - Action 과 Data 정보는 ~ 에대한 ~ 동작 까지를지정할수있으므로대개의경우는이두정보만으로도대상콤포넌트를찾을수있음
인텐트 Action 과 Data - 정확하고상세한처리를위해추가적인정보가더필요한경우 : Action 을처리할수있는적합한콤포넌트가둘이상이거나데이터의타입이애매한경우 Type, Category, Component, Extras 정보들도가급적상세하게지정해야함
Type 인텐트 - 데이터의타입은대개의경우자동으로판별가능함 - 예 ) http://~ 으로시작하면웹페이지를의미하며, tel:~ 으로시작하면전화번호라는뜻임
Type 인텐트 - 모든경우에 Type 판별이완벽하게수행되는것은아님 ( 확장자가 jpg 이지만실제로는 png 포맷일수도있고아예확장자가없는경우도있음 )
Type 인텐트 - Type 이애매하거나자동판별을신뢰할수없는경우라면 gettype, settype 메소드로데이터의 MIME 타입을직접지정해야함
Type 인텐트 - 호출자가 Type 을직접지정하면운영체제는더이상자동판별을시도하지않고지정된타입을따름
인텐트 Category - 실행할액션에대한좀더추가적인상세정보를제공함 - 추가정보이므로여러개를동시에지정할수도있음
인텐트 Category - addcategory 메소드는 Category 를추가하고 removecategory 는 Category 를제거함
인텐트 Component - 인텐트를처리할 Component 를명시적으로지정함 - 이속성이지정되면명시적인텐트가되므로다른정보들은더이상참조하지않음
액티비티의생명주기
액티비티의생명주기 안드로이드멀티태스킹 - 안드로이드는멀티태스킹을지원하므로여러개의응용프로그램을동시에실행할수있음 - 그러나데스크톱환경과는달리자원이넉넉하지않으므로여러가지제약이따름
액티비티의생명주기 안드로이드멀티태스킹 - 특히메모리가적어많은프로그램을동시에실행하기에는무리가있음 - 또한화면이좁기때문에여러개의프로그램을오버랩시켜놓고동시에사용할수는없으며한번에하나의프로그램만보임
액티비티의생명주기 생명주기 (Life Cycle) - 여러개의프로그램을동시에실행할수는있지만사용자눈에보이고직접사용하는프로그램은언제나하나임 - 대신사용자는배경의프로그램을활성화함으로써교대로실행할수있음
액티비티의생명주기 생명주기 (Life Cycle) - 액티비티는시작, 실행, 활성, 비활성화, 정지, 종료되는일련의상태를순환하는데이것을생명주기라고함 - 사용자의선택이나시스템의자원사정에따라액티비티의상태는끊임없이바뀜
액티비티의생명주기 액티비티관리 - 시스템은태스크의실행중인액티비티들을스택으로관리함 - 액티비티가새로생성되면스택의제일위에놓여활성화됨
액티비티의생명주기 액티비티관리 - 이상태에서다른액티비티가또생성되면기존액티비티는잠시가려지고새액티비티가스택의제일위에배치됨
액티비티의생명주기 액티비티관리 - 스택제일위의액티비티가종료되면바로아래쪽에있는액티비티가자연스럽게활성화될것임
액티비티의생명주기 액티비티관리 - 스택의액티비티는넣고빼기만할뿐순서가바뀌지는않음 - 스택상의액티비티는다음세가지상태중의하나임 실행 (active, running) 일시정지 (pause) 정지 (stopped)
액티비티의생명주기 실행상태 (active, running) - 사용자가직접사용하는상태임 - 스택의제일위에있으며화면상에서도역시제일위에있음 - 입력포커스를가지며사용자의입력을직접처리함
액티비티의생명주기 일시정지상태 (pause) - 포커스는잃었지만사용자에게는보이는상태임 - 위쪽에다른액티비티가있지만화면전체를다가리지않았거나반투명한경우가이에해당함
액티비티의생명주기 일시정지상태 (pause) - 살아있는상태와같지만시스템에의해강제종료될수도있음
액티비티의생명주기 정지상태 (stopped) - 다른액티비티에의해완전히가려진상태이며사용자눈에보이지는않음 - 그러나모든정보를다유지하고있으므로언제든지다시활성화될수있음
액티비티의생명주기 정지상태 (stopped) - 시스템은메모리가부족하면정지상태의액티비티를언제든지강제종료할수있음
액티비티의생명주기 액티비티의생명주기 시작 oncreate() 액티비티가다시선택될때 onrestart() onstart() 액티비티가다시선택될때 화면의뒤로갈때 onresume() 실행 onpause() onstop() 다른액티비티가포그라운드가될때 강제종료 우선순위가더높은앱이메모리를필요로할때 ondestory() 종료
액티비티의생명주기 액티비티생명주기 - 액티비티는처음생성되어완전히파괴될때까지앞그림의메소드들을순서대로거침
액티비티의생명주기 액티비티생명주기 - 일부는생략될수도있고활성화상태가자주바뀌면 onpause 와 onresume 은여러번호출되기도함
액티비티의생명주기 액티비티상태메소드 메소드 oncreate 해야할일 액티비티를초기화한다. 중지했다가재시작하는경우라면액티비티의이전상태정보인 Bundle 이전달된다. 이정보대로재초기화한다. onrestart 재시작될때호출된다. 특별히할일은없다. onstart 액티비티가사용자에게보이기직전에호출된다. onresume 사용자와상호작용을하기직전에호출된다. 이단계에서스택의제일위로올라간다. onpause 다른액티비티가실행될때호출된다. 이단계에서미저장한데이터가있으면저장하고애니메이션은중지해야한다. 이메소드가리턴되어야새액티비티가활성화되므로시간을너무많이끌어서는안된다. onstop 액티비티가사용자에게보이지않게될때호출된다. ondestroy 액티비티가파괴될때호출된다. 시스템에의해강제로종료되는것인지아니면 finish 메소드호출에의해스스로종료하는것인지는 isfinishing 메소드로조사할수있다.
예제참고문헌 본교재의예제는저자의허락을받아 [ 안드로이드프로그래밍정복, 한빛미디어,, 김상형저 ] 에서가져왔습니다.
학습개요 ü 액티비티를추가하는방법에대해학습한다. ü 인텐트의개념과속성및실행방법에대해학습한다.
학습개요 ü 액티비티의생명주기에대해학습한 다.
학습목표 ü 액티비티추가하는방법이해 ü 인텐트실행방법이해 ü 액티비티의생명주기이해
주요용어 ü 액티비티 : 안드로이드응용프로그 램을구성하는주요콤포넌트의하나
주요용어 ü 인텐트 : 액티비티끼리서로호출하 기위해필요한통신을위한장치혹은 메시지전달방법
주요용어 ü 생명주기 : 액티비티의시작, 실행, 활성, 비활성화, 정지, 종료되는일련의 상태를순환하는것
학습정리 ü 추가액티비티 : 메인액티비티 에서 서브액티비티 를호출하기위해서는매니페스트파일에반드시등록해야함
학습정리 ü 인텐트 : 액티비티, 서비스, CP, BR 등의콤포넌트들이수행해야할작업에 대한정보를가지며작업결과를돌려 주기위해서도사용됨 Intent (Context packagecontext, Class<?> cls) Intent (String action, Uri uri, Context packagecontext, Class<?> cls)
학습정리 ü 액티비티의생명주기 : 액티비티는처음생성되어완전히파괴될때까지시작, 실행, 활성, 비활성화, 정지, 종료되는일련의상태를거침