'Android'에 해당되는 글 20건

  1. 2010.01.14 Android Initialization Process 1
  2. 2010.01.13 안드로이드란-무엇인가
  3. 2010.01.12 안드로이드 AVD 작성법
  4. 2010.01.11 Android 2.0.1 SDK Update Error 해결책 1
  5. 2010.01.11 안드로이드 강좌 6 - Java 코드(Code)에서 뷰(View) 다루기
  6. 2010.01.11 안드로이드 강좌 5 - XML에서의 TextView, ImageView, LinearLayout
  7. 2010.01.11 안드로이드 강좌 4 - 액티비티(Activity), 뷰(View), 레이아웃(Layout)
  8. 2010.01.11 안드로이드 강좌 3 - 프로젝트 실행과 디버깅 그리고 단말 세팅
  9. 2010.01.11 안드로이드 강좌 2 - 이클립스 개발환경 사용법 및 프로젝트 생성
  10. 2010.01.11 안드로이드 강좌 1 - 어플리케이션 개발 시작하기. SDK 설치 및 실행
2010. 1. 14. 17:34

Android Initialization Process





init is the first process after kernel started. The corresponding source code lies in: device/system/init. It does the following tasks step by step:

1.       Initialize log system.

2.       Parse /init.rc and /init.%hardware%.rc.

3.       Execute early-init action in the two files parsed in step 2.

4.       Device specific initialize. For example, make all device node in /dev and download firmwares.

5.       Initialize property system. Actually the property system is working as a share memory. Logically it looks like a registry under Windows system.

6.       Execute init action in the two files parsed in step 2.

7.       Start property service.

8.       Execute early-boot and boot actions in the two files parsed in step 2.

9.       Execute property action in the two files parsed in step 2.

10.   Enter into an indefinite loop to wait for device/property set/child process exit events. For example, if an SD card is plugined, init will receive a device add event, so it can make node for the device. Most of the important process is forked in init, so if any of them crashed, init will receive a SIGCHLD then translate it into a child process exit event, so in the loop init can handle the process exit event and execute the commands defined in *.rc(it will run command onrestart).

The .rc file is a script file defined by Android. The default is device/system/rootdir/init.rc. We can take a loot at the file format(device/system/init/readme.txt is a good overall introduction of the script). Basically the script file contains actions and services.

Actions

-------

Actions are named sequences of commands. Actions have a trigger which is used to determine when the action should occur.  When an event occurs which matches an action's trigger, that action is added to the tail of a to-be-executed queue (unless it is already on the queue).

Each action in the queue is dequeued in sequence and each command in that action is executed in sequence.  Init handles other activities (device creation/destruction, property setting, process restarting) "between" the execution of the commands in activities.

Actions take the form of:

on <trigger>

   <command>

   <command>

   <command>

...

Services

--------

Services are programs which init launches and (optionally) restarts when they exit.  Services take the form of:

service <name> <pathname> [ <argument> ]*

   <option>

   <option>

   ...

Options

-------

Options are modifiers to services.  They affect how and when init runs the service.

Triggers

--------

Triggers are strings which can be used to match certain kinds of events and used to cause an action to occur.

The builtin supported commands are defined in device/system/init/keywords.h. Commands are implementd in device/system/init/bultins.c.

The init program only executes five kinds of triggers: “early-init”, “init”, “early-boot”, “boot”, “property:*”. Take a look at the following line in default init.rc.

class_start default

This line is a command for the action corresponding to “boot” trigger. It will start all services whose class name equals to “default”. By default, if no class option is defined for a service, the service’s class name is “default”. So this line will start all the services in the order of position in the file by default. (BTW, you can start any service using start commands, if you like.) Any service is run as a forked process of init, take a look at the source code of service_start in device/system/init.c.

So according to the default init.rc, the following services will be executed step by step:

console: star a shell. The source is in device/system/bin/ash.

adbd: start adb daemon. The source is in device/tools/adbd. By default is disabled.

servicemanager: start binder system. The source is in device/commands/binder.

mountd: mount all fs defined in /system/etc/mountd.conf if started, receive commands through local socket to mount any fs. The source is in device/system/bin/mountd.

debuggerd: start debug system. The source is in device/system/bin/debuggerd.

rild: start radio interface layer daemon. The source is in device/commands/rind.

zygote: start Android Java Runtime and start system server. It’s the most important service. The source is in device/servers/app.

media: start AudioFlinger, MediaPlayerService and CameraService. The source is in device/commands/mediaserver.

bootsound: play the default boot sound /system/media/audio/ui/boot.mp3. The source is in device/commands/playmp3.

dbus: start dbus daemon, it’s only used by BlueZ. The source is in device/system/Bluetooth/dbus-daemon.

hcid: redirect hcid’s stdout and stderr to the Android logging system. The source is in device/system/bin/logwrapper. By default is disabled.

hfag: start Bluetooth handsfree audio gateway, it’s only used by BlueZ. The source is in device/system/Bluetooth/bluez-utils. By default is disabled.

hsag: start Bluetooth headset audio gateway, it’s only used by BlueZ. The source is in device/system/Bluetooth/bluez-utils. By default is disabled.

installd: start install package daemon. The source is in device/servers/installd.

flash_recovery: load /system/recovery.img. The source is in device/commands/recovery/mtdutils.

Zygote service does the following tasks step by step:

1.       Create JAVA VM.

2.       Register android native function for JAVA VM.

3.       Call the main function in the JAVA class named com.android.internal.os.ZygoteInit whose source is device/java/android/com/android/internal/os/ZygoteInit.java.

a)         Load ZygoteInit class

b)        Register zygote socket

c)        Load preload classes(the default file is device/java/android/preloaded-classes)

d)        Load preload resources

e)         Call Zygote::forkSystemServer (implemented in device/dalvik/vm/InternalNative.c) to fork a new process. In the new process, call the main function in the JAVA class named com.android.server.SystemServer, whose source is in device/java/services/com/android/server.

                         i.              Load libandroid_servers.so

                       ii.              Call JNI native init1 function implemented in device/libs/android_servers/com_android_server_SystemServers. It only calls system_init implemented in device/servers/system/library/system_init.cpp.

l         If running on simulator, instantiate AudioFlinger, MediaPlayerService and CameraService here.

l         Call init2 function in JAVA class named com.android.server.SystemServer, whose source is in device/java/services/com/android/server. This function is very critical for Android because it start all of Android JAVA services.

l         If not running on simulator, call IPCThreadState::self()->joinThreadPool() to enter into service dispatcher.

SystemServer::init2 will start a new thread to start all JAVA services as follows:

Core Services:

1.       Starting Power Manager

2.       Creating Activity Manager

3.       Starting Telephony Registry

4.       Starting Package Manager

5.       Set Activity Manager Service as System Process

6.       Starting Context Manager

7.       Starting System Context Providers

8.       Starting Battery Service

9.       Starting Alarm Manager

10.   Starting Sensor Service

11.   Starting Window Manager

12.   Starting Bluetooth Service

13.   Starting Mount Service

Other services

1.       Starting Status Bar Service

2.       Starting Hardware Service

3.       Starting NetStat Service

4.       Starting Connectivity Service

5.       Starting Notification Manager

6.       Starting DeviceStorageMonitor Service

7.       Starting Location Manager

8.       Starting Search Service

9.       Starting Clipboard Service

10.   Starting Checkin Service

11.   Starting Wallpaper Service

12.   Starting Audio Service

13.   Starting HeadsetObserver

14.   Starting AdbSettingsObserver

Finally SystemServer::init2 will call ActivityManagerService.systemReady to launch the first activity by senting Intent.CATEGORY_HOME intent.

There is another way to start system server, which is through a program named system_server whose source is device/servers/system/system_main.cpp. It also calls system_init to start system services. So there is a question: why does Android have two methods to start system services? My guess is that directly start system_server may have synchronous problem with zygote because system_server will call JNI to start SystemServer::init2, while at that time zygote may not start JAVA VM yet. So Android uses another method. After zynote is initialized, fork a new process to start system services.

