Android/정리2010. 1. 6. 23:01
http://learnandroid.blogspot.com/2008/01/run-android-application-from-command.html

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
 package="com.iftitah.android.contact">
  <application android:icon="@drawable/icon">
   <activity class=".Contact" android:label="@string/app_name">
    <intent-filter>
    <action android:value="android.intent.action.MAIN" />
    <category android:value="android.intent.category.LAUNCHER" />
   </intent-filter>
  </activity>
 </application>
.
.
</manifest>

위와 같이 activity가 정의되어 있을 때... 아래와 같이 실행하면 됨

am start -a android.intent.action.MAIN -n
com.iftitah.android.contact/com.iftitah.android.contact.Contact
Posted by 삼스
Android/정리2009. 12. 9. 17:55
API Level : 6

Android 2.0.1은 android handset에 적용가능한 minor platform release이다.
minor API change, bug-fixes, framework behavioral의 변경이 되었다. framework에 대한 변경은  Framework API 를 참조하라.

Built-in app로 Sync Tester app가 추가되어 thirdparty sync adapter의 테스트를 돕는다.

API 변경 요약
  • quickContactBadgeStyle* 속성이 QuickContactBadge에 추가됨. -> style을 지정가능
  • ACTION_CONFIGURATION_CHANGED를 받기 위해 manifest에 기술할 필요 없으며 run-time에 registerReceiver()로 하면 됨
Framework관련 behavior변경 요약

블루투스
  ACTION_REQUEST_ENABLE과 ACTION_REQUEST_DISCOVERABLE의 리턴값 변경
  • ACTION_REQUEST_ENABLE이 성공하면 RESULT_OK를 사용자가 취소하면 RESULT_CANCELED를 리턴함
  • ACTION_REQUEST_DISCOVERABLE은 사용자가 취소하거나 BT가 enable상태가 아니면 RESULT_CANCELED를 리턴함.

Contacts
  ACTION_INSERT intent는 해당 contact가 더이상 존재하지 않으면(not persist) RESULT_CANCELED를 리턴한다.

Bug fixes
  일부 framework API의 버그를 수정함.

Resource  
  API level에 따른 app resource를 잘못 로딩하는 경우 수정됨. ex) drawable-v4는 API level4이상에서만 로드함.

Contacts
  ACTION_INSERT intent가 Contacts API로 생성한 요구에 대해 적절한 종류의 URI를 리턴함.

Others
  getCallingPackage()가 process명보다 package명으로 리턴함.

API differences report

For a detailed view of API changes in Android 2.0.1 (API Level 6), as compared to API Level 5, see the API Differences Report. Note that this difference report compares only to the most recent API Level, and there are few changes, so to see changes introduces in Android 2.0 (API Level 5), see the API Differences between 4 and 5.









Posted by 삼스
Android/정리2009. 12. 1. 17:56
2009년 11월 배포, framework API가 변경되었으며 사용자와 개발자에게 새로운 feature를 제공한다.
SDK에 다운로드하여 콤포넌트의 설치가 가능하다.

새로운 UI
 * Contacts and accounts
   - Email과 Contacts에 여러개의 계정을 사용할 수 있다(Exchange account포함).
   - 개발자가 Sync adapter를 추가할 수 있다(원하는 포맷의 동기화를 직접 구현할 수 있다).
   - Quick Contact기능은 contact에 대한 정보와 communication mode에 대해 빠른 억세스를 할수 있게 해준다. Photo, Call, SMS, email등의 기능을 바로 실행할 수 있다.
 * Email
   - Exchange 지원
   - 하나의 페이지내에서 다중사용자의 이메일을 보기 위한 이메일박스를 통합하여 보여준다.
 * Messaging
   - 모든 저장된 SMS, MMS message의 검색기능
   - 조건에 따른 오래된 메세지 자동삭제 기능
 * Camera
   - flash 지원
   - Digital zoom
   - Scene mode
   - White balance
   - Color effect
   - Macro focus
 * Andorid Virtual keyboard
   - 문자를 더 정확하게 입력하고 편하도록 keyboard layout개선
   - multitouch 기능의 안정화(두손가락이 빠르게 입력될 때 key press가 사라지지 않도록 함)
   - 더 스마트해진 사전기능.
 * Browser
   - 동작가능한 URL bar로 입력된 주소로 search나 이동이 가능함.
   - webpage thumnail기반의 bookmark
   - double-tab zoom지원
   - HTML5지원
    • Database API support, for client-side databases using SQL.
    • Application cache support, for offline applications.
    • Geolocation API support, to provide location information about the device.
    • <video> tag support in fullscreen mode.
   
* Calendar
   - Agenda view가 무제한 scroll지원
   - 각 초대에 대해 이벤트 감지(?)
   - 이벤트에 새로운 게스트 초대

새로운 플랫폼 기술
* Media Framework
   - graphic 성능 개선
* Bluetooth
   - Bluetooth 2.1
   - New BT profiles : Object Push Profile(OPP) and Phone Book Access Profile(PBAP)

새로운 Framework API
API Level은 5이며 몇가지 새로운 API를 제공한다.

* Bluetooth
  - Turn on/off Bluetooth
  - Device와 Service 검색
  - Connect to a remote device usinng RFCOMM and send/receive data
  - Advertise RFCOMM services and listen for incoming RFCOMM connection
* Sync adapters
  - 임의 데이터의 싱크 지원 가능함.
* Account Manager
  - 보안고려한 통합된 Account manager API지원
* Contacts
  - multi account지원하는 새로운 Contacts API
  - 새로운 Quick Contact framework API제공
* WebView
  - UrlInterceptHandler, Plugin, PluginData, PluginList,UrlInterceptRegistry 제거
