스터디에서 발표할 자료입니다. 스프링노트에서 작성한 것을 옮기다 보니 보기 좋진않네요. 다음번엔 좀 더 깔끔히...



ch01-Getting to Know Android


1_ Why Android?

and_4.png

 

Android Features

  • Application framework enabling reuse and replacement of components
  • Dalvik virtual machine optimized for mobile devices
  • Integrated browser based on the open source WebKit engine
  • Optimized graphics powered by a custom 2D graphics library; 3D graphics based on the OpenGL ES 1.0 specification (hardware acceleration optional)
  • SQLite for structured data storage
  • Media support for common audio, video, and still image formats (MPEG4, H.264, MP3, AAC, AMR, JPG, PNG, GIF)
  • GSM Telephony (hardware dependent)
  • Bluetooth, EDGE, 3G, and WiFi (hardware dependent)
  • Camera, GPS, compass, and accelerometer (hardware dependent)
  • Rich development environment including a device emulator, tools for debugging, memory and performance profiling, and a plugin for the Eclipse IDE

 업계와 공개된 Android Framework는 Google이라는 Service를 선순환하는 구조로 강력한 Opensource의 힘을 여실히 보여준다.

 

and_2.png      and_1.png

 

Android Architecture


and_3.png

 

2_ The Open Handset Alliance

Google and 33 other companies announced the formation of the Open Handset Alliance on November 5, 2007.

http://www.openhandsetalliance.com/oha_members.html

oha_1.png

 

3_ The Android Execution Environment

Limited resources

배터리 용량, 수백mhz(퀄콤 스냅드래곤 1Ghz) cpu 제한,


Mobile mashups

Intent, IPC를 통한 쉬운 application mashup


Interchangeable applications

Android는 Intent를 통해 특정 app 를 구현하지 않고 app 상호간 교류할 수 있다.

안드로이드는 "내가 이메일을 전송하려는데 어떤 이메일 app이 가능한가?" 요청에 OS에 등록된 Intent를 호출한다.


예) Win mobile app에서 email 전송시 pocket outlook 의 interface를 구현해 주어야 한다.

final Intent emailIntent = new Intent(android.content.Intent.ACTION_SEND);

emailIntent .setType("plain/text");
emailIntent .putExtra(android.content.Intent.EXTRA_EMAIL, new String[]{"webmaster@website.com"});
emailIntent .putExtra(android.content.Intent.EXTRA_SUBJECT, mySubject);
emailIntent .putExtra(android.content.Intent.EXTRA_TEXT, myBodyText);
context.startActivity(Intent.createChooser(intent, "Send mail...));

 

 

4_ Components of an Android Application

 안드로이드 app을 구성하는 components 들.

Activities

사용자 혹은 OS가 실행하는 코드, 현재 화면이 activity로 다른 화면 전환시 다른 activity, activity는 사용자, 다른 activity, service와 상호작용할 수 있다. 액티비티가 실행을 멈춘 상태에서 OS가 메모리 절약을 위해 종료를 할 수 있다.

 

Services

OS의 서비스, 데몬 역할을 수행하며, 모바일 기기가 셧다운 되기 전까지 백그라운드에서 실행된다

예) MP3 로 노래를 듣는 동안 사용자는 다른 애플리케이션을 실행 할 수 있다.

 

Broadcast and Intent Receivers

다른 애플리케이션의 요청에 응답하는 역할을 수행.


Broadcast Receiver

시스템 전역에 발생하는 이벤트로 안드로이드 자신(battery low), 다른 Activity 혹은 service는 Intent Receiver를 실행해 접근을 허용한다.


Intent Receiver

다른 액티비티로 부터의 데이터, 서비스 요청에 대한 실행 코드

 

Content Providers

다른 액티비티, 서비스와 데이터를 공유하기 위해 작성된다. 표준 UI form이나 URI를 통해 요청된다.

예) 주소록 데이터를 요청: content://contacts/people

즉, content provider api를 이용해 content에 CRUD 메소드 사용이 가능하다.

모든 애플리케이션이 안드로이드 콤포넌트를 작성하고 개발하기 보다는 URI와 Intents를 유연하게 조합하는 것이 바람직하다.


Notification

사용자에 신호를 보내기 위한 일관되면서 간섭적이지 않은 메커니즘 제공 LED, Vibration, sound

 

Resource Manager

문자열, 그래픽스 와 같은 외부화externalize 되는 비 코드 리소스를 지원

 

 

 

5_ Android Activity Lifecycle