2010. 1. 13. 13:57

안드로이드란-무엇인가




※ 이 내용은 안드로이드 개발자 페이지(http://developer.android.com/guide/basics/what-is-android.html)의 내용을 번역한 것임을 알려드립니다.

What is Android?

안드로이드는 OS, 미들웨어 그리고 몇 가지 중요한 어플리케이션이 포함된 모바일 디바이스를 위한 소프트웨어 스택이다. 안드로이드 SDK는 Java 언어를 사용하여 안드로이드 플랫폼에서 어플리케이션을 개발하기 위해 필요한 툴들과 API들을 제공한다.




Features


● 컴포넌트 의 재사용과 재배치가 가능한 어플리케이션 프레임워크

● 모바일 디바이스에 최적화 된 Dalvik virtual machine
● 오픈 소스인 WebKit 엔진 기반의 통합 브라우저
● 커스텀 2D 그래픽 라이브러리가 제공하는 최적화된 그래픽; OpenGL ES 1.0 스펙 기반의 3D 그래픽(하으웨어 가속 옵션)
● 구조화된 데이터 스토리지를 위한 SQLite
● 공통 오디오, 비디오와 스틸 이미지 포맷(MPEG4, H.264, MP3, AAC, AMR, JPG, PNG, GIF)을 위한 미디어 지원
● GSM Telephony(하드웨어 종속)
● Bluetooth, GPS, 3G 그리고 Wi-Fi(하드웨어 종속)
● 디바이스 에뮬레이터, 디버깅 출, 메모리 및 퍼포먼스 프로파일링 그리고 이클립스 IDE를 위한 플러그 인을 포함하는 풍부한 개발 환경




 

Android Architecture
아래의 다이어그램은 안드로이드 OS의 주요 컴포넌트들을 보여주고 있다. 각각의 섹션에는 포함된 내용이 좀 더 자세하게 나타나 있다.

 






Applications
안드로이드는 E-mail 클라이언드, SMS 프로그램, 달력, 지도, 브라우저, 주소록 등등의 핵심 어플리케이션이 운영될 것이다. 모든 어플리케이션은 Java로 작성된다.





Application Framework
개발자들은 핵심 어플리케이션에 사용된 것과 같은 프레임워크 API에 제한 없는 접근이 가능하다. 어플리케이션 아키텍처는 컴포넌트의 재사용을 단순화 시키도록 설계되어있다; 어떤 어플리케이션이든 그 내용을 표시할 수 있으며, 다른 어떤 어플리케이션에서는 그것의 내용을 사용할 수도 있게 한다(프레임워크에 의한 강제적인 security constraints와 관계됨). 이와 같은 메커니즘은 사용자에 의한 컴포넌트 재배치를 할 수 있도록 하락해준다.
기본적으로 모든 어플리케이션들은 아래 포함된 서비스와 시스템의 집합이다.

● 리스트, 그리드, 텍스트 박스 그리고 심지어 임베디드할 수 있는 웹 브라우저가 포함된 어플리케이션을 빌드하기 위해 사용할 수 있는 Views의 풍부하고 유연한 집합
● 다른 어플리케이션으로부터 데이터에 접근할 수 있는 혹은 그들 자신의 데이터를 공유하기 위한 어플리케이션들이 가능한 Content Providers
● 지역화된 스트링, 그래픽 그리고 레이아웃 파일들과 같은 non-code 자원에 엑세스 할 수 있게 해주는 Resource Manager
● 모든 어플리케이션에서 상태바에 커스텀 경고 메시지를 보여줄 수 있게 해주는 Notification Manager
● 어플리케이션의 라이프 사이클이나 공용 네이게이션 백스택을 제공하는 Activity Manager

더 자세한 정보나 어플리케이션의 작동 설명을 원한다면, Notepad Tutorial을 참고하라.





Libraries
안드로이드는 안드로이드 시스템의 다양한 컴포넌트를 사용하는 C/C++ 라이브러리 집합을 포함한다. 이러한 내용은 안드로이드 어플리케이션 프레임워크를 통해 개발자들에게 알려진다. 핵심 라이브러리들 중 일부는 아래와 같다.

● System C Library – 임베디드 리눅스 기반의 디바이스에 튜닝된 표준 C 시스템 라이브러리(libc)의 BSD에의 구현
● Media Library – PacketVideo’s OpenCORE 기반; MPEG4, H.264, MP3, AAC, AMR, JPG 그리고 PNG와 같은 많은 인기 있는 오디오 및 비디오 포맷 그리고 정지 화상 이미지 파일들의 플레이 및 레코딩을 지원하는 라이브러리.
● Surface Manager – 디스플레이 서브시스템의 접근 관리 및 다중 어플리케이션으로부터의 2D 및 3D 그래픽을 매끄럽게 합성함.
● LibWebCore – 안드로이드 브라우저와 임베디드 가능한 웹 뷰를 동시에 지원하는 최신 웹 브라우저 엔진
● SGL – 기본적인 2D 그래픽 엔진
● 3D Libraries – OpenGL ES 1.0 APIs기반의 구현; 하드웨어 3D 가속을 포함하거나 포함할 수 있도록 하는 라이브러리, 최적화된 3D 소프트웨어 래스터라이저.
● FreeType – 비트맵 및 벡터 폰트 렌더링
● SQLite – 모든 어플리케이션에 적용 가능한 파워풀하고 가벼운 관계형 데이터베이스 엔진





Android Runtime
안드로이드는 Java 언어의 핵심 라이브러리의 거의 모든 기능을 제공할 수 있는 핵심 라이브러리 핵심 라이브러리 집합이다.
모든 안드로이드 어플리케이션은 Dalvik 가상 머신의 어플리케이션 인스턴스와 함께 자신의 프로세스로 동작한다. Dalvik은 디바이스가 효율적으로 다중 VM을 구동할 수 있도록 하기 위해 사용된다. Dalvik VM은 최소한의 메모리 풋프린트를 위해 최적화된 Dalvik 실행파일(.dex)안에서 실행된다. 그 VM은 레지스터 기반이며, 포함된 “dx” 툴에 의해 .dex 포맷으로 변환된 Java 컴파일러에 의해 컴파일 된 클래스를 실행한다.
Dalvik VM은 스레딩이나 low-level 메모리 관리와 같은 기본적인 기능을 위한 리눅스 커널에 의지한다.





Linux Kernel
안드로이드는 보안, 메모리 관리, 프로세스 관리 네트워크 스택 그리고 드라이버 모델과 같은 핵심 시스템 서비스를 위해 리눅스 버전 2.6에 기반을 두고 있다. 또한 커널은 하드웨어와 소프트웨어 스택의 나머지 사이의 추상 레이어와 같은 역할을 수행한다.

출처
:http://nerve.tistory.com/entry/안드로이드란-무엇인가-What-is-Android
2010. 1. 12. 10:53

안드로이드 AVD 작성법





자.. 이제 AVD를 생성하자.
안드로이드가 깔린 위치에가서 tools 에 이동하여
android list targets 라고 실행하면 목록이 나오는걸 볼 수 있다.

이제 AVD를 작성하자면

android create avd -n my_android1.5 -t 2  

우선 avd 이름은 my_android1.5 이고 id를 2로 한듯하다. (1.1은 1이고 1.5는 2이고 구글API는 3이다)
그러면 새로운 하드웨으를 작성하겠냐고 하는데 그냥 기본으로 하자  'no'

그러면 파일이 생성된다.

이제 기동해보자.

emulator @my_android1.5

라고 하면.. 드디어 에뮬레이터가 뜨는걸 볼 수 있다 ㅠ_ㅜ/

이제 다시 이클립스를 띄워서 다시 실행하면 (run as android...)
실행되는걸 볼 수 있다. 디버깅 창을 보면 새로만든 my_android1.5 를 쓰는걸(?)볼 수 있다.


만약 삭제할려면?
android delete avd -n my_android1.5


하면된다.





아래는 번역물이다

[Android] Android Virtual Devices (AVDs)
adakoda (2009年4月29日 06:16) | 트럭 백(0) |  
Android Virtual Devices (AVDs)

Android 1.5 SDK 그리고 신규에 추가되었다Android Virtual Devices (AVDs)(이)란,
에뮬레이터 옵션 정보를 보관 유지한 구성(AVD)여,
후술 한다android툴로부터 복수의 구성(AVD)(을)를 관리(작성, 삭제, 갱신)하는 것으로 옵니다.

이것에 의해,Android 1.5 SDK(으)로부터,Android 1.1의에뮬레이터나Android1.5의에뮬레이터를 구사하는 것이 가능할 뿐만 아니라,
복수가 다른 하드웨어 구성도 구분하여 사용할 수 있습니다.

또,Android 1.5 SDK(을)를 인스톨 후,AVD(을)를 한번도 작성하지 않은 상태에서는,
Android프로젝트(프로그램)를 실행할 수 없기 때문에, 이AVD(을)를 작성하는 작업은, 필수의 작업이 됩니다.
※덧붙여서, 이 때에 표시되는 에러는, 이하와 같은 내용(target 'xxx'(은)는, 프로젝트의 타겟으로 따라 표시 내용이 다릅니다)
 Failed to find an AVD compatible with target 'Android 1.1'. Launch aborted.
 Failed to find an AVD compatible with target 'Android 1.5'. Launch aborted.
 Failed to find an AVD compatible with target 'Google APIs'. Launch aborted.

덧붙여서,Android 1.5 Early Look SDK그리고AVD(을)를 작성제는, 동정보가 남아 있으면, (당연합니다만) 상기 에러는 표시되지 않습니다.
※AVD의 정보의 디폴트 패스는, 예를 들면Windows의 경우,%유저%\android\avd아래에 있습니다(android -p옵션으로 변경 가능)



android툴의 인스톨 장소

Android 1.5 SDK인스톨처의tools폴더하에 있는 「android」.
※Windows의 경우, 정확하게는 「android.bat」



작성 가능한 타겟(target)의 열거 방법

AVD(을)를 작성하기 위해서는, 우선, 작성 가능한 타겟의id(을)를 알 필요가 있어, 그러기 위해서는, 이하와 같이 실행합니다.

android list targets
그러자(면), 밑그림과 같이 이용 가능한 타겟( 「id: 1」 「id: 2」 「id: 3」)이 표시되기 때문에,
id에 대응하는 「API level」 등을 참고에, 작성하고 싶은 타겟을 결정해 주세요.





AVD작성 방법

예를 들면, 타겟id하지만2(이 예에서는,Android 1.5)(으)로서 「my_android1.5」라고 하는 이름의avd(을)를 작성하려면 , 이하와 같이 실행합니다.

android create avd -n my_android1.5 -t 2
그러자(면),
「Do you wish to create a custom hardware profile [no]」
(와)과 같이 커스텀 하드웨어를 작성할까 (들)물으므로, 작성하지 않는(디폴트 구성의) 경우,Enter키를 누르면, 작성 완료입니다.

커스텀 하드웨어를 작성하려면 , 동문의로, 「yes」라고 입력해,
계속해 (듣)묻는 정보로 대답해 가면, 임의의 하드웨어 구성의AVD(을)를 작성할 수 있습니다.

커스터마이즈 가능한 하드웨어 정보는, 이하대로입니다.

ram size,Touch-screen support,Keyboar support,DPad support,GSM modem support,Camera support,Maximnum horizontal camera pixels,Maximnum vertical camera pixels,GPS support,Battery support,Accelerometer,Audio recording support,Audio playback support,SD Card support,Cache partition support,Cache partition size



AVD사용 방법

작성했다AVD(은)는,에뮬레이터를 기동할 때의 제1인수에,@(@ 부호)돌출해AVD이름을 지정하면 사용할 수 있습니다.


emulator @my_android1.5



AVD삭제 방법

예를 들면, 「my_android1.5」라고 하는 이름의avd(을)를 삭제하려면 , 이하와 같이 실행합니다.

android delete avd -n my_android1.5
2010. 1. 11. 20:41

Android 2.0.1 SDK Update Error 해결책





Android SDK (http://developer.android.com/sdk/download.html?v=android-sdk_r04-linux_86.tgz), Android 2.0.1 Platform 과

ADT 0.9.5 가 새로 나왔네요. 이전과 같이 사이트에 나와 있는 설명에 따라 설치하면 됩니다.

그런데 Ubuntu 9.10 (?)에만 해당하는지 모르겠지만 여기서도 업데이트를 할 경우에 다음과 같은 사소한 문제가 발생하여 곤란해하는 경우가 있을  것 같습니다. 

 

"Failed to fetch URL https://dl-ssl.google.com/android/repository/repository.xml, reason: HTTPS SSL error. You might want to force download through HTTP in the settings."


그래서 이에 대해 도움이 될까하여 한가지 해결 방안을 알려드립니다. 


$ android 


를 실행하면 [Android SDK and AVD Manager] 창이 나옵니다. 그러면 먼저 [Settings] 에 가서 아래 그림과 같이 (강제로 적용하도록)

 

Android SDK and AVD Manager-1.jpg


[Misc] "force https:// ... sources to be fetched using http://..."


항목을 선택하고 [Save & Apply] 를 클릭하여 설정을 적용합니다.  
그 다음 바로 위의 [Avaliable Packages]를 선택하여 아래 그림과 같이 (원래 설명에 따라)  설치하면 되겠습니다. 

설치 후에는 안전을 위해 설정을 원래대로 돌려두는 것이 좋겠지요.

(가능하면 필요할 때만 [강제] 설정을 하여 사용하기를 권장합니다.)

 

 Android SDK and AVD Manager-2.jpg

 

2010. 1. 11. 20:23

안드로이드 강좌 6 - Java 코드(Code)에서 뷰(View) 다루기




id
어플리케이션 실행 시에 Layout XML에서 정해진데로 View와 Layout들이 생성되고 보여집니다. 생성된 View들에서 코드상에서 동적으로 변경해야 하는 값들이 있다면, 변경해야할 View를 코드 상에서 불러오기 위해 먼저 XMl파일에서 id를 지정해야 합니다.
 
<TextView  
   android:id="@+id/text"
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content"
    />

id 값은 같은 XML파일 안에서 유일하게 사용되어야 자바 코드에서 제대로 View를 가져 올 수가 있습니다.

Code
XML파일을 고쳐서 새로운 id를 추가하면 자동으로 R.java 파일이 자동으로 생성됩니다. 지정한 id가 R.id.text라는 상수로 들어가 있는 것을 확인할 수 있습니다. 이전에 말씀드렸듯이 R.java는 직접 고쳐서는 안됩니다. 만약 상수값이 제대로 들어가 있지 않은 겨우 XML파일을 다시 저장한다던지, 프로젝트를 refresh한다던지 해서 R.java가 자동으로 생성되게 하면 됩니다.
  TextView t = (TextView)findViewById(R.id.text);
  t.setText("Hello");
  t.setBackgroundColor(0xFFFF0000);
  t.setGravity(Gravity.LEFT);

위 코드를 setContentView한수 호출 후에 넣어주도록 합니다. setContentView에서 레이아웃 XML파일을 불러서 실제 View 객체들을 생성합니다. 그 다음 findViewById함수를 통해 생성한 View 객체를 id를 통해서 가져옵니다. 해당 View가 TextView라는 것을 알고 있으니 TextView로 Casting해줍니다. 그 다음 표시할 문자열을 바꾼다던지, 배경색을 바꾼다던지 이전에 XML에서 했던 작업과 같은 것을 자바 코드상에서 설정해줄 수 있습니다.

View.onClickListener
코드에서 View값을 변경해야할 가장 일반적인 경우는 버튼이 클릭되었을때의 처리입니다. 
  Button button = (Button)findViewById(R.id.button);
  button.setOnClickListener(new View.OnClickListener() {
     public void onClick(View v) {
        //Code
     }
  });

먼저 findViewById르 해당 Button의 객체를 코드로 불러옵니다. 그 다음 View.onClickListener이라는 Interface를 구현한 객체를 setOnClickListener를 통해서 리스너로 등록을 합니다. 그러면 실제 사용자가 버튼을 클릭했을때 해당 코드가 호출되어 실행됩니다. 클릭을 했을 때 뿐 아니라 다양한 사용자의 입력에 따라 Listener가 정의되어있고 Listener를 등록해서 각각의 경우에 대한 처리를 할 수 있도록 되어있으니 JavaDoc문서를 참고하시기 바랍니다.

예제
TextView와 Button을 화면에 표시하고 Button을 클릭했을때 "클릭됨~"이라는 메시지를 TextView에 표시하는 예제입니다.

myactivity.xml

 
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >    
<TextView  
    android:id="@+id/text"
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content"
    android:text=""
    />
<Button  
    android:id="@+id/button"
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content"
    android:text="버튼"
    />
</LinearLayout>

MyActivity.java

 
package kr.mobileplace.lecture;
import android.app.Activity;
import android.os.Bundle;
import android.view.Gravity;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
public class MyActivity extends Activity {
 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.myactivity);
  Button button = (Button)findViewById(R.id.button);
  button.setOnClickListener(new View.OnClickListener() {
   public void onClick(View v) {
    TextView t = (TextView)findViewById(R.id.text);
    t.setText("클릭됨~");
    t.setBackgroundColor(0xFFFF0000);
    t.setGravity(Gravity.LEFT);    }
  });
 }
}