* Camera
  - 새로운 파라메터 제공 : color effect, scene mode, flash mode, focus mode, white balance, rotation, etc...
  - Zoom level 변경시 ZoomCallback interface제공
* Media
  - 모든 image는 MediaStore에 저장될 때 thumbnail생성
  - 새로운 Thumnail API제공하여 image와 video thumnail을 검색가능
* Other framework
  - 새로운 System theme제공(R.style) : 현재 system wallpaper상에 최상위에 activity를 표시하거나 이전 activity를 background에 보여지게 할 수 있슴.
  - WallpaperManager가 새롭게 교체됨 
  - 새로운 Service API : service가 수행중 메모리가 모자란 경우등에 대해서 Application에서  Service life-cycle을 정확하게 처리할 수 있는 API가 추가됨 -> Service.setForeground()는 사용되지 않으며 Service.startForeground()사용함.
  - MotionEvent가 multi-touch지원함. 동시에 3개까지 지원
  - KeyEvent가 새로운 dispatch API제공 : action-on-up, long-press, cancel key 메커니즘(viertual key)
  - WindowManager.LayoutParams에 새로운 상수 추가 : 화면에 보여지거나 스크린이 lock되어 있는 상태에서 표시될 때 wake-up시킬수 있는 상수 제공. AlarmClock같은 app에서 쉽게 구현 가능
  - 새로운 Intent API : device의 docking상태를 broadcast하고 Application에서 이때 임의 activity를 실행할 수 있다.

** Key-up 이벤트 
  - 2.0은 HOE, MENU, BACK, SEARCH키에 기반하여 동작하도록 설계되었다. 최적의 UX를 위해서 key-down보가 key-down, key-up 쌍으로 수행되도록 개선되었다. 이 로써 잘못된 버튼 이벤트를 방지할 수 있고 사용자가 버튼을 누른상태에서 아무 이벤트발생시키지 않으면서 drag out 할 수 있다.
  - 이 수정사항은 button 이벤트를 가로채서 key-down action을 얻어낼 때 유효하다. Application에서 BACK key를 가로채고 싶다면 App에서 key event 속성을 처리해야 한다.
  - 일반적으로 App에서 BACK key의 가로채기는 권장사항이 아니다. 하지만 그렇게 해야 하고 key-up보가 key-down이벤트를 처리해야 한다면 코드를 수정해야 한다.
  - Activity나 Dialog에서 BACK key를 가로채고 싶다면 onBackPressed()만 구현하면 된다.

  - If you are intercepting the BACK key in a view, you should track the key event on key-down (through the new startTracking() method), then invoke the action at key up. Here's a pattern you can use:

        public boolean onKeyDown(int keyCode, KeyEvent event) {
            if (keyCode == KeyEvent.KEYCODE_BACK
                    && event.getRepeatCount() == 0) {
                event.startTracking();
                return true;
            }
            return super.onKeyDown(keyCode, event);
        }
    
        public boolean onKeyUp(int keyCode, KeyEvent event) {
            if (keyCode == KeyEvent.KEYCODE_BACK && event.isTracking()
                    && !event.isCanceled()) {
                // *** DO ACTION HERE ***
                return true;
            }
            return super.onKeyUp(keyCode, event);
        }

If you want to update a legacy application so that its handling of the BACK key works properly for both Android 2.0 and older platform versions, you can use an approach similar to that shown above. Your code can catch the target button event on key-down, set a flag to track the key event, and then also catch the event on key-up, executing the desired action if the tracking flag is set. You'll also want to watch for focus changes and clear the tracking flag when gaining/losing focus.


  

API differences report

For a detailed view of API changes in Android 2.0 (API Level 5), as compared to the previous version, see the API Differences Report.







Posted by 삼스
Android/정리2009. 5. 11. 14:19
출처: http://www.kandroid.org/board/board.php?board=androidsource&command=body&no=4


안드로이드 전체 소스 코드 빌드 방법

 
먼저 안드로이드 소스를 빌드하기 위해선 리눅스 ubuntu 환경을 만드는 것이 바람직할 듯 합니다.
구글도 ubuntu 를 추천하고 있기 때문이고, 다른 package 사용하면 리눅스 초보자의 경우 작업이
힘들 수 있을 것으로 보입니다. 가급적 우분투를 사용하시기 바랍니다.
 
그럼 이제부터, 제가 build한 절차를 os 설치에서 부터 순차적으로 설명드리도록 하겠습니다.
최종적으로 모두 build하기 까지 꽤 많은 시간이 소비되니 충분한 시간을 가지고 빌드하시기 바랍니다.
 
1. 리눅스 Ubuntu 패키지 설치.
 
   전 참고로 ubuntu-8.04.1 desktop-i386을 사용하였음을 알려드립니다.
 
   - 먼저 아래의 url에서 우분투 iso 이미지를 얻으셔서 리눅스 설치 CD를 만듭니다.

      ftp://ftp.daum.net/ubuntu-releases/8.04.1/ubuntu-8.04.1-desktop-i386.iso
 
   - 그 이후 적당한 컴퓨터에 리눅스를 설치합니다.
 
2. 리눅스가 모두 설치되면 루트 passwd를 일단 설정합니다
 
    $ sudo passwd root
 
3. 만약 설치된 리눅스 Desktop에서 직접 작업을 원하시지 않는다면 ssh를 설치합니다
    저의 경우엔 ssh client를 사용하여 windows에서 접속하여 안드로이드 소스를 빌드하였습니다.
    ssh 설치 방법은 다음과 같습니다.
 
    $ sudo apt-get install ssh
 
