CHAP 10. 액티비티와 인텐트.

Slides:



Advertisements
Similar presentations
Android Application. 최신버전 안드로이드 SDK 설치 1. SDK 설치 접속.
Advertisements

3. 메소드와 변수 SCJP 자격증 프로젝트 발표자 : 최선웅. 1. 메 소 드 개 념 2. 메 소 드 양 식 3. 메 소 드 변 수 4. 메 소 드 예 제 5. 참 고 문 헌 / 자 료 목 차.
Android Tutorial 안드로이드 SDK 설치 및 기초 프로그래밍 강좌입니다 서울대학교 네트워크 융합 및 보안 연구실 권 윤
Application Create Android Side. Application 설계 시 꼭 지켜야 할 5 가지 UI 쓰레드는 UI 만 처리하게 하자 사용자를 방해하지 말라. 다양한 화면 해상도를 지원하라 –Absolutelayout 을 사용하지 말아라 ( 고정값 )
일정 관리 다이어리 제작 JSP Programming with a Workbook. 학습 목표  사용자의 일정을 관리할 수 있는 다이어리에 대하여 알아보자. JSP Programming with a Workbook2.
For Android 이재원.  페이스북 SDK 설치  2 가지 예제 & 소스  API 사용 예제 프로젝트 만들기  Graph API  참고사항 & 사이트.
삼성소프트웨어멤버십 20 th 박희근 ( A n d r o i d.
2014 년 3 학년 1 학기 월요일 분반 (001,005) 인공지능연구실.  Activity  View  View Group - Layout.
Android Application 데이터베이 스. 데이터베이스 활용하 기  안드로이드에 쓰이는 DBMS 의 이름은 SQLite.  SQLite 는 경량의 임베디드 데이터베이스 엔젠이며, 아이폰, 파이어폭스 등 여 러 곳에서 이미 많이 채택된 검증된 엔진이다. 
Unlocking Android 안드로이드 패키지 (1/2) 2 Unlocking Android 안드로이드 패키지 (2/2) 3.
Android Activity & View & Layout
CHAP 3. 첫번째 애플리케이션 예제 #1: text 문자를 출력 예제 #2: UI를 XML로 표현 – main.xml
6 메 뉴.
기본위젯과 레이아웃 둘째 마당 - Chapter 01 Do It! 안드로이드 앱 프로그래밍 Jun. 2013
Chapter 16 : Struts 프레임워크 2. chapter 16 : Struts 프레임워크 2.
CHAP 18. 멀티미디어.
CHAP 10. 액티비티와 인텐트.
Android Programming 고급위젯
액션바와 네비게이션
그림으로 쉽게 설명하는 안드로이드 프로그래밍
액티비티와 리소스.
Android Application 애플리케이션 위젯.
CHAP 19. 구글맵.
클래스 class, 객체 object 생성자 constructor 접근 access 제어 이벤트 event 처리.
○ 본 강의 자료는 이지스퍼블리싱(주)에서 제공하는 강의 교안입니다.
Contents 학습목표 이벤트를 처리하는 여러 가지 형식과 각 형식의 장단점에 대해 상세하게 연구하고 기본적인 이벤트에 대한 실습을 한다. 사용자의 입력을 자유자재로 처리하기 위해서 반드시 습득해야 하는 중요한 기술 실습. 학습내용 이벤트 핸들러 여러 가지 이벤트.
CHAP 7. 메뉴와 대화상자.
Contents 학습목표 Canvas와 Paint 객체를 통해 화면에 원하는 도형을 그리고 속성을 변경하는 기본적인 방법에 대해 소개한다. 토스트로 메시지를 출력하는 방법과 스피커를 통해 소리를 출력하는 방법에 대해서도 알아본다. 학습내용 캔버스 그리기 객체 쉐이더 그외.
Power Java 제3장 이클립스 사용하기.
최윤정 Java 프로그래밍 클래스 상속 최윤정
Java Seminar 6.
첫 번째 애플리케이션 첫째 마당 - Chapter 03 Do It! 안드로이드 앱 프로그래밍 Jun. 2013
Ch.07-5 xml-rpc 사용하기 김상엽.
CHAP 4. 이벤트 처리.
CHAP 6. 이벤트 처리.
UNIT 07 그림책 만들기 1/2 로봇 SW 콘텐츠 연구원 조용수.
CHAP 24. nfc와 앱위젯.
Activity 액티비티는 안드로이드 응용 프로그램을 구성하는 4가지 컴포넌트 중 하나로 가장 빈번히 사용되며 사용자를 대면한다는 면에서 실질적으로 가장 중요한 요소 화면 하나에 대응되며 입출력 기능이 없어 내부에 뷰나 뷰 그룹을 가짐 setContentView 메서드.
8.1 인터페이스 개요와 인터페이스 정의 8.2 인터페이스의 사용 8.3 인터페이스의 상속 8.4 인터페이스 참조
CHAP 11. 액티비티와 인텐트.
CHAP 7. 메뉴와 대화상자.
CHAP 8. 그래픽.
Power Java 제14장 배치 관리자.
CHAP 6. 이벤트 처리.
CHAP 14. 데이터베이스와 환경 설정.
CHAP 13. 네트워크.
Intent.
속성과 리스너 초기화 파라미터 외 파라미터에 대해 이해한다. 리스너를 생성해보고 사용에 대해 이해한다.
CHAP 12. 리소스와 보안.
CHAP 13. 방명록 만들기 실습.
CHAP 3. 첫번째 애플리케이션.
Lesson 2. 기본 데이터형.
Chapter6 : JVM과 메모리 6.1 JVM의 구조와 메모리 모델 6.2 프로그램 실행과 메모리 6.3 객체생성과 메모리
CHAP 13. 서비스와 방송 수신자.
안드로이드 앱 개발과정 Step1. 기초과정 강사 : 정 훈 희.
10. 액티비티와 인텐트 제목. 10. 액티비티와 인텐트 제목 액티비티의 개념을 파악한다. 인텐트의 개념과 활용법을 익힌다. 액티비티 생명주기에 대해 알아본다.
기말 프로젝트 계획 MVC 패턴 기반 웹 애플리케이션 개발 프로젝트명 : 팀명 : 팀원 :
3강_레이아웃-I 화면구성 요소 뷰에 대한 이해 LinearLayout Lecturer Kim Myoung-Ho
CHAP 21. 전화, SMS, 주소록.
Intent.
Homework #12 (1/2) 프로그램을 작성하고, 프로그램과 실행 결과를 프린트하여 제출한다.
안드로이드 앱 개발과정 Step1. 기초과정 강사 : 정 훈 희.
세션에 대해 알아보고 HttpSession 에 대해 이해한다 세션 관리에 사용되는 요소들을 살펴본다
CHAP 11. 리소스와 보안.
Android -Data Base 윤수진 GyeongSang Univ. IT 1.
15강_액티비티 액티비티란? 새로운 액티비티로 전환 생명주기 화면방향(Orientation)
Power Java 제14장 배치 관리자.
CHAP 15. 데이터 스토리지.
Platform Builder 사용법.
CHAP 5. 메뉴와 대화상자.
Presentation transcript:

CHAP 10. 액티비티와 인텐트

4가지의 중요한 개념 애플리케이션(application) 액티비티(activities) 액티비티 스택(activity stack) 태스크(task)

애플리케이션 한 개 이상의 액티비티들로 구성된다. 액티비티들은 애플리케이션 안에서 느슨하게 묶여 있다.

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

태스크 스택에 있는 액티비티

액티비티 스택 Back 키를 누르면 현재 액티비티를 제거하고 이전 액티비티로 되돌아 간다. 사용자가 방문한 액티비티들은 어딘가에 기억

다음과 같은 상태도 가능하다

인텐트 각각의 화면은 별도의 액티비티로 구현된다. 하나의 액티비티(화면)에서 다른 액티비티(화면)로 전환하려면 어떻게 하여야 하는가?

인텐트 다른 액티비티를 시작하려면 액티비티의 실행에 필 요한 여러 가지 정보들을 보내주어야 한다. 정보를 인텐트에 실어서 보낸다.

인텐트의 종류 명시적 인텐트(explicit intent) 암시적 인텐트(implicit intent) “애플리케이션 A의 컴포넌트 B를 구동시켜라“와 같이 명확하게 지정 암시적 인텐트(implicit intent) “지도를 보여줄 수 있는 컴포넌트이면 어떤 것이라도 좋다”

명시적인 인텐트 실행하고자 하는 액티비티의 이름을 적어 준다. Intent intent = new Intent(this, NextActivity.class); startActivity(intent);

명시적인 인텐트 예제 여기서 두 개의 액티비티로 이루어진 애플리케이션 을 작성하여 보자. 첫 번째 액티비티는 Activity1, 두 번째 액티비티는 Activity2라고 하자.

레이아웃 파일 layout1.xml

레이아웃 파일 layout2.xml

Activity1.java

Activity2.java

메니페스트 파일

실행 결과

여러 페이지로 된 애플리케이션 작성

Main.xml <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/FrameLayout1" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@drawable/soccer" > <AbsoluteLayout android:orientation="vertical" > <Button android:id="@+id/button1" android:layout_width="192dp" android:layout_height="wrap_content" android:layout_x="100px" android:layout_y="100px" android:background="#ff0000" android:gravity="center" android:onClick="myListener" android:text="Introduction" /> … </AbsoluteLayout> </FrameLayout>

Intro.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@drawable/soccer2" android:orientation="vertical" > <TextView android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Association football, ...." android:textAppearance="?android:attr/textAppearanceLarge" android:textColor="#FFFFFF" /> </LinearLayout>

Setup.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Difficulties" android:textAppearance="?android:attr/textAppearanceLarge" /> <SeekBar android:id="@+id/seekBar1" android:layout_height="wrap_content" /> android:text="Players" android:id="@+id/seekBar2" </LinearLayout>

Start.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@drawable/soccer3" android:orientation="vertical" > <AnalogClock android:id="@+id/analogClock1" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <Chronometer android:id="@+id/chronometer1" android:layout_height="wrap_content" android:text="Chronometer" android:textSize="@dimen/Large" android:textStyle="bold|italic" android:typeface="serif" /> </LinearLayout>

MultiPageActivity.java package kr.co.company.multipage; // 소스만 입력하고 Ctrl-Shift-O를 눌러서 import 문장을 자동으로 생성한다. public class MultiPageActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); } public void myListener(View target) { Intent intent = new Intent(getApplicationContext(), IntroActivity.class); startActivity(intent); public void myListener1(View target) { SetupActivity.class); public void myListener2(View target) { StartActivity.class);

IntroActivity.java package kr.co.company.chap11lab; import android.app.Activity; import android.os.Bundle; public class IntroActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.intro); }