이제 Android 프로젝트를 생성하고 화면을 구성하고 사용자 입력에 대한 코드를 처리하는 것까지의 기본 적인 작업들을 한번씩 해보았습니다. 여기까지 실제로 이클립스로 직접 실행시키며 해보면서 전혀 몰랐던 플랫폼과 개발환경에 맛을 보셨을 겁니다. 이제 하나씩 깊이 들어가보도록 하지요.

Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이선스에 따라 이용하실 수 있습니다.  출처 : http://www.androidpub.com/2353 작성자 : 회색(박성서)

2010. 1. 11. 20:22

안드로이드 강좌 5 - XML에서의 TextView, ImageView, LinearLayout





먼저 각각의 View가 어떤 XML 속성값을 가질 수 있는지는 Android SDK 문서 (sdk디렉토리의 docs 위치)에서 각각의 View 클래스안에 XML Attributes라는 부분에 문서로 정리되어 있습니다. 자세한 것은 직접 문서를 참조하시고 저는 많이 사용되는 일부 값들에 대해서 정리를 해보겠습니다.

TextView
문자열을 표시해주는 역할을 하는 View 입니다.

android:text               :  문자열을 입력
android:textColor     :  문자열의 색을 지정
android:textSize       :  폰트 크기의 설정
android:textStyle      :  bold, italic등의 스타일 설정
android:gravity         :  View안에서 문자열이 어떻게 정렬될 것인지를 지정 
                                      top, bottom, left, right, center, center_vertical, center_horizontal등이 | 연산자와 함께 쓰일 수 있다.