4. 안드로이 설치 환경 준비
 
    - 기본적으로 다음과 같은 package를 인스톨하여야 합니다.
 
       $ sudo apt-get install flex bison gperf libsdl-dev libesd0-dev libwxgtk2.6-dev build-essential zip curl
       $ sudo apt-get install valgrind
 
    - 안드로이드는 Phython 2.4 이상이 요구됩니다.
       우분투 8.04.1에는 이미 Phython 2.5가 포함되어 있기 때문에 이 부분은 skip하셔도 됩니다.
 
    - JDK 5.0, Update 12 또는 그 이상이 요구됩니다.
       이를 위해선 다음과 같이 설치하시면 됩니다.
 
       $ sudo apt-get install sun-java6-jdk
 
    - Git 1.5.4 또는 그 이상 버전, 그리고 Repo가 요구됩니다.
 
       $ cd ~
       $ mkdir bin
 
       vi 로 ~/.bashrc 에 다음과 같이 환경변수를 추가합니다.
 
       $ vi ~/.bashrc
 
       export LANG=c
       export PATH=/home/<your_home>/bin:$PATH:.
       export JAVA_HOME=/usr/lib/jvm/java-6-sun-1.6.0.07
       export ANDROID_JAVA_HOME=$JAVA_HOME
 
       환경설정을 반영하기 위해 다시 로그인 하시던가 아니면 터미날을 종료했다 다시 실행하세요.
       csh의 경우엔 source ~/.cshrc를 하면 되는데..bash를 잘 모르겠네여.
 
       다음으로 git와 repo를 설치입니다.
 
       $ sudo apt-get install git-core gnupg      
 
       $ curl http://android.git.kernel.org/repo >~/bin/repo
       $ chmod a+x ~/bin/repo
 
       $ mkdir mydroid
       $ cd mydroid
 
       $ repo init -u git://android.git.kernel.org/platform/manifest.git
  
       여기까지 실행하시면, repo initialized in /home/<your_home>/mydroid 란 메시지가 나옵니다.
       이렇게 되면 환경설정은 이제 마무리 되었다고 보셔도 됩니다.
 
5. 안드로이드 소스 얻기
 
       아래과 같이 수행하면 안드로이드 전체 소스를 다운로드 하게 됩니다.
 
       $ repo sync

 
6. 안드로이드 빌드 하기
 
      $ make
 
      이 과정을 수행하는 동안 zlib.h error가 발생할 수 있습니다.
      이 경우에는 아래와 같이 zlibb1g-dev를 설치하시고 계속 make를 수행하면 됩니다.
 
      $ sudo apt-get install zlib1g-dev
      $ make
 
      이 과정을 수행하는 동안 -lncurses error가 발생할 수 있습니다.
      이 경우에는 아래와 같이 libncurses5-dev를 설치하시고 계속 make를 수행하면 됩니다.
 
       $ sudo apt-get install libncurses5-dev
       $ make
 
7. 결과 확인하기
 
       out 디렉토리에 build된 안드로이드 full package가 위치하게 됩니다.
 
       $ cd out
 
8. Kernel 별도로 빌드하기
 
     - msm
 
        $ cd ~/mydroid/kernel
        $ make msm_defconfig ARCH=arm
        $ make ARCH=arm CROSS_COMPILE=../prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/arm-eabi-
 
     - goldfish (android 1.5에 merge되었으므로 이 커맨드는 동작하지 않음)
 
        $ cd ~/mydroid/kernel
        $ make goldfish_defconfig ARCH=arm
        $ make ARCH=arm CROSS_COMPILE=../prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/arm-eabi-
 


Posted by 삼스
Android/정리2009. 5. 6. 16:50
Activity = molecule
Tack = cellection of activities
Process = standard linux process

<원문 번역>
Activity & Task
 하나의 activity는 다른 activity를 시작할 수 있고 다른 application의 activity도 시작할 수 있다. 예를 들어 임의위치의 street map을 display한다고 가정하자, 이런 작업을 하는 activity는 이미 제공된다. 따라서 당신의 activity에서 이 activity를 시작하기 위해 해야 할 일은 필요한 정보를 포함하는 intent object를 startActivity()에 파라메터로 전달하여 호출하는것 뿐이다. 이렇게 하면 street map viewer가 표시될것이다. 이 때 BACK버튼을 누르면 viewer를 시작한 당신의 activity가 다시 보여질 것이다.
 이는 사용자로 하여금 street map viewer가 당신의 application의 일부라고 느끼게 한다. 하지만 실제로는 그 activity는 다른 app의 다른 process상의 activity이다.
 안드로이드는 이처럼 사용자가 사용한 activity들을 task로 하여 그 정보를 유지한다. 관련된 activity는 group으로 stack에 저장된다.
 root activity는 task상의 첫번째 activity이고 top activity는 현재 화면에 보여지는 activity이다. activity가 다른 activity를 시작하면 그 새로운 activity가 stack에 push되고 그 activity가 top activity가 된다. 그리고 이전 activity는 stack에 남아 있는다. 이 상태에서 사용자가 BACK버튼을 누르면 이전 activity가 stack에서 POP되어 화면에 보여지게 되어 resume된다.
stack은 activity의 object(instance)를 가지고 있다. 따라서 같은 activity의 여러개의 instance가 가능하다. 같은 activity를 여러개 시작할수 있다는 의미이다.
 stack내의 activity는 stack이므로 재정렬되지 않는다. 순서는 그대로 유지되게 된다. 단지 PUSH, POP만 된다.