안 드로이드는 모바일 애플리케이션을 위한 환경이다. 제한된 환경(battery,...)에서 app에서 오버라이드한 Activity클래스의 메소드로서 아래와 같은 각각의 이벤트를 제공하게 된다. 한 Activity에서 다른 Activity를 실행하기 위해서는 startActivity() method에 Intent 인자를 사용하여 호출한다

 

  • onCreate()
    Activity가 처음으로 생성될 때. view 초기화, 영속 데이터 연결 등 초기화 관련 처리가 위치함. 이전 activity 상태를 보존하고 있는 Bundle이 전달됨.
  • onStart()
    화면에 보이기 전에 호출, 완료되면 화면 전면에 액티비티가 나타나며 onResume()으로 전환된다. 만약 Activity가 실행에 적절치 않으면 onStop()으로 전이된다.
  • onResume()
    activity가 foreground로 전환되는onStart() 혹은 onPause() 뒤에 호출되고 이 상태에서 사용자의 입력에 상호작용하게 된다.
  • onPause()
    activity가 foreground 상태에서 다른 activity의 실행으로 화면에서, 그리고 멈춤 상태로 변경한다. 즉, 이 activity가 battery 소모, cpu 사용등의 작동이 필요없게 된다. 또한 시스템의 사정에 의해(메모리 부족 등) 언제든 메모리에서 내려질 수 있는 상태다.
  • onStop()
    더 이상 activity가 foreground 상태에 있지 않는다; 다른 activity가 실행중, destory 될 상황이거나.
  • onDestroy()
    activity 가 동작을 마치고 framework가 finish()메서드를 호출한 경우의 상태로 시스템이 activity를 해제하기 위해 호출하기도 한다.



Activity Lifecycle example

Ex. Activity Lifecycle Tester

 



6_ Android Service Lifecycle

http://developer.android.com/reference/android/app/Service.html

 

Service도 Activity와 거의 유사하지만, 몇몇 점에서 다르다.

 

  • onCreate() 와 onStart() 다른 점 : 서비스는 클라이언트가 Context.startService(Intent) 호출시 시작하며, 이미 서비스가 존재하지 않으면 안드로이드는 onCreate() 메소드를 호출하고 onStart()가 뒤 따른다. 만약 서비스가 실행중이라면 onStart()메소드가 호출된다.
  • onResume(), onPause 와 onStop()
    service는 UI가 없기 때문에, onResume(), onPause(), onStop()이 필요치 않다.
  • onBind()
    클라이언트가 서비스와 영속적 연결을 유지하고자 한다면 Context.bindService를 호출하는데 서비스가 존재하지 않으면 onCreate()를, 서비스가 있으면 onStart()를 호출한다.
  • onDestroy()

    서비스 종료시 호출. 서비스를 시작/바인드하는 클라이언트가 없다면 종료. 시스템이 판단으로 low memory에서 서비스를 재시작하는데 서비스에 영속 객체가 필요하다면 onStart()에 구현하는게 좋다.

 

Service Lifecycle example

Ex. Service : http://android15.tistory.com/107

Android Service creation and consumption





ch02-Setting Up Environment


Supported Operating Systems

  • Windows XP (32-bit) or Vista (32- or 64-bit)
  • Mac OS X 10.4.8 or later (x86 only)
  • Linux (tested on Linux Ubuntu Dapper Drake)

 

공통

Windows

  1. {ANDROID_SDK}\tools\android update

Ubuntu / Linux

  1. {ANDROID_SDK}/tools/android update


* 설치시 https://... 접속 에러가 발생하면 Settins에서 Force https 를 선택하고 다시 해본다.

 

 

Eclipse 설치

  • Subversion

 Eclipse 새로 설치후 Android 개발시 처음 만날수 있는 에러

Conversion to Dalvik format failed with error 1

---> Java runtime을 JDK로 대체.

 
 Android Eclipse 개발환경 한글 문제

Eclipse에 UTF-8문자열 사용을 위해 property editor 를 사용중인 상황.

 

Android phone에서 Debugging 켜기

1_ Menu -> Settings -> Application / Developement

  • USB debugging
  • Stay Awake
    USB 가 연결된 동안 휴대폰 스크린이 꺼지지 않는다.

 

2_ ADB용 USB 드라이버 설치

  • 윈도우/비스타
    안드로이드 폰을 PC와 연결해 새로운 장치 발견시 Android SDK/usb_driver/android_usb_windows 를 지정해 설치.
  • Mac OS
    모든 장치가 설치되 있다.
  • 우분투 Dapper Drake: /etc/udev/rules.d/50-android.rules 에 추가
    SUBSYSTEM=="usb_device", SYSFS{idVendor}=="0bb4", MODE="0666"
  • 우분투 Gutsy Gibbon, Hardy
    SUBSYSTEM=="usb", SYSFS{idVendor}=="0bb4", MODE="0666"
  • 우분투에서 실행 권한 설정: chmod a+rx /etc/udev/rules.d/50-android.rules

 

