다른 패키지 컴포넌트 까지 포함 같은 목적으로 실행되는 컴포넌트의 그룹 액티비티를 순서 기억 액티비티 스택 사용
프로세스(태스크) 부동산 목록 <앱> 매물 보기 <액티비티> 지도 보기 <액티비티> 호출 호출 같은 앱 다른 앱
프로세스(태스크)
스택 관리 정책의 요소 2가지 매니페스트 액티비티 속성 조정, 실행 위치나 회수 제어 인텐트의 플래그를 통해 액티비티 동작 제어 Chap15_memo, Chap15_Camera(압축파일 예제#1)
프로세스(론치모드)
스택상의 생성위치, 회수를 지정하는 속성 AndroidManifest.xml에서 설정 론치모드 설 명 standard Default, 여러 번 생성 가능, 호출할때 마다 새로운 인스턴스가 현재 태스크 스택 위쪽에 새로 생성 singleTop Standard와 생성 회수, 스택 위치 동일. 단, 스택의 최상위에 있을때 생성하지 않음 기존 인스턴스가 onNewIntent메서드로 새 인텐트 받음 singleTask 항상 새로운 태스크를 시작, 스택의 루트에만 놓임 여러 개의 인스턴스 생성 하지 않음 스택의 위쪽에 놓이지 않음 다른 액티비티를 호출, 스택 위쪽에 생성할 수는 있음 singleInstance singleTask와 동일. 단, 다른 액티비티를 스택 위쪽에 생성하지 않음
프로세스(론치모드)
목록 설정 편집 리뷰 촬영 공유 예제 프로세스 간의 관계 <메모장 프로세스> <카메라 프로세스> 촬영 리뷰 촬영 리뷰 리뷰 촬영 <최초 실행> <메모 편집> <사진 촬영 호출>
프로세스(론치모드)
standard chap15_camera : 5초 리뷰 클릭 후 바로 리뷰 클릭 sigleTop 매니패스트에서 launchMode=“singleTop”추가 촬영 리뷰 촬영 리뷰 리뷰 촬영 리뷰 촬영 리뷰
프로세스(론치모드)
singleTask 교차 실행이 아닌 새로운 태스크가 생성 sigleInstance 매니패스트에서 launchMode=“singleInstance”추가 촬영 리뷰 메모 편집 <메모 Task> <카메라 Task> 메모 편집 <메모 Task> 촬영 <카메라 Task> 리뷰 <리뷰 Task>
프로세스(론치모드)
다른 론치모드의 속성 3가지 액티비티가 스택에서 제거되는 시점을 컨트롤 AndroidManifest.xml에서 설정 론치모드 설 명 alwaysRetainTaskState 시간이 오래 지나도 스택의 모든 액티비티 유지 루트 액티비티에 대해 속성을 지정 clearTaskOnLaunch 재시작할 때마다 루트만 빼고 나머지 모두 종료 루트에만 이속성 지정 finishOnTaskLaunch 재시작할 때 이 액디비티를 자동으로 제거 개별 액티비티에 지정 홈으로 간 후 다시 재시작하면 메인 액티비티로 시작 됨
프로세스(인텐트의 플래그)
론치 모드의 런타임 버전 Java소스에서 필요할 때 사용 매니페스트 기록시 속성을 미리 결정해야하는 단점 극복 실행 중 조건을 다르게 띄워야 할때 유용 intent.addFlags(Intent. 플래그); 플래그 설 명 FLAG_ACTIVITY_NEW_TASK 새로운 태스크 시작 FLAG_ACTIVITY_SINGLE_TOP 스택의 제일 위에 있으면 다시 생성하지 않음 FLAG_ACTIVITY_CLEAR_TOP 액티비티가 스택에 있다면 위쪽의 모든 액티비티를 제거하고 새로 생성
프로세스(Application) 안드로이드 전체의 객체계층 OS VM Process (Task) Application Service BR CP Activity Window Layout View OS : VM = 1 : 多 관계 process : VM = 1:1 관계 Application은 process아래 단 하나 지금까지 집중했던 부분들
프로세스(Application)
안드로이드 객체상의 프로그램 실행 시 문제점 전역정보가 생성되지 않는 문제점 액티비티는 프로그램 구성 4개 컴포넌트중의 하나 액티비티가 먼저 실행되지 않고 서비스, BR이 먼저 실행될 경우 발생 전역 정보 초기화할 시점 불확실 유일한 진입점인 메인 액티비티가 없으므로 발생 문제점 해결 : Application 클래스 매니페스트에 기록, 컴포넌트보다 우선적, 유일한 객체 생성 전역변수를 두기에 최적, 프로세스 어디에서나 참조 가능 public void onCreate() public void onTerminate() public void onConfigureationChanged(Configureation newConfig) public void onLowMemory()
프로세스(Application)
Application 클래스의 숙지(예제 #2) Application클래스를 이용 전역정보를 가지고 모드를 변경 1. 새로운 자바 class를 생성하여 Application클래스로 상속받음 2. 전역맴버 작성 3. xml작성 4. 본문과 연결 5. 매니페스트 파일 수정
프로세스(Application)
Chap15_ApplicationTestActivity package exam.chap15; import android.app.Activity; import android.content.*; import android.os.Bundle; import android.view.*; import android.widget.*; public class Chap15_ApplicationTestActivity extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); UpdateNowMode(); Button beg = (Button)findViewById(R.id.beginner); Button pro = (Button)findViewById(R.id.professional); beg.setOnClickListener(new Button.OnClickListener(){ Chap15_ApplicationActivity app = (Chap15_ApplicationActivity)getApplication(); public void onClick(View v) { app.setMode(Chap15_ApplicationActivity.BEGINNER); UpdateNowMode(); } }); pro.setOnClickListener(new Button.OnClickListener(){ Chap15_ApplicationActivity app = (Chap15_ApplicationActivity)getApplication(); public void onClick(View v) { app.setMode(Chap15_ApplicationActivity.PREFESSIONAL); UpdateNowMode(); } }); } void UpdateNowMode(){ TextView txtMode = (TextView)findViewById(R.id.mode); Chap15_ApplicationActivity app = (Chap15_ApplicationActivity)getApplication(); if(app.getMode() == Chap15_ApplicationActivity.BEGINNER){ txtMode.setText("Now Mode : Beginner Mode
‹#›
프로세스(Application)
프로그램 시작 직후 객체 생성의 이유로 매니페스트에 꼭 명시 없으면 Error (가끔 엉뚱한 어플이 실행되기도 함)
‹#›
프로세스(Window)
타이틀 바 아무도 모르게 윈도우의 존재를 알려주는 영역 상단 영역에 타이틀 바, 나머지 부분을 레이아웃으로 채움 getWindow메서드로 윈도우 객체 호출 boolean Window.requestFeature(int featureId) boolean Activity.requestWindowFeature(int featureId) 확장 기능 플래그(OR 로 한꺼번에 지정 불가) DEFAULT_FEATURES 기 본 FEATURE_CONTEXT_MENU 컨텍스트 메뉴 사용 가능, Default FEATURE_CUSTOM_TITLE 커스텀 타이틀 바 사용 FEATURE_PROGRESS 막대모양 프로그래스 표시 FEATURE_INDETERMINATE_PROGRESS 원형의 프로그래스 표시 FEATURE_LEFT_ICON 아이콘을 왼족으로 FEATURE_RIGHT_ICON 아이콘을 오른쪽으로 FEATURE_NO_TITLE 타이틀 바를 가지지 않음 FEATURE_OPTION_PANEL 옵션 패널을 가짐
프로세스(Window)
타이틀 바 없애기(예제#3) C15_noTitle package exam.chap15; import android.app.Activity; import android.os.Bundle; import android.view.*; public class C15_noTitleActivity extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); Window win = getWindow(); win.requestFeature(Window.FEATURE_NO_TITLE); //requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.main); } } 2가지의 방법 1. 자바소스에서 작성 2. 매니패스트에서 테마 삽입
프로세스(Window)
커스텀 타이틀 바(예제#4) Chap15_customtitle package exam.memo; package exam.chap15; import android.app.Activity; import android.os.Bundle; import android.view.*; import android.widget.*; public class Chap15_customtitleActivity extends Activity { TextView mCaption; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Window win = getWindow(); win.requestFeature(Window.FEATURE_CUSTOM_TITLE); setContentView(R.layout.main); win.setFeatureInt(Window.FEATURE_CUSTOM_TITLE, R.layout.customtitle); mCaption = (TextView)findViewById(R.id.rightcaption); findViewById(R.id.btnchange).setOnClickListener(new View.OnClickListener(){ public void onClick(View v){ mCaption.setText("새로운 캡션"); } }); } } customtitle.xml
프로세스(Window)
위쪽 상태란 조작 플래그 void addFlags(int flags) void clearFlags(int flags) FLAG_FULLSCREEN 장식 모두 제거, 전체 화면 FLAG_BLUR_BEHIND 뒤쪽 화면 흐릿하게 FLAG_DIM_BEHIND 뒤쪽 화면 흐리게 FLAG_KEEP_SCREEN_ON 윈도우가 보이는 동안 화면 끄지 않음 FLAG_NOT_FOCUSABLE 키 입력 포커스 받지 않음 FLAG_NOT_TOUCHABLE 터치 입력을 받지 않음 FLAG_SHOW_WALLPAPER 바탕의 배경 화면 보임 FLAG_SHOW_WHEN_LOCKED 화면이 잠긴 상태에서도 보이도록 함
프로세스(Window)
레이아웃 채우기 윈도우는 빈 채로 생성, 안에 레이아웃을 채워 UI구성 void setContentView(int layoutResID) void setContentView(View view, [ViewGroup.LayoutParams params]) void addContentView(View view, ViewGroup.LayoutParams params) set~ 메서드 : 레이아웃을 채움 add~ 메서드 : 기존 레이아웃 유지, 추가로 레이아웃을 겹침 레이아웃 일부만 채우기 void setLayout(int width, int height) void setGravity(int gravity)
Comments