Task는 activity들의 stack이다. 따라서 task내의 activity에 어떤 값을 설정하는 방법은 없다. root activity만이 affinity(친밀도) set을 이용하여 read, set이 가능하다.
Task의 모든 activity들은 하나의 집합으로 background또는 foreground로 이동한다. 현재 Task가 4개의 activity를 가진다고 가정해보자. HOME 키를 누르면 application launcher로 이동한다. 이어서 새로운 application을 실행한다. 그러면 현재 task는 background로 가고 새로운 task의 root activity가 표시된다. 이어 사용자가 다시 HOME으로 갔다가 이전 application을 다시 선택한다면 그 task가 다시 앞으로 나온다. 이 때 BACK키를 누르면 root activity가 표시되지 않고 task상의 이전 activity가 표시된다.

      A1 -> A2 -> A3 -> A4 -> HOME -> B 1-> B2 -> HOME -> A4 -> BACK -> A3

task와 activity간의 결합과 동작에 대한 제어는 intent object의 flag 파라메터와 minifest의 <activity> element의 몇가지 속성으로 제어가 가능하다.

    flag -> FLAG_ACTIVITY_NEW_TASKFLAG_ACTIVITY_CLEAR_TOP, FLAG_ACTIVITY_RESET_TASK_IF_NEEDED, FLAG_ACTIVITY_SINGLE_TOP
    <activity>'s attributes -> taskAffinity, launchMode, allowTaskReparenting, clearTaskOnLaunch, allowRetainTaskState, finishOnTaskLaunch

Affinityes and new Tasks
 기본적으로 하나의 application의 activity들은 각기 하나의 affinity를 갖는다. 그러나 각각의 affinity들은 <activity> element의 taskAffinity속성으로 affinity set을 이룰수 있다. 서로 다른 application의 activity들이 동일한 affinity를 공유할 수 있으며 한 application의 activity들이 서로 다른 affinity를 가질수 있다. affinity는 intent object에 FLAG_ACTIVITY_NEW_TASK로 activity를 적재할 때와 activity가 allowTaskReparenting속성을 true로 set하였을 때 시작된다.

FLAG_ACTIVITY_NEW_TASK 적용시
 앞서 기술한대로 기본적으로 activity는 startActivity()로 task안에 적재된다. caller와 동일한 stack에 push된다. 그러나 startActivity()가 FLAG_ACTIVITY_NEW_TASK 로 flag를 set하여 호출하면 시스템은 새로운 activity를 담기위한 task를 찾는다. 보통 새로운 task가 생성되지만 동일한 affinity를 갖는 task가 검색되면 그 태스크에 가서 달라붙는다.

allowTaskReparenting 적용시
 특정 activity가 allowTaskReparenting속성이 "true"이면, 시작된 task에서 동일한 affinity를 갖는 다른 task가 foreground로 올라올때 그 task로 activity가 이동될 수 있다. 예를 들면, 특정도시의 날씨를 보여주는 activity를 가지고 있는 travel application이 있다고 하자. travel application에 동일한 affinity를 갖는 다른 activity가 있고 reparenting이 가능하다. 이 상태에서 당신의 application의 activity가 travel application의 날씨 activity를 시작하면 날씨 activity는 당신의 task에 적재되게 된다. 그러나 이 때 travel application이 적재되게 되면 날씨 activity는 새로 시작된 travel application의 task에 재위치지정이 되고 화면에 표시되어진다.

travel application : Weather activity, ... -> allowTaskReparenting이 true이고 모두 동일 affinity를 갖는다.
your application : A, B, C, D activity

 launch travel application -> (1)start Weather activity -> HOME -> launch your application -> start A activity -> (2)start Weather activity -> HOME -> (3)travel application -> display Weather activity
  
(1) 시점에서 weather activity는 task1(travel app의 task)에 적재된다. (2)시점에서 weather activity는 task2(your app의 task)에 적재된다. (3)의 시점에서 travel app가 다시 시작될때 task2에 있던 weather activity가 task1으로 재지정되게 된다.
 
하나의 패키지(*.apk)에 여러 application이 정의되어 있다면 app단위로 각기 다른 affinity를 부여하는것이 좋다.

Launch Mode
 <activity> element에 lounchMode 속성을 조정하여 activity를 컨트롤할 수 있다. 

            standard, singleTop, singleTask, singleInstance

 위 4가지 모드는 4가지 관점에서 다르게 동작한다.
* 임의 Intent에 대해 어떤 task가 그 activity를 받을 것인가?
 standard, singleTop모드는 intent가 발생된 task에 push된다. flag를 FLAG_ACTIVITY_NEW_TASK로 설정해도 호출한 동일한 task내에 push된다. 위에 기술한 affinity & new task에 따라 다른 task가 선택될수 있다.
 singleTask및 singleInstance는 task를 정의하여 root activity로 적재되고 다른 task에 적재되지 않는다.
* 다중 instance activity가 가능한가?
standard, singleTop모드는 여러 task에 소속될수도 있고 한 task에 동일한 activity가 여러 instance가 적재될수도 있다. 
singleTask, singleInstance는 task내에서 오로지 한개의 instance만 적재된다. root activity만 가능하기 때문에 device내에서 한번에 하나의 Instance만 존재할 수 있다.
* Instance가 task내에서 다른 activity를 가질수 있는가?
 singleInstance는 task내에서 오직 하나의 instance만 가능하며, 만일 다른 activity를 시작하면 launchMode에 관계없이 새로운 task가 생성되어 적재된다.
 standard, singleTask, singleTop은 모두 multi instance가 가능하다. singleTask는 root activity로 생성되며 다른 activity를 task내에 적재가 가능하다. singleTop과 standard모드는 stack내에서 자유롭게 다른 activity를 생성가능하다.
* 특정 class의 새로운 instance가 새로운 intent를 다룰것인가?
 standard모드는 새로운 instance가 새로운 intent의 응답으로 생성된다. 각 instance는 오직 하나의 intent를 다룬다.
 singleTop : target-task의 stack에 top activity로 있다면 그 class의 instance가 intent를 재사용하여 처리한다. top activity가 아니면 재사용하지 않고 새로운 instance가 생성되어 intent를 처리하고 stack에 push된다.