매니페스트 파일 <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" ... <application <activity android:name="IntroActivity" android:label="IntroActivity" > </activity> android:name="SetupActivity" android:label="SetupActivity" > android:name="StartActivity" android:label="StartActivity" > </application> </manifest>

실행결과

액티비티에서 결과받기

값을 저장하고, 값을 읽는 메소드

예제

레이아웃 파일 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="match_parent" android:layout_height="match_parent"> <Button android:layout_width="match_parent" android:text="서브 액티비티로부터 문자열 반환받기“ android:layout_height="wrap_content" android:id="@+id/button"> </Button> <TextView android:layout_width="wrap_content" android:text="반환된 문자열“ android:id="@+id/textView1"> </TextView> <TextView android:layout_height="wrap_content" android:text="____________________" android:id="@+id/text" android:layout_width="match_parent"> </LinearLayout>

레이아웃 파일 sub.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <EditText android:id="@+id/edit" android:layout_height="wrap_content" > <requestFocus></requestFocus> </EditText> …

레이아웃 파일 sub.xml <LinearLayout android:id="@+id/linearLayout1" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="center" > <Button android:id="@+id/button_ok" android:layout_width="wrap_content" android:layout_weight="1" android:text="입력완료" > </Button> android:id="@+id/button_cancel" android:text="취소" > </LinearLayout>