android:singleLine :  문자열을 여러 줄로 나누지 않고 한 줄로 표시

01.<TextView  
02.    android:layout_width="fill_parent" 
03.    android:layout_height="fill_parent" 
04.    android:text = "안녕하세요 안드로이드 공부하시는 여러분"
05.    android:textColor = "#FF0000FF"
06.    android:textSize = "30sp"
07.    android:textStyle = "italic"
08.    android:gravity = "right|center_vertical"
09.    android:singleLine = "true"    
10.    />


예제 XML을 실행시킨 결과
5-1.JPG5-2.JPG
(그림 5-1)                                                                                          (그림 5-2) singleLine="true"

(그림 5-1)은 singleLine을 설정하지 않았을 때, (그림 5-2)는 singleLine을 설정했을 때의 화면입니다.

ImageView
이미지를 표시해주는 역할을 하는 View 입니다.

android:src                :  Image 설정. 프로젝트 디렉토리의 res/drawable에 있는 이미지를 "@drawable/image"로 넣어줌
android:scaleType   :  이미지의 표시를 위한 크기변환(scaling) 및 채워넣기 옵션
                                        fitCenter : 비율을 유지한채 View의 크기에 맞춰서 표시
                                        fitXY         : 비율을 유지 하지 않고 View의 크기에 맞춰서 표시
                                        center     : 원래 이미지의 크기 변환을 하지 않음
                                        그 외 fitStart, fitEnd, centerCrop, centerInside 등은 문서에서 참조하시기 바랍니다.

새로운 이미지를 추가하기 위해서는 프로젝트 디렉토리의 res/drawable에 jpg, png 등의 파일을 복사해넣으면 이클립스에서 인식해서 표시합니다. 만약 이클립스에서 제대로 표시되지 않는 경우 Package화면에서 프로젝트를 선택한 후에 F5(Refresh)를 눌러주시면 됩니다.

1.<ImageView  
2.    android:layout_width="fill_parent" 
3.    android:layout_height="fill_parent"
4.    android:src="@drawable/icon"
5.    android:scaleType="center" 
6.    />


기본으로 들어있는 icon그림인 icon.png파일을 화면에 표시하는 예제입니다. (그림 5-3)은 scaleType을 center로 (그림 5-4)는 scaleType을 fitCenter로 설정해서 실행시켜본 결과입니다.

5-3.JPG5-4.JPG
(그림 5-3)  scaleType="center"                                                    (그림 5-4) scaleType="fitCenter"

LinearLayout
Layout은 다른 자식 View들을 포함하고 배치해주는 역할을 합니다. 그 중 LinearLayout이 가장 많이 쓰이는데요. 자식 뷰들을 순서대로 한방향으로 나열해주는 역할을 합니다.

android:orientation : vertical일 경우 위에서 아래로 View들을 차례로 배치하고, horizontal일 경우 왼쪽에서 오른쪽으로 View들을 차례로 배치합니다.

01.<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
02.    android:orientation="vertical"
03.    android:layout_width="fill_parent"
04.    android:layout_height="fill_parent"
05.    >    
06.<TextView  
07.    android:layout_width="fill_parent" 
08.    android:layout_height="0dp"
09.    android:layout_weight="1"
10.    android:background="#FF880000"
11.    />
12.<TextView  
13.    android:layout_width="fill_parent" 
14.    android:layout_height="0dp"
15.    android:layout_weight="1"
16.    android:background="#FF008800"
17.    />
18.<TextView  
19.    android:layout_width="fill_parent" 
20.    android:layout_height="0dp"
21.    android:layout_weight="1"
22.    android:background="#FF000088"
23.    />
24.</LinearLayout>


예제에서 LinearLayout은 세개의 TextView를 자식으로 가지고 각 TextView는 android:layout_height="0dp"로 설정하고 android:layout_weight라고 하는 것을 사용했는데 이것은 각각의 View의 높이를 상대적으로 결정한다는 뜻입니다. 여기서 각 View가 1:1:1의 비율의 높이를 가지도록 설정됩니다.

(그림 5-5) 는 예제를 그대로 실행한 것이고, (그림 5-6)은 orientation을 horizontal로 바꾸고, android:layout_width="0dp", android:layout_height="fill_parent"로 설정하고 layout_weight를 각각 1, 2, 1으로 설정한 결과입니다.

5-5.JPG5-6.JPG
(그림 5-5)                                                                                          (그림 5-6)