예) A - B - C - D에서 D를 시작하려고 할 때  D가 singleTop이면 A - B - C - D 로된다.
     A - B - C - D에서 D를 시작하려고 할 때  D가 standard이면 A - B - C - D - D 로된다.
     B가 singleTop이나 standare이면 A - B - C - D - B 가 가능하다.
    

Clearing the stack
  기본적으로 사용자가 task를 오랫동안 사용하지 않으면 system은 task의 root activity만을 제외하고 모든 activity들을 clear한다. <activity>element의 몇가지 속성은 이를 조정할 수 있게 해준다.

alwaysRetainState 속성
  task의 root activity에 이 속성을 set하면 이 task는 오랜시가이 지나도 생존하게 된다.
clearTaskOnLaunch 속성
  task의 root activity에 이 속성을 set하면 task를 나가고 돌아올때 clear된다.
finishOnTaskLaunch
  clearTaskOnLaunch와 유사하나 이 속성은 하나의 activity에만 유효하다. root activity를 포함하여 현재 세션인 경우에만 살아있고 task를 떠나면 clear된다.

  stack에서 activity를 제거하는 다른 방법이 있다.
  intent object의 flag를 FLAG_ACTIVITY_CLEAR_TOP로 하고 이 intent를 처리할 activity가 target task에 이미 instance를 가지고 있다면 상위 activity들이 모두 clear되고 그 activity가 top activity가 된다.   launchMode가 "standard"라면 stack에서 마찬가지로 삭제되고 새로운 activity가 그 intent를 처리할 것이다.
  FLAG_ACTIVITY_NEW_TASK와 FLAG_ACTIVITY_CLEAR_TOP이 함께 사용되면 존재하는 activity가 새 task에 생성되어 intent를 처리한다.

Starting task
  activity는 intent filter중에 action filter로 android.intent.action.MAIN를 그리고 category filter로  android.intent.category.LAUNCHER로 entry point가 설정된다. 이런 설정은 icon과 label정보를 가지로 화면에 표시하고 task에 적재하고 적재후 언제든지 다시 돌아올수 있도록 해준다.
  사용자는 언제든 task를 떠날수 있고 다시 돌아올수 있다. singleTask와 singleInstance로 설정된 activity는 반드시 MAIN과 LAUNCHER를 filter로 적용해야 한다. 그러지 않으면 activity를 수행후 다른 화면으로 갔다가 다시 돌아올 수 있는 방법이 없게 된다.

  FLAG_ACTIVITY_NEW_TASK 는 activity하나가 새로운 task에 시작되고 HOME key를 눌렀을 경우 다시 복귀하기 위해 다른 방법이 있다.
  외부 task에서 notification manager같은 entity에서 항상 activity들을 시작할 수 있다. 이런 방식으로 외부에서 activity를 invoke할 수 있다면 사용자가 다른 방법으로 그 task를 시작할 수 있음을 유의해야 한다. 이런 경우 그 activity로 복귀하기를 원하지 않는다면 finishOnTaskLaunch를 사용하면 된다.


Posted by 삼스
Android/정리2009. 5. 6. 15:59
Android Application을 개발하기 위해서는 다음 4가지 컴포넌트에 대해 알아야 한다.
 1. Activity
 2. Service
 3. Provider
 4. Receiver
 5. Manifest
이 외에 activity들의 스택인 task에 대해 알아야 한다.

1. Activity
 하나의 가상의 사용자 인터페이스에 대한 표현이다.
 - 화면에 나타나지 않을수 있고
 - 화면에 떠있을 수 있고
 - 어떤 값을 리턴할수 있고
 - 어떤 화면의 일부로 임베디드될수 있다.

 package com.android.myactivity;
import android.app.Activity;
import android.os.Bundle;
public class MyActivity extends Activity
{
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    }
}

2. Service
 - 백그라운드로 수행되는 보이지 않는 클래스들이다.
 - Application process의 일부 또는 그 자체의 process로 동작할 수 있다.
 - 자신의 process또는 다른 process의 service에 bind할수 있다.
 - IDL로 정의된 remote-able interface로 한번 bind된 service와 통신이 가능하다.
 package com.android.myservice;
import android.app.Service;
public class MyService extends Service
{   
    public void onCreate() {
        Thread st = new Thread() {
            void run() { /* ... */ }
        };
        st.start();
    }
    public void onDestroy() {
        /*
        / ... *//
    }
}

3. Broadcast Receiver
 - Broadcast receiver는 broadcast announcement를 받아서 응답하는 일만 하는 다른 일은 아무것도 하지 않는 컴포넌트이다.
 - system에서 기본적으로 제공하는 많은 broadcast메세지들이 있다(예, 타임존의 변경, 배터리의 부족, 사진이 캡쳐되었는지, 사용자가 언어를 바꾸었는지등 ...)
 - Application에서 broadcast를 정의하여 발생시킬수도 있다(예, 어떤 데이터가 모두 다운되었는지 다른 app에 알리고자 할때)
 - 하나의 Application은 여러개의 broadcast receiver를 가질수 있다. receiver는 BroadcastReceiver base class를 파생시켜 작성한다.
 - Broadcast receiver는 UI를 가지고 있지 않으며 수신한 정보에 대한 응답으로 특정 activity를 시작한다거나 NotificationManager로 사용자에게 통지를 준다.
 - Notification은 다양한 방법으로 사용자에게 통지를 한다 - flashing the backlight, device떨림, 소리재생 등등...
 - 일반적으로 상태바에 아이콘으로 표시되며 사용자가 열어볼수 있게 한다.
 package org.kandroid.helloandroid;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
