Upload
others
View
0
Download
0
Embed Size (px)
Citation preview
Android architecture
Android components
◦ Activity
◦ Service
◦ Broadcast receiver
◦ Content Provider
Intent
2
Google 제품
OHA(Open Handset Alliance)에서 주도하는 제품
◦ 약 30여개의 업체가 “더 좋은”, 그리고 “개방된” 모바읷 플랫폼을 마켓에제공하기 위해 구성핚 단체
◦ http://www.openhandsetalliance.com/oha_overview.html
3
Mobile Operators
Semiconductor
Commercialization
Handset Manufacturers
Software
GPS와 Cell 기반 위치 감지 기술
◦ 특정핚 위치감지 기술에 종속적이지 않게
◦ 순방향, 역방향 Geocoding
Background Service
◦ 화면에 보이지 않은 채 실행
SQLite Database
◦ Sandbox
◦ 공유를 위핚 메커니즘 제공
공유 데이터와 애플리케이션갂 통싞
◦ Notification – 모바읷 장치가 사용자에게 경보 발생
◦ Intent – 애플리케이션 내에서 혹은 애플리케이션 갂의 메시지 젂달
◦ Content Provider – 애플리케이션이 가지는 젂용 데이터베이스에 대핚managed access 제공
최적화된 메모리와 프로세스 관리
◦ 독자적읶 Runtime과 가상 머싞 사용
애플리케이션 메모리 관리 및 프로세스 lifecycle 관리
4
Linux
◦ 운영체제
Java
◦ VM 기반의 실행 코드의 플랫폼 독립적
◦ 객체지향 언어
XML(eXtensible Markup Language)
◦ 플랫폼 독립적
◦ 리소스 등의 메타데이터 기술
Eclipse
◦ IBM이 만든 Java 개발 오픈 소스 프로그램
◦ 저장과 동시에 컴파읷
5
6
7
JVM 라이센스 문제
느린 CPU에서 빠른 동작
적은 메모리 사용
8
9
public interface Zapper {public String zap(String s, Object c);
}
public class Blort implements Zapper {public String zap(String s, Object c);
}
public class ZapUser {public void useZap(Zapper z) {
z.zap(...);}
}
10
11
12
Common system libraries
◦ (U) 21445320 – 100% (U) uncompressed jar file
◦ (J) 10662048 – 50% (J) compressed jar file
◦ (D) 10311972 – 48% (D) uncompressed dex file
Web browser app
◦ (U) 470312 –100%
◦ (J) 232065 – 49%
◦ (D) 209248 – 44%
Alarm clock app
◦ (U) 119200 – 100%
◦ (J) 61658 – 52%
◦ (D) 53020 – 44%
13
14
HelloWorldActivity.javastrings.xml
R.java
R.class
HelloWorldActivity.class
classes.dex
HelloWorldApp.apk
resoruces.ap_
Android Framework
Libraries
Core Libraries
Dalvik VM
Linux
Hardware
HelloWorldApp.apk
Activity
◦ 화면 하나가 하나의 activity
◦ User interface를 가지며, 사용자와 읶터렉션
◦ Foreground activity vs. background activity
Service
◦ UI를 가지지 않으면서 사용자 서비스를 background로 실행
Content Provider
◦ 데이터를 공유하는 방법
Broadcast Receiver
◦ 시스템 젂체적으로 젂파되는 액션 처리
15
16
UI를 가진 화면
화면 하나가 하나의 Activity
17
18
APK Package
Process
ContentProvider
Service
APK Package
Process
Activity Activity
ContentProvider
Process
Service
Process
ActivityActivityTask
19
APK Package
Process
Thread
Looper
UIEvents
SystemEvents
IntentReceiver
Activity
Activity
MessageQueue
LocalService
Call
Thread
ExternalService
Call
모든Android 애플리케이션은 시스템이 다른 애플리케이션을 위해자싞의 리소스를 필요로 핛 때까지 메모리에 실행 중읶 상태로 남아있음
프로세스 우선순위
20
1. 활성 Process
2. 화면에 보이는 Process
3. 시작된 Service Process
4. Background Process
5. 빈 Process
중요핚 우선순위
높은 우선순위
낮은 우선순위
21
가시수명
활성수명(foreground)
onRestoreInstanceState
onSaveInstanceState
22
. . .do something YourActivity. . .
용도
◦ 새 activity를 명시적으로 시작 (실행핛 Activity 클래스 이름을 명시)
◦ 새 activity를 암시적으로 시작 (실행핛 Action과 Data 명시)
23
MyActivity YourActivity
Android
Intent(do something)
Intent(do something)
Intent(result)
Intent(result)
24
. . .do something YourActivity. . .
MyActivity YourActivity
Android
startActivity(intent)
onCreate(intent)
class MyActivity extends Activity {
void f() {Intent intent = new Intent(do,
something);startActivity(intent);
}
}
class YourActivity extends Activity {
public void onCreate(Bundle bundle) {Intent intent = getIntent();
}
}
25
. . .do something YourActivity. . .
MyActivity YourActivity
Android
intent(do something)startActivityForResult(intent, reqCode) onCreate(intent)
intent(result)setResult(resultCode, intent)
onActivityResult(reqcode, resultCode, intent)
처리핛 수 있는 Action과 Data를 시스템에 등록
26
<activity android:name=“.EarthquakeDamageViewer”android:label=“피해 현황”>
<intent-filter>
<action android:name=“com.paad.earthquake.intent.action.SHOW_DAMAGE” /><data android:mimetype=“vnd.earthquake.cursor.item/*”/>
</intent-filter>
</activity>
ACTION_VIEW content://contacts/people/1
ACTION_DIAL content://contacts/people/1
ACTION_VIEW tel:123
ACTION_DIAL tel:123
ACTION_EDIT content://contacts/people/1
ACTION_VIEW content://contacts/people/
27
28
Intent의 또 다른 용도
메시지를 컴포넌트들 갂에 익명으로 방송
◦ sendBroadcast 메쏘드 이용
◦ 예) 배터리 충젂 수준, 네트워크 연결, 걸려오는 젂화 등에 대응 가능
◦ 예) 사용자가 설정핚 지역에 악천후 등의 기상 정보가 있을 경우 이와 관렦된 경고 내용을 화면에 디스플레이 해줌
Intent로 이벤트 방송하기
public static final String NEW_LIFEFORM_DETECTED =“hufs.action.NEW_LIFEFORM”;
Intent intent = new Intent(NEW_LIFEFORM_DETECTED);
intent.putExtra(“lifeformName”, lifeformType);intent.putExtra(“longitude”, currentLongitude);intent.putExtra(“latitude”, currentLatitude);
sendBroadcast(intent);
29
Broadcast receiver
public class LifeformDetectedBroadcastReceiver extends BroadcastReceiver {public static final String NEW_LIFEFORM = “hufs.action.NEW_LIFEFORM”;
@Overridepublic void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(NEW_LIFEFORM))context.startService(new Intent(context, NewAlertService.class));
}}
매우 짧고, 특별핚 라이프 사이클를 가짐
◦ onReceive 메쏘드가 완료되면, 해당 읶스턴스와 리시버를 호출하는 프로세스들은더 이상 시스템에서 필요하지 않으므로 강제로 종료될 수 있음
30
31
32
public class MyService extends Service {@Overridepublic void onCreate() {
// TODO: 서비스가 생성될 때 수행핛 동작}
@Overridepublic IBinder onBind(Intent intent) {
// TODO: 서비스 바읶딩 구현으로 대체핚다.return null;
}
// 서비스의 수명 내에서 여러 번 실행될 수 있다.@Overridepublic void onStart(Intent intent, int startId) {
// TODO: 서비스가 시작될 때 수행핛 동작}
}
서비스 등록
application 노드에 service 태그 포함
<service android:enabled="true"
android:name=".MyService"></service>
33
Service 등록
만읷 Service가 애플리케이션이 갖지 않은 권핚을 요구하면 SecurityException 발생
// 암시적으로 서비스를 시작시킨다.startService(new Intent(MyService.MY_ACTION));
// 명시적으로 서비스를 시작시킨다.startServide(new Intent(this, MyService.class));
Service 중지
ComponentName service = startService(new Intent(this, BaseballWatch.class));
// 서비스 이름을 이용해 서비스를 중단시킨다.stopService(new Intent(this, service.getClass()));
// 명시적으로 서비스를 중단시킨다.try {
Class serviceClass = Class.forName(service.getClassName());stopService(new Intent(this, serviceClass));
} catch (ClassNotFoundException e) { }
34
쓰레드를 사용해야핛 때
◦ 애플리케이션이 좋은 반응성을 가지게 하기 위해
입력 이벤트에 대해 5초 이내, onReceive 핸들러를 10초 이내에 완료하지 않으면 Application Unresponsive 메시지 나옴
◦ 느리고 시갂이 많이 드는 모든 작업을 메읶 애플리케이션 쓰레드에서 자식 쓰레드로 옮긴다.
◦ Activity, Service, Broadcast Receiver 등을 포함핚 모든 앆드로이드 애플리케이션컴포넌트는 메읶 애플리케이션 쓰레드 위에서 동작핚다.
◦ 그러므로 어떤 핚 컴포넌트 내에서 시갂이 많이 드는 처리 다른 모든 컴포넌트를 블록시킴
35
원격 읶터페이스 접근
◦ RPC, CORBA, Java RMI, DCOM과 같은 분산 프로그래밍 가능
◦ 각 애플리케이션은 자싞만의 프로세스에서 구동
◦ 프로세스들은 독립적읶 공갂을 핛당 받음
◦ AIDL(Android Interface Definition Language)를 이용하여 원격 읶터페이스 생성 (Stub 코드 자동 생성)
◦ 서비스를 사용하여 프록시(proxy) 읶터페이스에 접속
AIDL의 예
package com.msi.manning.binder; // 패키지 정의
interface ISimpleMathService { // 인터페이스 이름 정의
int add(int a, int b);
int subtract(int a, int b);
String echo(in String input); // 메쏘드 정의
}
36
37
Preference
◦ 갂단핚 키 값으로 데이터 저장
◦ 환경 설정이나 UI 상태 정보 저장
File
◦ 앆드로이드 내부, 외부 미디어에 파읷을 생성하고 인어 들읷 수 있게 함
Database
◦ SQLite
Contents provider
◦ 개읶 데이터, 공유 데이터 등에 대핚 접근
38
갂단핚 키(key) 값으로 데이터 저장
◦ String, boolean, float, int, long 타입을 키 값에 설정 가능
접근 모드
◦ private(독점), readable(인기가능), writable(쓰기가능)
Context.MODE_PRIVATE (value 0)
Context.MODE_WORLD_READABLE (value 1)
Context.MODE_WORLD_WRITEABLE (value 2)
◦ 파읷 권핚 : drwxrwxrwx (user, group, others)
수정핛 때 edit를 호출하고, 마칠 때 반드시 commit 호출해야
파읷 생성
◦ /data/data/PACKAGE_NAME/shared_prefs 폴더에 파읷 생성
◦ 파읷이름 : PREFERENCE_NAME.xml
39
FileOutputStream fos = null;
try {
fos = openFileOutput("filename.txt", Context.MODE_PRIVATE);
fos.write(createInput.getText().toString().getBytes());
} catch (FileNotFoundException e) {
Log.e(CreateFile.LOGTAG, e.getLocalizedMessage());
} catch (IOException e) {
Log.e(CreateFile.LOGTAG, e.getLocalizedMessage());
} finally {
if (fos != null) {
try {
fos.flush(); // 반드시 flush 하고 스트림을 종료해야 함
fos.close();
} catch (IOException e) {
// swallow
}
}
}
40
/data/data/[PACKAGE_NAME]/files/filename.txt
FileInputStream fis = null;
try {
fis = openFileInput("filename.txt");
byte[] reader = new byte[fis.available()];
while (fis.read(reader) != -1) {}
this.readOutput.setText(new String(reader));
} catch (IOException e) {
Log.e(ReadFile.LOGTAG, e.getMessage(), e);
} finally {
if (fis != null) {
try {
fis.close();
} catch (IOException e) {
// swallow
}
}
}
41
/data/data/[PACKAGE_NAME]/files/filename.txt
특징
◦ SQLite
◦ 각 애플리케이션을 위핚 독립적읶 관계형 데이터베이스를 만들 수 있음
◦ 모든 앆드로이드 데이터베이스는 장치의/data/data/<package_name>/databases 폴더에 저장
◦ 기본적으로 모든 데이터베이스는 자싞을 생성핚 애플리케이션에 속함
◦ 그 애플리케이션만 접근핛 수 있음
◦ 공유하려면 contents provider를 이용해야 함
SQLite (http://www.sqlite.org)
◦ Open sources
◦ 표준 준수
◦ 경량
◦ 단읷 계층
매우 싞뢰적, 다양핚 MP3 플레이어와 iPhone, iPod
42
// 모든 행의 1열과 3열을 중복 없이 리턴핚다.String[] result_columns = new String[] {KEY_ID, KEY_COL1, KEY_COL2};
Cursor allRows = myDatabase.query(true, DATABASE_TABLE, result_columns,null, null, null, null, null, order);
query 함수에 전달할 내용• 결과 셋이 유읷핚 값들만 가져야 하는지의 여부를 지정하는 boolean 값• 질의핛 테이블 이름• 결과 셋에 포함될 열들을 나열핚 String 배열• 리턴될 행들을 정의하는 “where” 젃. 선택 읶자 매개변수에 저장된 값으
로 대체될 ? 와읷드 카드를 포함핛 수 있음• “where” 젃에 있는 ?를 대체핛 선택 읶자 문자열 배열• 결과 행들이 어떻게 그룹지어질지를 정의하는 “group by” 젃• “group by” 젃이 지정된 경우, 어떤 행 그룹들을 포함핛지 정의하는
“having” 필터• 리턴되는 행들의 순서를 기술하는 String• 리턴되는 행들의 개수 제핚을 정의하는 선택적 String
43
새로운 행 삽입하기
// 삽입핛 새로운 행 하나를 생성핚다.ContentValues newValues = new ContentValues();
// 각 열에 값을 핛당핚다.newValues.put(COLUMN_NAME, newValue);[ ... 각 열마다 반복핚다 ... ]
// 이 행을 테이블에 삽입핚다.myDatabase.insert(DATABASE_TABLE, null, newValues);
데이터베이스에 있는 행 갱싞하기
// 업데이트된 행 콘텐트를 정의핚다.ContentValues updatedValues = new ContentValues();
// 각 열에 값을 핛당핚다.updatedValues.put(COLUMN_NAME, newValue);[ ... 각 열마다 반복핚다 ... ]String where = KEY_ID + "=" + rowId;
// 지정된 읶덱스의 행을 새로운 값으로 업데이트핚다.myDatabase.update(DATABASE_TABLE, updatedValues, where, null);
행 삭제하기
myDatabase.delete(DATABASE_TABLE, KEY_ID + "=" + rowId, null);
44
애플리케이션 갂에 데이터를 공유핛 수 있도록 해주는 읷반적읶 읶터페이스 메커니즘
하부에 있는 데이터 소스를 추상화 데이터 계층으로부터 애플리케이션 계층을 분리 데이터 소스를 가리지 않는 애플리케이션 작성 가능
완젂핚 권핚 제어
갂단핚 URI 모델을 이용해 접근
45
46
<<activity>>
: MyActivity
: ContentResolver
<<provider>>
: ContentProvider
: ContentResolver
<<provider>>
: ContentProvider
queryinsertdeleteupdatebulkInsertopenOutputStream
queryinsertdeleteupdategetType
queryinsertdeleteupdategetType
URI
질의 결과는 데이터베이스에서처럼 결과 집합에 대핚 커서로 리턴
ContentResolver 객체에 대핚 query 메쏘드로 다음을 젂달
◦ 질의하고자 하는 content provider 데이터의 URI
◦ 결과 집합에 포함시키고자 하는 열들을 나타내는 프로젝션
◦ 리턴될 행들을 정의하는 where 젃
◦ where 젃에 있는 ?를 대체핛 선택 읶자 문자열 배열
◦ 리턴되는 행들의 순서를 기술하는 문자열
예제
// 모든 행을 리턴핚다.Cursor allRows = getContentResolver().query(MyProvider.CONTENT_URI,
null, null, null, null);
// 3열의 값이 설정된 값과 같은 행의 모든 열을 리턴하고// 행들을 5열 기준으로 정렧핚다.String where = KEY_COL3 + "=" + requiredValue;String order = KEY_COL5;Cursor someRows = getContentResolver().query(MyProvider.CONTENT_URI,
null, where, null, order);
47
// 삽입핛 새로운 행 하나를 생성핚다.ContentValues newValues = new ContentValues();
// 각 열에 값을 핛당핚다.newValues.put(COLUMN_NAME, newValue);[ ... 각 열마다 반복핚다 ... ]
Uri myRowUri = getContentResolver().insert(MyProvider.CONTENT_URI, newValues);
48
// 특정 행을 삭제핚다.getContentResolver().delete(myRowUri, null, null);
// 처음 다섯 행을 삭제핚다.String where = "_id < 5";getContentResolver().delete(MyProvider.CONTENT_URI, where, null);
49
// 삽입핛 새로운 행 하나를 생성핚다.ContentValues newValues = new ContentValues();
// 업데이트하고자 하는 열과, 이들 각각에 핛당핛 값을 지정하는// 교체 맵을 만든다.newValues.put(COLUMN_NAME, newValue);
// 처음 다섯 행에 적용핚다.String where = "_id < 5";
getContentResolver().update(MyProvider.CONTENT_URI, newValues, where, null);
50
Android architecture
Android components
◦ Activity
◦ Service
◦ Broadcast receiver
◦ Content Provider
Intent
51