이번 강좌는 여기 까지입니다. 궁금한점이 있으시면 언제든지 댓글이나 Q&A 게시판에 질문을 남겨주세요.


Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이선스에 따라 이용하실 수 있습니다.  출처 : http://www.androidpub.com/2198 작성자 : 회색(박성서)
2010. 1. 11. 20:21

안드로이드 강좌 4 - 액티비티(Activity), 뷰(View), 레이아웃(Layout)





액티비티, 뷰 그리고 레이아웃

액티비티(Activity)

액티비티는 안드로이드 어플리케이션을 구성하는 가장 기본적인 빌딩블록입니다. 보통의 경우 한 화면을 차지하면서 뷰(View)로 구성된 유저 인터페이스를 화면에 표시하고 사용자의 입력을 처리하는 역할을 합니다.보통의 어플리케이션은 여러 다른 화면을 가지고 있고, 각각의 화면은 다른 액티비티로 구현되어있습니다. 그러므로 화면의 전환이 이루어지게되면 새로운 액티비티가 실행되어 처리하게 됩니다. 어떤 경우는 액티비티 간에 데이터를 서로 주고 받을 수도 있습니다. 새로운 화면이 생성되며 기존의 화면은 스택에 놓여집니다. 각각의 액티비티는 스택을 통해 관리되며 현재 액티비티를 종료하면 그 이전 화면의 액티비티로 돌아가게 됩니다.

뷰(View)

뷰는 화면상에서 유저 인터페이스를 구성하는 기본 빌딩블록입니다. 예를 들어 버튼, 그림, 텍스트, 에디트, 라디오 버튼, 체크박스 등의 기본적인 화면 구성 요소들이 뷰에 포함됩니다. 또한 웹, 맵, 비디오등을 표시하는 고급 구성 요소들도 모두 뷰에 포함됩니다. 뷰의 리스너(Listener) 설정을 통해 이벤트가 발생했을 경우를 처리할 수 있습니다. 예를 들어 버튼이 클릭되었을때 등록된 OnClickListener가 호출되어 처리됩니다.

레이아웃(Layout)

각각의 뷰들을 화면상에 배치하고 구성해주는 것을 레이아웃이라고 합니다. 레이아웃은 보통의 경우 XML을 이용하여 구성합니다. 이전 강좌에서도 리소스(res) 아래의 layout에 myactivity.xml파일을 생성해 준 적이 있지요. 

 레이아웃 XML

 
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
<TextView  
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:text="안녕하세요 모바일 플레이스 안드로이드 강좌 수강생 여러분"
    />
</LinearLayout>

(예제 4-1)

lecture4-1.JPG
(그림 4-1)

먼저 기본으로 생성되는 형태의 레이아웃 XML인 (예제 4-1)을 분석해보겠습니다.

XML파일은 <?xml version="1.0" encoding="utf-8"?> 으로 시작합니다. 그리고 첫번째 태그에는 xmlns:android="http://schemas.android.com/apk/res/android" 라는 XML Namespace가 들어가야 합니다.  레이아웃 XML의 각각의 태그 (LinearLayout, TextView)는 하나의 뷰를 나타내며 연결되는 자바 클래스를 가지고 있습니다. 뷰는 크게 두가지 형태가 존재하는데 버튼, 그림과 같이 실제 기능을 가지고 화면에 표시되는 뷰와 다른 뷰를 포함하고 배치하는 역할을 하는 레이아웃이 있습니다. 레이아웃은 하는 역할은 약간 다르지만 View 클래스를 상속하는 일종의 뷰라고 할 수입니다. 레이아웃 XML의 최상위에는 하나의 뷰만 존재할 수 있습니다. 보통 레이아웃이 들어가서 트리 형태로 다른 뷰들을 배치하고 구성하지만 일반 뷰 하나만 들어있는 레이아웃 XML도 작성할 수 있습니다.

흔히 많이 쓰이는 뷰와 레이아웃은 다음과 같습니다.

뷰       : TextView, Button, ImageView, ListView, EditText, ...
레이아웃 : LinearLayout, RelativeLayout, FrameLayout, AbsoluteLayout, ...

(예제 4-1)은 LinearLayout이 하나의 TextView를 자식으로 가지고 있는 형태입니다. 레이아웃 태그 사이에는 자식 뷰들이 여러 개 들어갈 수 있으며 레이아웃이 레이아웃을 자식으로 가지고 있는 형태도 가능합니다.

View Attribute

XML에서 각각의 뷰가 가지는 속성을 Attribute로 지정해할 수 있습니다. 모든 View가 공통적으로 가지고 있는 Attribute에 대해서 먼저 설명하도록 하겠습니다.

layout_width, layout_height
뷰의 넓이와 높이를 지정합니다. 값으로 fill_parent, wrap_content 혹은 절대적인 수치를 가질 수 있습니다. fill_parent는 컨테이너 즉 부모가 가지는 길이를 모두 채울때 사용하고, wrap_content는 해당 뷰가 그려질 수 있게 필요한 길이만 차지한다는 것을 나타냅니다. 절대적인 값도 넣을 수 있는데 픽셀의 경우 "100px", "100dp", "100sp" 처럼 수치와 단위를 써서 지정해줍니다. 사용할 수 있는 단위는 px, in, mm, pt, dp, sp등이 있는데 주로 dp, sp, px이 주로 쓰입니다. px는 픽셀을 나타내고, dp는 Density-independent Pixel이라고 화면의 밀도의 변화에 독립적으로 1dp는 160dpi의 화면에서의 1px에 대응됩니다. sp는 Scale-independent Pixel 이라고 하여 사용자의 폰트 선호도에 따라 크기가 달라지며 주로 폰트 사이즈 설정에 사용됩니다.

background
 배경색 혹은 그림을 지정해줍니다. 색은 #RGB, #ARGB, #RRGGBB, #AARRGGBB 의 포맷으로 지정해 줄 수 있는데 저는 통일성있게 #AARRGGBB포맷만을 주로 사용합니다. 제일 앞에 AA는 투명도를 의미하고 나머지 부분은 RGB값을 의미합니다. 투명도인 AA는 00이 완전 투명, FF가 불투명이 됩니다. 예를 들어 android:background="#FFFF0000"로 지정해주면 빨간색으로 배경을 칠하게 됩니다. 배경그림을 지정해줄 수도 있는데 android:background="@drawable/background_image" 와 같은 형태로 사용가능합니다. 배경 그림은 리소스에 들어있는 jpg, png등의 그림을 배경으로 지정할 때 사용합니다.


visibility
뷰가 화면에 보이게 할지 안보이게 할지를 설정합니다. visible, invisible, gone의 값을 가질 수 있습니다. visible 화면에 보임, invisible 화면에 보이지 않으나 공간은 차지함, gone 화면에 보이지도 않고 공간도 차지 하지 않음.

id
코드에서 해당 뷰를 찾아올 수 있도록 id를 지정합니다. id에 사용에 대해서는 자바코드와 연결하는 부분에서 자세하게 다루도록 하겠습니다.

myactivity.xml을 수정해보면서 각 속성값이 어떻게 실제 화면에 영향을 주는지 확인해보도록 하겠습니다.

 
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="#FF888888"
    >
<TextView  
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:text="파랑"
    android:background="#FF0000FF"
    />
</LinearLayout>

(예제 4-2)

lecture4-2.JPG
(그림 4-2)

자 그럼 속성값들을 변경해보도록 하겠습니다. 먼저 배경색을 지정하여 실제 뷰가 차지하는 영역을 살펴보도록 하겠습니다. (예제4-2)에서 LinearLayout은 width, height를 각각 fill_parent로 화면 전체를 채우고 있으며, TextView는 width는 fill_parent로 부모의 길이만큼 모두 차지하지만 height를 wrap_content로 하여 자신이 차지하는 부분만을 높이로 가지는 것을 볼수 있습니다.

 
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
<TextView  
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:text="빨강"
    android:background="#FFFF0000"
    />