public class MyReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context arg0, Intent arg1) {
    }
}

4. Content provider
 - Application간에 특정 데이터를 공유할 수 있도록 해줌.
 - 획일화된 API를 제공
 - Content는 URI와 MIME type으로 표현됨.
 package org.kandroid.helloandroid;
import android.content.*;
import android.database.Cursor;
import android.net.Uri;
public class MyProvider extends ContentProvider {
    @Override public int delete(Uri arg0, String arg1, String[] arg2)
                            { return 0; }
    @Override public String getType(Uri arg0) {return null;}
    @Override public Uri insert(Uri arg0, ContentValues arg1)
                            { return null;}
    @Override public boolean onCreate() {return false;}
    @Override public Cursor query(Uri arg0, String[] arg1, String arg2,
                            String[] arg3, String arg4) {return null;}
                                        3
    @Override public int update(Uri arg0, ContentValues arg1, String arg2,
                            String[] arg3) {return 0;}
}


5. Component의 활성화
  - Content provider : ContentResolver에 의해 타켓팅될 때 활성화된다.
  - 나머지 3가지 component(Activity, Service, Receiver)는 intent로 불리는 비동기적인 메세지에 의해 활성화된다.
  - Activity, Service를 위한 Intent는 Action과 URI정보가 필요하다.
  - Broadcast receiver를 위한 intent는 action정보가 필요하다.

각 component type별로 활성화하는 방법이 있다.
  - Activity : Content.startActivity() 또는 Activity.startActivityForResult()에 intent object를 넘겨서 activity를 활성화한다.
  - Service : Context.startService()에 intent object를 넘겨서 service를 활성화한다. Android는 Service의 onStart()메소드를 호출하고 intent object를 넘긴다.
  - Broadcast Receiver : Context.sendBroadcast(), Context.sendOrderedBroadcast(), Context.sendStickyBroadcast()에 intent object를 넘겨서 broadcast를 활성화한다.

6. Component의 비활성화
 - Content provider : ContentResolver의 request에 대하여 responding중에만 활성화된다.
 - Broadcast receiver : Broadcast message에 대한 responding중에만 활성화 된다.
 - 따라서 provider와 receiver는 명시적으로 component를 비활성화 할 필요가 없다.
 - Activity, Service : idle time에도 무언가 process가 이루어지는 컴포넌트이다.
 - Activity : finish()메소드로 비활성화한다. 특정 activity에서 다른 activity를 죽이려면 finishActivity()를 호출한다.
 - Service : stopService() 또는 Context.stopService()로 비활성화한다.

7. Manifest file
 - Android가 application component를 시작하기 전에 그 component가 존재하는지에 대해 먼저 알아야 한다. 그러므로 application component들에 대한 정보를 manifest 파일에 선언하고 Android package(.Apk) file에 applicaiton code, files, resources와 함께 묶음으로 담겨 있다.
 - XML file형식
 - 모든 application에 AndroidManifest.xml로 이름이 고정되어 있슴
 - component에 대한 기술 외에 library, permission등에 대한 정보도 선언됨.
 <manifest>
    <instrumentation>
    <uses-sdk>
    <uses-permission>
      uses permission
    <permission>
    <permission-group>
    <permission-tree>
    <application>
       pp
          <uses-library>
          <activity>
          <activity-alias>
          <provider>
           p
                      <grant-uri-permission>
          <receiver>
          <service>
               <intent-filter>
                      <action>
                      <category>
                      <data>
               <meta-data>




Posted by 삼스
Android/정리2009. 5. 6. 14:01
빌드하기

1. 리눅스 Ubuntu 패키지 설치.
전 참고로 ubuntu-8.04.1 desktop-i386을 사용하였음을 알려드립니다.
- 먼저 아래의 url에서 우분투 iso 이미지를 얻으셔서 리눅스 설치 CD를 만듭니다.
ftp://ftp.daum.net/ubuntu-releases/8.04.1/ubuntu-8.04.1-desktop-i386.iso
- 그 이후 적당한 컴퓨터에 리눅스를 설치합니다.
2. 리눅스가 모두 설치되면 루트 passwd를 일단 설정합니다
$ sudo passwd root
3. 만약 설치된 리눅스 Desktop에서 직접 작업을 원하시지 않는다면 ssh를 설치합니다
저의 경우엔 ssh client를 사용하여 windows에서 접속하여 안드로이드 소스를 빌드하였습니다.
ssh 설치 방법은 다음과 같습니다.
$ sudo apt-get install ssh