매니페스트 파일 수정 <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" ... <application <activity android:name="kr.co.company.activityforresult.MainActivity" android:label="@string/app_name" > </activity> android:name=".SubActivity" android:label="SubActivity" > </application> </manifest>

Mainactivity.java ... public class MainActivity extends Activity { static final int GET_STRING = 1; TextView text; @Override public void onCreate(Bundle icicle) { super.onCreate(icicle); setContentView(R.layout.main); Button button = (Button) findViewById(R.id.button); text = (TextView) findViewById(R.id.text); button.setOnClickListener(new OnClickListener() { // @Override public void onClick(View arg0) { Intent in = new Intent(MainActivity.this, SubActivity.class); startActivityForResult(in, GET_STRING); } }); }

Mainactivity.java ... @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == GET_STRING) { if (resultCode == RESULT_OK) { text.setText(data.getStringExtra("INPUT_TEXT")); }

Subactivity.java ... public class SubActivity extends Activity { EditText edit; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.sub); edit = (EditText) findViewById(R.id.edit); Button button_ok = (Button) findViewById(R.id.button_ok); button_ok.setOnClickListener(new OnClickListener() { public void onClick(View v) { Intent intent = new Intent(); intent.putExtra("INPUT_TEXT", edit.getText().toString()); setResult(RESULT_OK, intent); finish(); } });

Subactivity.java Button button_cancel = (Button) findViewById(R.id.button_cancel); button_cancel.setOnClickListener(new OnClickListener() { public void onClick(View v) { setResult(RESULT_CANCELED); finish(); } });

실행 결과

암시적인 인텐트 어떤 작업을 하기를 원하지만 그 작업을 담당하는 컴포넌트의 이름을 명확하게 모르는 경우에 사용

암시적인 인텐트의 형식 Intent intent = new Intent(Intent.ACTION_SEND); intent.putExtra(Intent.EXTRA_EMAIL, recipientArray); startActivity(intent);

액션의 종류 상수 타겟 컴포넌트 액션 ACTIN_VIEW 액티비티 데이터를 사용자에게 표시한다. ACTION_EDIT 사용자가 편집할 수 있는 데이터를 표시한다. ACTION_MAIN 태스크의 초기 액티비티로 설정한다. ACTION_CALL 전화 통화를 시작한다. ACTION_SYNC 모바일 장치의 데이터를 서버 상의 데이터와 일치시킨다. ACTION_DIAL 전화 번호를 누르는 화면을 표시한다.

암시적인 인텐트 예

인텐트 예제

사용자 인터페이스 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent" > <Button android:id="@+id/call" android:layout_height="wrap_content" android:onClick="onClick" android:text="전화걸기" > </Button> android:id="@+id/map" android:text="지도보기" >

사용자 인터페이스 <Button android:id="@+id/web" android:layout_width="match_parent" android:layout_height="wrap_content" android:onClick="onClick" android:text="웹브라우저" > </Button> android:id="@+id/contact" android:text="연락처보기" > </LinearLayout>

암시적 인텐트 예제 public class ImplicitIntentActivity extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); } public void onClick(View view) { Intent intent = null; switch (view.getId()) { case R.id.web: intent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://www.google.com")); break; case R.id.call: intent = new Intent(Intent.ACTION_DIAL, Uri.parse("tel:(+82)12345789"));

암시적 인텐트 예제 case R.id.map: intent = new Intent(Intent.ACTION_VIEW, Uri.parse("geo:37.30,127.2?z=10")); break; case R.id.contact: Uri.parse("content://contacts/people/")); } if (intent != null) { startActivity(intent);

매니페스트 파일 수정 ... <uses-permission android:name="android.permission.CALL_PHONE" > </uses-permission> <uses-permission android:name="android.permission.CAMERA" > <uses-permission android:name="android.permission.READ_CONTACTS" > <uses-permission android:name="android.permission.INTERNET"/>

실행 결과

멀티태스킹 동시에 여러 태스크를 실행 현재의 태스크를 배경(background)으로 보내고 다 른 태스크를 전경(foreground)에서 시작할 수 있다.

멀티 태스킹의 예

HOME 키를 누르면 멀티 태스킹이 시작된다.

오버뷰 화면 최근에 사용된 액티비티들과 태스크들을 보여주는 화면

태스크 관리하기 기본적인 원칙: 실행되는 액티비티들을 차례대로 스 택에 넣고 “후입선출(last in, first out)”

SingleTop

singleTask

FLAG_ACTIVITY_CLEAR_TOP

인텐트 필터 컴포넌트는 자신들이 처리할 수 있는 인텐트의 종류 를 인텐트 필터에 기록한다.

인텐트 필터

인텐트 필터 <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="kr.co.company.ImplicitIntent" android:versionCode="1" android:versionName="1.0"> <application android:icon="@drawable/icon" android:label="@string/app_name"> <activity android:name=".ImplicitIntent" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> <uses-sdk android:minSdkVersion="9" /> <uses-permission android:name="android.permission.CALL_PHONE"></uses-permission> </manifest>

노트패드의 인텐트 필터 <activity android:name="NotesList" android:label="@string/title_notes_list"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> <intent-filter> <action android:name="android.intent.action.VIEW" /> <action android:name="android.intent.action.EDIT" /> <action android:name="android.intent.action.PICK" /> <category android:name="android.intent.category.DEFAULT" /> <data android:mimeType="vnd.android.cursor.dir/vnd.google.note" /> </intent-filter> <intent-filter> <action android:name="android.intent.action.GET_CONTENT" /> <category android:name="android.intent.category.DEFAULT" /> <data android:mimeType="vnd.android.cursor.item/vnd.google.note" /> </intent-filter> </activity>

액티비티 생애주기 실행 상태(resumed, running): 액티비티가 전경에 위치하고 있으며 사용자의 포커스를 가지고 있다. 일시멈춤 상태(paused): 다른 액티비티가 전경에 있 으며 포커스를 가지고 있지만 현재 액티비티의 일부 가 아직도 화면에서 보이고 있는 상태이다. 정지 상태(stopped): 액티비티는 배경에 위치한다.

액티비티 상태

액티비티 객체 생성 단계

일시 멈춤 상태

정지되었다가 다시 실행하는 경우

중요한 콜백 메소드 onCreate() onPause() 액티비티가 생성되면서 호출 중요한 구성요소들을 초기화 사용자가 액티비티를 떠나고 있을 때, 이 메소드가 호출 그 동안 이루어졌던 변경사항을 저장

액티비티 생애주기 예제 ... public class LifeCycleTest extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); } public void onStart() { super.onStart(); Log.i("LifeCycle", "onStart() 호출"); public void onResume() { super.onResume(); Log.i("LifeCycle", "onResume() 호출");

액티비티 생애주기 예제 @Override public void onPause() { super.onPause(); Log.i("LifeCycle", "onPause() 호출"); } public void onStop() { super.onStop(); Log.i("LifeCycle", "onStop() 호출"); public void onDestroy() { super.onDestroy(); Log.i("LifeCycle", "onDestroy() 호출");

실행 결과

액티비티 상태 저장

액티비티 상태 저장 선택한 상품을 저장하는 애플리케이션 작성

상태 저장 및 복구 public class SaveRestoreTestActivity extends Activity { Button button1, button2; TextView text; int count = 0; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); text = (TextView) findViewById(R.id.text); button1 = (Button) findViewById(R.id.button1); button1.setOnClickListener(new OnClickListener() { public void onClick(View v) { count++; text.setText("현재 개수=" + count); } }); button2 = (Button) findViewById(R.id.button2); button2.setOnClickListener(new OnClickListener() { public void onClick(View v) { count--;

상태 저장 및 복구 public class SaveRestoreTestActivity extends Activity { … public void onCreate(Bundle savedInstanceState) { if (savedInstanceState != null) { count = savedInstanceState.getInt("count"); text.setText("현재 개수=" + count); } @Override public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putInt("count", count);

실행 결과