<TextView  
    android:layout_width="wrap_content" 
    android:layout_height="50dp" 
    android:text="녹색"    
    android:background="#FF00FF00"
    />
<TextView  
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:text="파랑"    
    android:background="#FF0000FF"
    />
</LinearLayout>

(예제 4-3)

lecture4-3.JPG
(그림 4-3)

자 이번에는 (예제 4-3)에 TextView를 두개 더 추가하여 배경색을 빨강, 녹색, 파랑으로 칠하고 가운데 있는 TextView의 width를 wrap_content로 height를 50dp로 지정해 보았습니다.

lecture4-4.JPG
(그림 4-4)

lecture4-5.JPG
(그림 4-5)


(그림 4-4)와 (그림 4-5)는 각각 두번째 TextView에 android:visibility="invisible", android:visibility="gone"으로 설정하여 화면에 보일때와 안보일 때 그리고 영역을 차지 하지 않을 때의 차이를 살펴보실 수 있습니다.

이번 강좌는 여기서 마치겠습니다.

Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이선스에 따라 이용하실 수 있습니다.  출처 : http://www.androidpub.com/998 작성자 : 회색(박성서)
2010. 1. 11. 20:17

안드로이드 강좌 3 - 프로젝트 실행과 디버깅 그리고 단말 세팅




Activity 실행

메뉴에서 Run/Run Configurations 실행

Android Application에서 오른쪽 마우스 클릭후 New 선택
Name: New_configuration 을 프로젝트에 맞게 변경
Project : Browse후 해당 Project선택
Launch Action : Run시 실행할 Activity를 선택합니다.

lecture3-1.JPG
(그림 3-1)

새로 작성한 Activity를 실행해 보기 위해서 Launch를 선택하고 List에서 새로생성한 MyActivity를 선택합니다.
Apply 후 Run을 실행하면 Emulator가 아직 떠있지 않다면 자동으로 실행합니다. Emulator는 한번 생성해 놓으면 매번 프로그램을 실행할때 마다 다시 시작시킬필요없이 재사용될 수 있습니다.

Run을 하게 되면 자동으로 Emulator에 이전에 인스톨되어있던 프로그램을 언인스톨하고 새로 작성된 프로그램을 인스톨한 후 선택한 Activity로 실행하여 줍니다.

lecture3-2.JPG
(그림 3-2)

에뮬레이터를 처음 실행하였을 때 (그림 3-2)와 같은 화면이 나오는데 MENU라고 써져 있는 부분을 클릭하면 프로그램 화면을 볼 수 있습니다. 정상적으로 실행이 되었다면 에뮬레이터에 myactivity.xml에서 작성해주었던 "안녕하세요 모바일 플레이스 안드로이드 강좌 수강생 여러분" 라는 문구가 나타납니다.

lecture3-3.JPG
(그림 3-3)

다시 프로그램을 실행시킬 때에는 (그림 3-3)에 표시된 아이콘을 누른 후 생성한 Configuration을 선택하면 됩니다.

디버깅

소스 에디터의 왼쪽 부분을 더블 클릭하면 해당 위치에 브레이크 포인트가 설정됩니다. 브레이크 포인트가 설정된 지점에 작은 동그라미가 표시됩니다.

lecture3-4.JPG
(그림 3-4)

그럼 이제 디버깅 모드로 프로그램을 실행시켜보도록 하겠습니다. (그림 3-5)에 표시된 벌레 모양 아이콘이 디버깅을 위한 실행 버튼입니다.

lecture3-5.JPG
(그림 3-5)

다이얼로그 창이 뜨는데 확인을 누르면 이클립스가 디버그 상태로 전환됩니다. 이것을 Debug Perspective로 전환되었다고 합니다. 그리고 아까 잡아주었던 브레이크 포인트에 현재 실행이 멈추어 있는 것을 확인할 수 있습니다.

lecture3-6.JPG
(그림 3-6)

Step Into (F5) : 메서드 속으로 들어가서 실행
Step Over (F6) : 한줄 실행

등 디버깅과 관련된 명령과 아이콘의 모양은 메뉴의 Run에서 확인하실 수 있습니다.

Perspective

소스 변경화면과 디버깅 화면등의 Perspective 전환은 오른쪽 위화면에서 각각 Java와 Debug의 클릭으로 가능합니다. 

lecture3-7.JPG
(그림 3-7)

안드로이드 개발시 또하나의 유용한 Perspective가 있는데 바로 DDMS입니다. 메뉴의 Windows/Open Perspective에서 DDMS를 선택하면 열수 있습니다. (바로 보이지 않는다면 Other를 클릭하면 선택하실 수 있습니다.)

lecture3-8.JPG
(그림 3-8)

DDMS Perspective에서는 현재 에뮬레이터 및 단말의 프로세스, 쓰레드, 힙, 파일등의 다양한 정보를 확인할 수 있습니다. 또한 에뮬레이터에서 SMS, 전화, GPS 등을 시뮬레이션할 수도 있습니다.

로그캣

저번 강좌에서 소스에 Log.d("MyTag", "Print Test Log"); 라는 코드를 넣었습니다. 이것은 개발할때 필요한 로그를 출력해주는 역할을 합니다. 디버깅 혹은 DDMS 화면 밑 부분에 LogCat이라는 영역에서 로그를 확인하실 수 있습니다. Print Test Log라고 찍힌 부분을 확인하실 수 있습니다.

lecture3-9.JPG
(그림 3-9)

그런데 로그가 너무 많이 나와서 복잡합니다. 작성한 어플리케이션에서 나오는 메시지만을 따로 확인하기 위해서 필터를 적용할 수 있습니다. Log.d함수의 첫번째 인자인 Tag부분을 이용해서 가능합니다. 녹색 + 모양을 눌러 Filter를 생성합니다.

lecture3-10.JPG
(그림 3-10)

Log Filter라는 창에서 Filter Name은 적당히 적은 후, 따로 메시지를 확인할 Tag부분을 "MyTag"로 적어서 OK를 합니다.

lecture3-11.JPG
(그림 3-11)

이제 LogCat창안에 새로운 필터 탭이 생겨서 MyTag라는 Tag를 가지는 메시지는 따로 분류해서 보여줍니다.

lecture3-12.JPG
(그림 3-12)

단말 디버깅

안드로이드 실제 단말을 통한 개발은 몇가지 설정만 해준다면 에뮬레이터를 통한 개발과 크게 다르지 않습니다.

단말 상에서 Settings를 실행 Applications/Development로 들어가서 USB debugging과 Stay awake를 체크해줍니다.
그런 후 단말을 USB케이블을 통해서 PC연결해주면 새로운 장치를 찾았다며 드라이버를 설치하라는 화면이 나옵니다.
드라이버는 SDK가 설치된 폴더 밑에 usb_driver라는 폴더에 저장되어있습니다. (1.0 SDK Release2에서 부터 포함되서 나왔습니다.)

정상적으로 드라이버가 설치되었다면 DDMS화면의 왼쪽 윗부분 Devices화면에 Emulator가 아닌 실제 장치가 표시됩니다.

lecture3-13.JPG
(그림 3-13)

실제 단말상에서 개발시 소스 상에서 추가해줘야 하는 부분이 하나 있습니다. AndroidManifest.xml에 application 태그에서 android:debuggable="true"를 추가해주어야 합니다. 만약 설정해주지 않는다면 Wating For Debugger화면에서 더 이상 진행되지 않습니다.

lecture3-14.JPG
(그림 3-14)

debuggable tag는 개발시에 넣어두고 실제 릴리즈시에는 삭제해주는 것이 좋습니다. 이제 모든 설정이 끝났고 실제 단말에서도 에뮬레이터에서 디버깅을 하는 것과 동일하게 개발을 하실 수 있습니다.