3_ 연결해 디버깅 실행

휴대폰을 연결하고 이클립스를 연결하면 새로운 장치는 스스로 인식하고 명령창에서 adb 명령을 준다

  1. >adb devices
  2. List of devices attached
  3. ...
  4.  

 

Eclipse에 LogCat view 추가

Eclipse의 Java perspective에서 LogCat view를 추가해 debugging 정보를 볼 수 있다.

 

 

Eclipse에서 new android project 보기

 http://developer.android.com/guide/topics/resources/index.html

andproject_0.png

Android Library : Google APIs
    안드로이드 라이브러리 - Application Framework 부분.
assets
    애플리케이션에서 데이터를 직접 사용시 이용. IO Stream data.
Resources (under res)
    • Drawable : images, bitmaps
    • Layout : XML files로 뷰를 배치하는 위치를 지정.
    • Values : constants, strings, etc.
Manifest (AndroidManifest.xml)
    안드로이드 앱의 빌드 패키지 설정 xml file

 

Ex. Activity Lifecycle Tester

 

AndroidManifext.xml

Android app의 빌드에 필요한 컴포넌트, 허용권한 등을 메타데이터로 구성.

  • application
    하나의 어플리케이션 노드로 선언, app의 타이틀, 아이콘 등 지정. app의 activities, services, permission 등을 담는 컨테이너.

  • activity
    app에 사용할 모든 activity를 정의. 액티비티 실행시 runtime exception이 던져진다.

  • service : 사용되는 각 서비스 클래스에 대해 새로운 service태그를 하나씩 생성한다.

  • provide : 각각의 콘텐츠 공급자에 대해 사용된다. 데이터베이스 접근과 공유를 관리한다.

  • receiver : 어플리케이션을 띄우지 않고도 브로드캐스트 수신자를 등록 가능. 인텐트가 방송될 시 전역 이벤트 리스너로서 처리할 수 있다.

  • uses-permission : 다른 어플리케이션의 사용을 위한 권한을 설정. 설치 과정 중 사용자에게 제시되여 결정. 비용이 수반되는 어플 같은 경우에 접근을 제한하기 위해 사용.

  • permission : 어플리케이션에 대한 접근을 제한하기 위해 사용. normal, dangerous 등으로 허용 및 제한.

  • instrumentation : 액티비티와 서비스를 테스트 하기 위한 프레임워크를 제공. 리소스와의 상호작용을 모니터.

res

res/main.xml

assets

src




Chapter 3 - Using the Android Development Environment for Real Applications


MicroJobs: This Book’s Main Sample Application

Android and Social Networking

Android Phone은 Internet 에서 정보 보기, Youtube, facebook 등과 같은 공통의 관심사를 갖는 사용자들과의 연결성과 Mobility를 가지고 있다. 시간/장소에 구애없이 새로운 형식의 SNS 앱이 탄생 가능하다.

MJAndroid는 phone이 있는 근처 도시의 temporary job을 찾아주는 목적이다.

  • 디비에 등록된 임시직에 대한 요약, 비용이 있다.
  • 근처 임시직을 찾아서, 해당 일에 대해 친구와 통화하고, 고용자에게 즉시 전화를 걸 수 있다.


MJAndroid 예제 프로젝트의 주요 기능

Mapping

Android 는 MapActivity 등을 통해서 dynamic, interactive maps을 제공하고 있다. GPS를 통해 내 주변에 위치한 임시직 정보를 찾아 Map에 표시하고 이동시 GPS 위치에 따른 스크롤이 일어난다. two directions, zoom in and out, and even switch to satellite views.

 

Finding friends and events

Overlay 를 Map에 띄워서 찾고자 하는 job의 위치와 표시를 터치해서 해당 job에 대한 설명을 볼 수 있다. 또한 친구의 전화번호, 메신저 아이디 등을 얻기 위해 Contact Manager 에 접근할 수 있다. MicorJobs database에서 좀 더 상세한 job의 정보를 얻을 수 있다.

 

Instant messaging

친구에게 Instance message를 SMS 전송을 통해 채팅할 수 있다.

 

Talking with friends or employers

직접 친구와 고용주에게 전화할 수 있다.

 

Browsing the Web

웹에 올려진 상세한 job 정보를 연결해 볼 수 있다.

 

 