4. 안드로이드 설치 환경 준비
- 기본적으로 다음과 같은 package를 인스톨하여야 합니다.
$ sudo apt-get install flex bison gperf libsdl-dev libesd0-dev libwxgtk2.6-dev
build-essential zip curl
$ sudo apt-get install valgrind
- 안드로이드는 Phython 2.4 이상이 요구됩니다.
우분투 8.04.1에는 이미 Phython 2.5가 포함되어 있기 때문에 이 부분은 skip하셔도 됩니다.
- JDK 5.0, Update 12 또는 그 이상이 요구됩니다.
이를 위해선 다음과 같이 설치하시면 됩니다.
$ sudo apt-get install sun-java6-jdk
- Git 1.5.4 또는 그 이상 버전, 그리고 Repo가 요구됩니다.
$ cd ~
$ mkdir bin
vi 로 ~/.bashrc 에 다음과 같이 환경변수를 추가합니다.
$ vi ~/.bashrc
export LANG=c
export PATH=/home/<your_home>/bin:$PATH:.
export JAVA_HOME=/usr/lib/jvm/java-6-sun-1.6.0.07
export ANDROID_JAVA_HOME=$JAVA_HOME
환경설정을 반영하기 위해 다시 로그인 하시던가 아니면 터미날을 종료했다 다시 실행하세요.
csh의 경우엔 source ~/.cshrc를 하면 되는데..bash를 잘 모르겠네여.
다음으로 git와 repo를 설치입니다.
$ sudo apt-get install git-core gnupg
$ curl http://android.git.kernel.org/repo >~/bin/repo
$ chmod a+x ~/bin/repo
$ mkdir mydroid
$ cd mydroid
$ repo init -u git://android.git.kernel.org/platform/manifest.git
여기까지 실행하시면, repo initialized in /home/<your_home>/mydroid 란 메시지가 나옵니다.
이렇게 되면 환경설정은 이제 마무리 되었다고 보셔도 됩니다
5. 안드로이드 소스 얻기
아래과 같이 수행하면 안드로이드 전체 소스를 다운로드 하게 됩니다.
$ repo sync
6. 안드로이드 빌드 하기
$ make
이 과정을 수행하는 동안 zlib.h error가 발생할 수 있습니다.
이 경우에는 아래와 같이 zlibb1g-dev를 설치하시고 계속 make를 수행하면 됩니다.
$ sudo apt-get install zlib1g-dev
$ make
이 과정을 수행하는 동안 -lncurses error가 발생할 수 있습니다.
이 경우에는 아래와 같이 libncurses5-dev를 설치하시고 계속 make를 수행하면 됩니다.
$ sudo apt-get install libncurses5-dev
$ make
7. 결과 확인하기
out 디렉토리에 build된 안드로이드 full package가 위치하게 됩니다.
$ cd out
8. Kernel 별도로 빌드하기
- msm
$ cd ~/mydroid/kernel
$ make msm_defconfig ARCH=arm
$ make ARCH=arm
CROSS_COMPILE=../prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/arm-eabi-
- goldfish(1.5에서 merge됨, 따라서 msm_defconfig로 변경)
$ cd ~/mydroid/kernel
$ make goldfish_defconfig ARCH=arm
$ make ARCH=arm
CROSS_COMPILE=../prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/arm-eabi-


테스트하기
1. 먼저 mydroid 의 out directory에서 아래의 세가지 image를
android sdk가 설치된 desktop에 download를 합니다.
~mydroid/out/target/product/generic/ramdisk.img
~mydroid/out/target/product/generic/system.img
~mydroid/out/target/product/generic/userdata.img
2. android sdk 1.0 이 설치된 desktop의 아래의 directory에서 ramdisk.img, system.img, use
rdata.img를 임시로 다른 곳으로 저장합니다.
android-sdk-windows-1.0_r1/tools/lib/images
3. 위에서 다운로운한 세가지 img 파일을 위의 디렉토리에 위치지운 후,
android-sdk-windows-1.0_r1/tools/emulator.exe를 실행합니다.
4. 만약 emualor가 정상적으로 실행되고, 내부 app. 들이 정상적으로 작동한다면,
안드로이드 source는 정상적으로 build되었다고 볼 수 있습니다.

Posted by 삼스
Android/정리2009. 5. 6. 13:58


1. Bootloader : 기본적인 hw initialize
2. Load linux
3. Start kernel - /init/main.c
4. Android initialization process - /etc/init.rc
   -> Start android services: Colsole, adbd, service manager, debuggerd, mountd, rild, zygote, mediaserver, installd, flash_recovery

아래는 init.rc의 process를 도식화한것이다.

init : init.rc를 해석하여 수행하고 초기화한다.
       /dev노드 아래에 %hardware%.rc를 참조하여 디바이스노드를 생성해낸다.
console : shell을 시작한다.
service manager : binder IPC service manager를 시작한다.
mountd : 모든 filesystem을 마운트한다.
debuggerd : debug system을 시작한다.
rild : Radio Interface Layer daemon을 시작한다.
zygote : Android Java VM runtime을 시작하고 system server를 시작한다. 가장 중요한 프로세스이다.
media server : Audio/Surface flinger, MediaPlayerService, Camera service를 시작한다.
Installd : install package daemon을 시작한다.
      
  • 모든 안드로이드 어플리케이션은 zygote process에 의해 fork된다.
  • system_servier는 fork된 zygote에 의해 최초로 적재되는 특별한 프로세스이며 Core service들을 시작한다.
    • ActivityManager, WindowsManager, PackageManager, ...
  • 다른 안드로이드프로세스는 ActivityManagerService에 의해 생성된다.

더 자세한 정보를 원한다면 /frameworks/base/services/java/com/android/server/am/ActivityManagerService.java 와 /frameworks/base/core/java/android/os/Process.java

ActivityManagerService.systemReady에서 persistent application을 부팅시 시작하도록 되어 있다. 따라서 AndroidManifest.xml에서 아래와 같이 정의된 Application은 부팅시 실행된다.

 <application android:name="PhoneApp"
    android:persistent="true"
    android:label="@string/dialerIconLabel"
    android:icon="@drawable/ic_launcher_phone">

intent.CATEGORY_HOME으로 설정된 component가 적재된다.
intent.ACTION_BOOT_COMPLETED로 설정된 component가 부팅 완료후 적재된다.
receiver component중 android.enabled와 android.exported가 false이면 ACTION_BOOT_COMPLETED가 set되어 있더라도 적재되지 않는다.
<receiver android:name=".service.BootReceiver" android:enabled="false"
<receiver android:name=".DownloadReceiver" android:exported="false"> 




Posted by 삼스
Android/정리2009. 5. 6. 11:40
1. 안드로이드란?
 안드로이드는 모바일디바이스들을 위한 SW Stack으로써, OS, Middleware, Key application을 포함하고 있다.

 안드로이드SDK는 Java language를 사용하여 안드로이드플랫폼상의 application 개발에 필요한 API들과 도구들을 제공한다.