이번 강좌에서는 안드로이드 개발과 디버깅을 위한 이클립스의 사용법과 단말 세팅까지 살펴보았습니다. 이제 이클립스에 환경과 기본적인 프로젝트 구성에 익숙해지셨을 테니 다음 강좌 부터는 본격적인 개발에 들어가 보도록 하겠습니다.

Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이선스에 따라 이용하실 수 있습니다.  출처 : http://www.androidpub.com/764 작성자 : 회색(박성서)

2010. 1. 11. 20:14

안드로이드 강좌 2 - 이클립스 개발환경 사용법 및 프로젝트 생성





프로젝트 생성

이클립스 메뉴에서 File / New /Project 선택
Android / Android Project 선택 후 Next
다음과 같은 창이 뜹니다. 
   lecture2-1.JPG
(
그림 2-1)

Project Name :
이클립스에서 프로젝트를 구분해주기 위한 이름
Package Name : 자바 패키지 지정
Activity Name : 기본으로 생성되는 Activity 클래스에 사용될 이름
Application Name : 단말에서 어플리케이션에 사용되는 이름

다음과 같이 입력해보도록 하겠습니다.
MobilePlace Lecture
kr.mobileplace.lecture
Main
MobilePlace

액티비티(Activity)? 안드로이드 어플리케이션의 기본 단위. 보통 사용자가 현재 보고 있는 전체 화면이라고 생각하면 됩니다. 화면의 구성 정보를 가지고 있고 사용자의 입력을 받아서 처리하는 역할을 합니다.

프로젝트 패키지

 기본으로 생성되는 프로젝트 패키지를 펼쳐 보면 다음과 같습니다.

lecture2-2.JPG
(
그림 2-2)

src : 자바 소스가 위치합니다.

        Main.java : 기본으로 지정해주었던 Activity 클래스

        R.java : 리소스 파일에서 생성되는 클래스로 항상 자동으로 생성되며 직접 수정을 해서는 안됩니다.

res : 어플리케이션에서 필요한 그림, 멀티미디어, 레이아웃, 문자열 등 다양한 리소스 관리

        drawable : 어플리케이션 내에서 사용될 그림 파일들

        layout : Activity의 화면 구성 정보를 담고 있는 xml파일들

        values : 문자열, 배열, , 스타일등 다양한 부가 정보들.

Android Library : 안드로이드 SDK 사용을 위해 포함된 라이브러리


AndroidManifest.xml :
어플리케이션과 구성과 관련된 모든 정보를 담고 있는 파일. 어플리케이션 작성에서 가장 중요한 역할을 하는 파일입니다. 어플리케이션과 Activity의 다양한 설정, 사용권한, 연관된 라이브러리 등 다양한 정보를 포함합니다.

액티비티 생성

새로운 Activity를 직접 작성해보면서 이클립스의 기능을 살펴보도록 하겠습니다.

클래스 생성

먼저 왼쪽 프로젝트 패키지 화면에서 src/kr.mobileplace.lecture 라는 패키지 위에서 마우스 오른쪽 버튼을 클릭합니다. New를 선택하고 Class를 선택합니다.


lecture2-3.JPG
(
그림 2-3)

새로운 클래스를 생성하는 다이얼로그가 나타납니다. 먼저 Name부분에 새로 작성할 Activity의 클래스 명을 적습니다. MyActivity라고 적고 그 아래 상속할 Superclass의 이름을 적어줍니다. Activity 클래스를 상속할 것이기 때문에 Activity를 적고 오른쪽에 Browse버튼을 클릭합니다.


lecture2-4.JPG
(
그림 2-4)

그러면 Activity라는 단어를 포함한 모든 클래스가 나열됩니다. Superclass로 사용할 Classandroid.app.Activity를 선택하고 OK를 클릭합니다.


lecture2-5.JPG
(
그림 2-5)

이제 다시 (그림 2-4) New Java Class화면에서 Finish를 클릭하면 프로젝트 소스에 새로운 클래스에 대한 파일이 생성된 것을 확인할 수 있습니다.

레이아웃 XML 생성

이번에는 액티비티의 화면 구성에 사용되는 레이아웃 파일을 만들어 보겠습니다. res/layout 폴더위에서 오른쪽 마우스 버튼을 클릭한 후 New 에서 File을 선택합니다. 파일이름을 myactivity.xml이라고 설정한 후 OK를 누릅니다. res 밑에 들어가는 파일들은 항상 소문자, 숫자, _ 만으로 구성되어야 하니 유의하시기 바랍니다!

lecture2-6.JPG
(
그림 2-6)

아직 xml파일의 내용을 작성하지 않아서 빨간 X표시가 붙어있을 것입니다. myactivity.xml을 더블 클릭한 후 myactivity.xml이 에디터 창에 열립니다. 그런 후 에디터 아래쪽에 있는 Layout | myactivity.xml 탭에서 myactivity.xml을 선택하면 xml을 내용을 에디트 할 수 있는 화면이 열립니다.

lecture2-7.JPG
(
그림 2-7)

일단 레이아웃 파일의 자세한 작성법은 나중에 다루기로 하고 main.xml에 있는 내용을 그대로 복사 넣고 android:text=”” 부분을 사용자 마음대로 수정해 봅니다.


lecture2-8.JPG(
그림 2-8)

AndroidManifest 수정

새로운 Activity를 생성하면 항상 AndroidManifest에다가 관련 정보를 등록해야 합니다. AndroidManifest에 넣어주어야 단말이 해당 Activity의 존재를 알 수 있습니다. 그렇지 않으면 단말에서 정상적으로 Activity를 생성할 수 없습니다.

먼저 AndroidManifest.xml을 더블 클릭한 후, 에디터 창의 아래 탭에서 AndroidManifest.xml을 선택합니다. 일단 기존에 생성되어있는 activity 태그 부분을 그대로 복사하여 하나 더 만든 후에 android:name=”” 부분에 새로 생성한 클래스의 이름 “.MyActivity”를 넣습니다. android:label 부분은 titlebar에 출력될 텍스트를 설정하는 부분입니다. 그리고 Main에 있던 category 부분은 일단 제거하고 저장하도록 하겠습니다.

lecture2-9.JPG
(
그림 2-9)

메서드 오버라이드

자 이제 필요한 파일들은 모두 생성을 했습니다. 이제 생성된 파일들을 실제 동작할 수 있도록 자바 코드를 작성해 보겠습니다. 다시 MyActivity.java 파일로 돌아갑니다.

클래스의 { } 사이를 클릭해서 커서를 위치 시킨 후 오른쪽 마우스 버튼을 클립합니다. 그리고 Source Override/Implement Methods를 클릭합니다.

lecture2-10.JPG
(
그림 2-10)

생성된 다이얼로그 창에서 오버라이드할 메서드인 onCreate(Bundle)을 찾아서 체크한 후에 OK 하면 MyActivity.java에 해당 메서드를 오버라이드한 코드가 자동으로 생성됩니다.

lecture2-11.JPG
(
그림 2-11)

이제 오버라이드한 onCreate메서드에 아까 만들었던 myactivity.xml 이라는 레이아웃을 이 Activity의 화면 구성에 사용한다는 코드인 setContentView(R.layout.myactivity); 작성하여 넣습니다. 그 다음 디버그 메시지 출력을 위한 코드인 Log.d(“MyTag”, “Print Test Log”);를 작성하여 넣습니다. 그런데 Log라는 클래스명에서 빨간 밑줄이 그어지며 에러표시가 난 것을 확인하실 수 있습니다. 해당 클래스가 현재 파일에 import되어있지 않기 때문에 발생하는 에러입니다. Log 위에서 오른쪽 마우스를 클릭한 후 SourceAdd Import를 클릭합니다. (단축키로 Ctrl+Shift+M도 사용하실 수 있습니다.) Log클래스가 여러 개 있기 때문에 선택을 위한 다이얼로그가 뜹니다. android.util.Log를 선택합니다.