Downloading the MJAndroid Code

http://www.oreilly.com/catalog/9780596521479.

 


A Brief Tour of the MJAndroid Code


AndroidManifest

 ...    package="com.microjobsinc.mjandroid" android:versionCode="1" android:versionName="1.0">
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /><!-- location information from GPS -->
<uses-permission android:name="android.permission.CALL_PHONE" /> <!-- Dialer로 전화 걸기 -->
<uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION" /> <!-- Test할 수 있는 GPS좌표 가능, ddms -->
<uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" /> <!-- 어떤 추가 기능인지 명시되어있지 않다 -->
<uses-permission android:name="android.permission.INTERNET" />
          


Application 선언과 Activity, Intent filter 선언

 

 <application android:icon="@drawable/icon2" android:debuggable="true">
        <uses-library android:name="com.google.android.maps" /> <!-- Google maps library, 외부 라이브러리 추가 -->
        <activity android:name=".MicroJobs" android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" /> <!-- Action이 main entry point -->
                <category android:name="android.intent.category.LAUNCHER" /><!-- 가장 상위 레벨 launcher에 보여짐 -->
            </intent-filter>
        </activity>
        <activity android:name="MicroJobsList" android:label="@string/list_name">
            <intent-filter>
                <action android:name="android.intent.action.VIEW" /><!-- Action이 view, edit, pick 행위를 가짐 -->
                <action android:name="android.intent.action.EDIT" />
                <action android:name="android.intent.action.PICK" /><!-- intent로 넘겨진 activity class -->
                <category android:name="android.intent.category.DEFAULT" /> <!-- 가장 상위 레벨 launcher에 보여짐 -->
                <data android:name="vnd.android.cursor.dir/vnd.microjobs.jobs" /> <!-- database -->
           </intent-filter>

                      <intent-filter>
                          <action android:name="android.intent.action.GET_CONTENT" />
                          <category android:name="android.intent.category.DEFAULT" />
                          <data android:name="vnd.android.cursor.item/vnd.microjobs.jobs" />
                      </intent-filter>
                  </activity>
                  <activity android:name="MicroJobsDetail" android:label="@string/jobs_detail_name">
                  ...
                  </activity>
                  <activity android:name="MicroJobsEmpDetail" android:label="@string/emp_detail_name">
                  ...
                  </activity>
                  <activity android:name="AddJob" android:label="@string/add_job_name">
                  ...
                  </activity>
                  <activity android:name="EditJob" android:label="@string/edit_job_name">
        ...
                  </activity>
              </application>

 

com.microjobsinc.mjandroid

MicroJobs.java

Application이 시작하고 화면에 보여 주는 첫번째 Activity class. UI의 입력을 받아 들여 MicroJob의 다른  Activity, Service를 호출한다

 

MicroJobsDatabase.java

MJAndroid database 접근하기 위한 SQLiteOpenHelper class로 SQLite 를 이용해 저장 기능을 수행한다

 

AddJob.java and EditJob.java

사용자가 job 정보를 database에 추가, 수정할 수 있는 화면

 

MicroJobsDetail.java

선택한 job의 상세 내용을 표시하는 activity

 

MicroJobsEmpDetail.java

고용주의 이름, 주소, 명망, 이메일, 전화번호 등의 정보를 표시하는 Activity

 

MicroJobsList.java

등록된 임시직에 대한 목록

 

Google Map API key


Running the MJAndroid Code

Eclipse

project context menu -> Run As -> Android Applicatoin

Run -> Run as -> Android Application

 

Export Unsigned apk

Eclipse에서 프로젝트 선택후 컨텍스트 메뉴(오른쪽 마우스 클릭)에서 Android Tools -> Export Unsigned Application Package..

 

Ubuntu / Linux 에서 sdk 사용시

 adb는 root permission이 필요하다. 만약 root권한이 아니면, avd에 write 권한을 요하는 install 등의 명령시 permission error 발생한다.

cd android-sdk-linux-linux/tools
sudo ./adb kill-server
sudo ./adb start-server


새로운 AVD(Android VirtualVirtual Device) 작성

  1. $ android create avd -n <name> -t 2

  • -n : 이미지의 이름이고, 
  • -t : SDK 릴리즈 번호. 1.5 2, 1.6 3, 2.0, 4 ...


 

AVD 목록

$ android list avd

 

 

AVD 가상 디바이스를 실행

  1. emulator -adv AVD_이름

or

  1. emulator @AVD이름

 

MJAndroid 설치

  1. adb install MJAndroid-1.0.0.apk
profile
Go for it. Go for 10-thousand.