2. Features
 애플리케이션 프레임워크 : 컴포넌트의 재사용과 대체(replacement)를 가능하게 함.
 달빅(Dalvik) 가상머신 : 모바일 디바이스에 최적화됨.
 통합(Integrated) 브라우저 : 오픈 소스 Webkit 엔진 기반임.
 최적화된 그래픽 : 구글이 만든 2D 그래픽 라이브러리를 사용함.
 OpenGL ES 1.0 스펙에 기반한 3D 그래픽을 사용함 (하드웨어 가속은 선택사항임)
 SQLite : 정형화된 데이터 저장공간을 위한 것임.
 미디어 지원 : 일반적인 오디오, 비디오, 그리고 정지(still) 이미지 포맷들을 지원
                    (MPEG4, H.264, MP3, AAC, AMR, JPG, PNG, GIF)
 GSM과 CDMA 텔레포니(Telephony) (하드웨어 의존적)
 블루투스, EDGE, 3G, WiFi (하드웨어 의존적)
 카메라, GPS, 나침반, 그리고 가속도계 (하드웨어 의존적)
 풍부한 개발 환경 : 디바이스 에뮬레이터, 디버깅 도구, 메모리 및 성능 프로파일링 그리고 Eclipse
 IDE를 위한 플러그인을 포함함 

3. Architecture

3.1 Applications
 안드로이드가 기본적으로 제공하는 Java Applications

3.2 Application Framework
 자바기반의 프레임웍으로 대부분 native C/C++코드로 작성되어 JNI로 자바와 인터페이싱되어 있다.
 코어시스템서비스와 하드웨어 서비스로 구성되어 있다.
 Core System Services
  - Activity Manager
  - Package Manager
  - Resource Manager
  - Content Provierss
  - Window Manager
  - View System
 Hardware services
  - low-level access to hw device
  - Location Manager
  - Telephony Manager
  - Blutooth service
  - Wifi service
  - USB service
  - Sensor service

3.3 Libraries
 안드로이드가 내장하고 있는 기본적인 라이브러리는 Bionic Libc, Function Library, Navive Service, Hardware Abstraction Library로 구성된다.
 - Bionic Libc : 임베디드에 최적화된 구글에서 직접 구현한 libc이다. 이를 직접 구현한 이유는 GPL를 피하여 일부 라이선스 프리를 보장하기 위한것과, 개별프로세스마다 포함되어야 하고 빨라야 하기 때문이다. 따라서 가볍고 빠른 libc를 목표로 작성된 Libc이다.
 - Function Library : Webkit, OpenCORE, SQLite들이 있다.
 - Native server : Surface flinger, Audio flinger가 있다. 이는 시스템 전반에 걸친 화면과 소리를 담당하는 서버라고 보면된다.
 - Hardware Abstraction Layer : OS로 사용하고 있는 리눅스운영체제가 다수의 드라이버개발모델을 가지고 있어 이를 통합하고자 하는 의도가 보이는 대목이다. 이를 이용하여 안드로이드플랫폼을 하드웨어인터페이스로부터 분리할수 있다. GPL을 피할수 있으며 안드로이드가 별도의 하드웨어 요구사항을 정의하고 있다.
 - 안드로이드 런타임 라이브러리 : Dalvik가상머신과 Core라이브러리들로 구성된다.

3.4 안드로이드 런타임 라이브러리
 - Dalvik 가상머신 : 안드로이들에서는 자바 가상머신을 사용하지 않는다. 이유는 여러가지가 있는데 속도와 안드로이드 프레임웤구조때문이다. 달빅가상머신은 프로세스별로 생성되어 어플리케이션간의 청정영역(clean-room)을 제공한다.
    - Register 기반의 가상머신 (no JIT, interpreter-only)
    - Optimized for low memory requirements
    - Designed to allow multiple VM instances to run at one
    - Relying on underlying OS for process isolation,
       memory management and threading support
    - Executes Dalvik Executables (DEX) files which are zipped into
an Android Package (APK)
 - Core라이브러리 : 강력하지만 단순하고 익숙한 개발 플랫폼을 제공하는 자바언어를 위한 Core API들을 포함하고 있다. Application개발시 필요한 거의 모든 자바Core API들이 있다고 보면된다. Data structure, Utility, File access, Network access, graphic, ...
    - Bundled in android.jar
    - Android platform library: android.*.
       XML Parser implementations included (DOM, SAX, XMLPullParser)
    - Apache Harmony (Standrard Java Library implementation)
    - Several popular Open Source projects available out-of-the-box.
        Apache Commons (HttpClients 2/4, Codec), BouncyCastle JCE providers, SQLite, JUnit 3.8.x
    - GData APIs partly included as wireless version(com.google.wireless.gdata)

4. 리눅스 커널
 - 리눅스커널을 기반으로 하고 있으나 리눅스는 아니다.
    X-Windows내장하지 않음, Glibc지원하지 않음, 표준리눅스유틸리티 전체를 포함하지 않는다.
 - 리눅스커널 버전 2.6.23, 2.6.24, 2.6.25, 2.6.27를 사용해왔으며 안드로이드지원을 위해 패치를 포함한다.
 - 리눅스를 사용하는 이유
    - 메모리 및 프로세스관리
    - Permission기반의 보안모델
    - 검증된 드라이버모델
    - 공유라이브러리 지원
    - 오픈소스기반 등의 장점을 이용함.
 - 확장된 리눅스커널영역
    - Alarm, Ashmem, Binder, Power Management, Low memory killer, Kernel debugger, logger
 - http://git.android.com에서 배포
Posted by 삼스