lecture2-12.JPG
(
그림 2-12)

이제 기본적인 코드 작성이 끝이 났습니다. 새로 작성한 소스를 실행해보는 일이 남았는데요 다음 강좌에서 계속 하도록 하겠습니다.


출처 : http://www.androidpub.com/641 작성자 : 회색(박성서)

2010. 1. 11. 20:10

안드로이드 강좌 1 - 어플리케이션 개발 시작하기. SDK 설치 및 실행




안드로이드 개발
안드로이드의 개발은 크게 두 분야로 나누어서 생각할 수 있습니다.

1. 안드로이드 SDK위에서 어플리케이션의 개발
2. 안드로이드 플랫폼의 포팅 및 개발

1번은 주소록, 게임, 뮤직플레이어 등과 같은 것들을 개발하는 것입니다. 안드로이드 어플리케이션은 Java언어로 개발이 되기 때문에 Java언어를 다룰 수 있는 능력이 필요합니다. 먼저 이클립스 개발환경과 안드로이드 SDK를 설치하는 것으로 시작을 합니다.

2번은 안드로이드를 새로운 디바이스에 탑재하고자 할때 즉 안드로이드를 포팅하고자 할 때 알아야할 부분입니다. 다비이스 드라이버, 리눅스 커널 그리고 미들웨어단을 봐야 하는 부분입니다. 좀더 안드로이드 내부 깊숙히 알아보고 싶으시다면 도전해볼 수 있습니다. 일단 소스 다운로드 받아서 빌드해보면서 시작을 하시면 됩니다. C/C++/어셈블리 언어 개발능력이 필요합니다.

안드로이드를 시작하실 때 위 두부분중 어디에 관심을 가지고 있는지를 판단하는게 우선입니다. 두 개가 어떤 차이가 있는지도 잘 모르겠다라고 하시는 초보 분은 1번 어플리케이션 개발을 먼저 시작하는 것을 추천합니다. 그리고 앞으로 제가 하는 강좌는 어플리케이션 개발을 위주로 구성이 될 것입니다.

안드로이드 SDK 설치 및 실행
안드로이드 SDK의 설치는 이클립스 3.4 버전을 기준으로 설명합니다. 

1. Java SDK 설치

http://java.sun.com/javase/downloads/index.jsp
Java SE Development Kit (JDK) 6 를 설치합니다.

2. 이클립스 설치

http://www.eclipse.org/downloads/
Eclipse IDE for Java Developers 버젼을 다운로드 받습니다. 안드로이드에서 WST를 사용하는데 기본으로 WST가 포함되어있으니 새로 설치하신다면 위 버전을 추천합니다. 설치할 디렉토리에 압축을 풉니다.

3. Android SDK 설치

http://developer.android.com/sdk
약관에 동의하신 후 Android SDK 중에 자신의 OS에 맞게 압축된 SDK 파일을 다운로드 받습니다.
SDK설치 할 디렉토리를 만들고 압축을 해제하니다.
디렉토리 위치에 한글이 포함되어 있으면 안됩니다.

4. 안드로이드 Eclipse 플러그인 설치 (ADT) 

          방법1 - 인터넷에서 설치

          Eclipse 3.5 (Galileo)

                    Help/Install New Software
                    Add 버튼 클릭
                    Name엔 적당히 Android PlugIn이라고 채우시고, Location에 https://dl-ssl.google.com/android/eclipse/ 넣음
                    OK를 누르고
                    리스트에 표시된 Developer Tools 라고 되어있는 체크박스를 체크한후 Next, Next, 약관 동의, Finish 

                    위 URL이 안된다면 http://dl-ssl.google.com/android/eclipse/로도 시도해보세요. (https -> http)

  Eclipse 3.4 (Ganymede)

설치된 이클립스를 실행시킨 후, 메뉴의 Help/Software Update 실행
Available Software 탭으로 이동
Add Site : https://dl-ssl.google.com/android/eclipse/
새로추가된 사이트 밑에 Developer Tools 라고 되어있는 체크박스를 체크한후 Install
Android Development Tools와 Android Editors가 체크되어있는지 확인합니다.
약관에 동의한후 Finish를 클릭하면 인스톨 됩니다.

위 URL이 안된다면 http://dl-ssl.google.com/android/eclipse/로도 시도해보세요.

방법2 - 파일을 받아서 설치

인터넷에서 설치가 에러가 나는 경우가 잦습니다. 그 경우 파일을 직접 받아서 설치합니다.

http://developer.android.com/sdk/adt_download.html

현재 SDK에 맞는 플러그인 버전 선택하여 하드디스크에 저장
Add 까지는 방법1과 동일
Archive 선택
다운로드 받은 플러그인 zip 파일 선택
나머지는 방법1 과정과 동일

5. 이클립스 안드로이드 SDK 설정

이클립스의 메뉴 Windows/Preference 실행
왼쪽 탭에서 Android 선택
Browse를 한후 SDK를 설치한 디렉토리 선택 (디렉토리 패스에 한글이 들어가 있으면 안됩니다.)
Apply후 OK

6. 안드로이드 버전별 다운로드

안드로이드 2.0 SDK 부터 새로 생긴 방식입니다. 각 버전별 에뮬레이터 및 SDK를 별도로 다운로드 받게 되어있습니다.

sdkavd0.JPG 

Window/Android SDK and AVD Manager 실행

sdkavd1.JPG

Available 패키지에서 설치를 원하는 API 버전 선택 

(현재 https로 시작되는 것은 에러가 나는 경우가 종종 있습니다. 이경우 http://로 시작하는 주소를 Add Site로 추가합니다.

Install Selected 

설치가 모두 완료되었습니다.

에뮬레이터 AVD의 설정

Android SDK 1.5 부터 AVD라는 새로운 개념이 생겼습니다.  http://www.androidpub.com/35413 에 설명을 추가했으니 따라서 설정해주시기 바랍니다. 

안드로이드 프로젝트 생성 및 실행

이클립스 실행
메뉴에서 File / New / Project선택
Android 선택
Project Name설정 

예)
Project Name : MobilePlace Lecture
Package Name : kr.mobileplace.lecture
Activity Name : Main
Application Name : MobilePlace

메뉴 Run/Run Configurations 실행
안드로이드 어플리케이션에서 오른쪽 마우스 클릭후 New 선택
Configuration Name 변경
Browse후 Test Project선택
Apply 후 Run 실행

에뮬레이터가 실행되며 Hello World를 표시한 어플리케이션이 실행됩니다.

SDK문서와 APIDemos

안드로이드 SDK에 대한 문서는 설치한 SDK디렉토리 밑에 doc/에 존재합니다. 그러나 그것만 보고 프로그래밍할 수 있는 사람은 많지 않습니다. 많은 API의 경우 실제 어떻게 사용되는지 Sample Code를 보고 활용하는 것이 좋습니다.

코딩할 때 참고용 소스로 가장 좋은 것은 SDK설치시 같이 첨부되는 ApiDemos 프로젝트 입니다. SDK디렉토리 밑에 sample/ApiDemos에 위치하며 항상 이클립스 프로젝트에 넣어놓고 참고하는 것이 좋습니다. Android 프로젝트를 만들때 Create project from existing source를 선택하고 Location을 Browse해서 samples밑에 ApiDemo를 선택한 후에 확인을 누르시면 이클립스에서 로드됩니다.

거의 모든 API의 사용법, XML의 사용법이 총 망라되어있으니 API를 사용할 때는 JavaDoc과 함께 먼저 ApiDemos프로젝트의 소스를 꼼꼼히 살펴보시기 바랍니다.

관련링크
안드로이드 개발 공식 사이트 : (영문) http://developer.android.com
안드로이드 개발 환경 구성 :   (영문)  http://developer.android.com/sdk/installing.html

출처 : http://www.androidpub.com/588 작성자 : 회색(박성서)