public void onUserInteraction ()     Since: API Level 3

Called whenever a key, touch, or trackball event is dispatched to the activity. Implement this method if you wish to know that the user has interacted with the device in some way while your activity is running. This callback and onUserLeaveHint() are intended to help activities manage status bar notifications intelligently; specifically, for helping activities determine the proper time to cancel a notfication.

All calls to your activity’s onUserLeaveHint() callback will be accompanied by calls to onUserInteraction(). This ensures that your activity will be told of relevant user activity such as pulling down the notification pane and touching an item there.

Note that this callback will be invoked for the touch down action that begins a touch gesture, but may not be invoked for the touch-moved and touch-up actions that follow.

 Activity가 Foreground에서 실행되는 동안 키나 터치가 발생하면 호출. down, pressed, up 마다 호출 되는 것이 아니라 Interaction이 처음 일어난 시점에서만 호출된다.

protected void onUserLeaveHint ()     Since: API Level 3

Called as part of the activity lifecycle when an activity is about to go into the background as the result of user choice. For example, when the user presses the Home key,onUserLeaveHint() will be called, but when an incoming phone call causes the in-call Activity to be automatically brought to the foreground, onUserLeaveHint() will not be called on the activity being interrupted. In cases when it is invoked, this method is called right before the activity’s onPause() callback.

This callback and onUserInteraction() are intended to help activities manage status bar notifications intelligently; specifically, for helping activities determine the proper time to cancel a notfication.

 Activity가 사용자(예를들어 “뒤로”키나 “홈”키)에 의해 background로 갈때 onPause() 호출 직전에 호출된다. 다른 Activity가 Foreground로 와서 Background로 가는 경우엔 호출안됨.

- 상태표시줄 관리에 유용(사용자가 현재 작동을 취소하고자 하는 경우)


출처 : http://scrap.huni.org/post/502487485


안드로이드의 Activity들은 startActivityForResult()라는 메소드를 통해 sub activity를 만들고 Activity끼리 서로 데이터를 교환할 수 있다.

그 사이에는 'extra'라고 하는 통로가 존재하는데, 이 부분을 잘 알아야 한다.

 

Activity A가 Activity B를 서브 엑티비티로서 부르고 그로부터 결과값인 데이터를 전송받기 위해서는 어떻게 해야 할까?

먼저 삽화를 통해 기본 원리를 파악해보도록 하자.

 

다음과 같은 원리이다.

Activity A가 startActivityForResult를 통해서 Activity B를 호출하면,

B는 종료가 되면서 Result 값을 통해 Extra 꾸러미를 넘긴다.

그러면 Activity는 Extra 꾸러미 안에 있는 데이터들을 꺼내서 사용할 수 있는 것이다.

 

그렇다면 실제 구현 과정에서 어떤 작업들을 해주어야 하는지 살펴보자.

 

[Activity A 사이드]

Activity A에서 구현되어야 할 부분은,

첫째, int값의 requestCode 값을 설정해준다.

둘째, Intent를 만들어 Activity B를 실행시킨다.

셋째, onActivityResult()를 통해 각 requestCode값에 해당하는 결과값을 받아온다.

 

[Activity B 사이드]

Activity B에서 구현되어야 할 부분은,

첫째, Intent를 만들어 데이터 꾸러미를 Intent에 추가시킨다.

둘째, 결과값을 보내면서 Extra 꾸러미를 가지고 있는 Intent를 함께 넘겨준다.

 

간단하지 않은가? 그럼 코드에서는 이와같은 것들이 어떻게 구현이 될까?

 

[Activity A 사이드]

private static final int B_ACTIVITY = 0;

 

public void onCreate(){

...

Intent a_i = new Intent(this, B.class);

startActivityForResult(a_i, B_ACTIVITY);

...}

 

public void onActivityResult(int requestCode, int resultCode, Intent intent){

super.onActivityResult(requestCode, resultCode, intent);

 

switch(requestCode){

case B_ACTIVITY: // requestCode가 B_ACTIVITY인 케이스

if(resultCode == RESULT_OK){ //B_ACTIVITY에서 넘겨진 resultCode가 OK일때만 실행

intent.getExtras.getInt("data"); //등과 같이 사용할 수 있는데, 여기서 getXXX()안에 들어있는 파라메터는 꾸러미 속 데이터의 이름표라고 보면된다.

}

}

}

 

[Activity B 사이드]

 

Bundle extra;

Intent intent;

 

onCreate(){

...

extra = new Bundle();

intent = new Intent(); //초기화 깜빡 했다간 NullPointerException이라는 짜증나는 놈이랑 대면하게 된다.

...

 

extra.putInt("data", 1);

intent.putExtras(extra);

this.setResult(RESULT_OK, intent); // 성공했다는 결과값을 보내면서 데이터 꾸러미를 지고 있는 intent를 함께 전달한다.

this.finish();

}

 

 

이와 같이 하면 B 사이드에서 1이라는 데이터값을 가지고 있는 "data"라는 이름표의 꾸러미는 Activity A로 결과값으로써 전달이 되고, 사용이 될 수 있는 것이다.

나는 Bundle을 이용해서 했는데 번들을 사용하지 않고도 결과값을 보내기 위한 메소드는 있다고 본다. 이거는 API를 보면 쉽게 파악할 수 있다.

또한 int값 말고도 모든 데이터 변수들을 보낼 수 있어, 그것에 대한 걱정은 하지 않아도 된다.


[출처] [Android] startActivityForResult(), onActivityResult() 사용하기|작성자 소녕  

Android Manifest.xml 파일에서 Intent-Filter를  다음과 같이 추가하게 되면 ringtone_picker가 호출되면서 리스트 목록으로 나타나게 해줍니다.

<intent-filter>
                <action android:name="android.intent.action.RINGTONE_PICKER" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
이는 Eclipse의 ini파일에서 환경 옵션 파일이 잘못되어서 나타나는 증상 같습니다.

이를 해결하기 위해서는 eclipse.ini 파일에서 -XX:+AggressiveOpts 을 삭제 하면 

위의 문제가 해결됩니다.
위의 에러 증상이 나타나는 원인은 여러가지가 있습니다.

보통 Java Build Path에서 첨부한 라이브러리가 중복이 되어서 나타나는 증상입니다.

이는 중복이 되는 라이브러리를 삭제해주시면 됩니다.

ipconfig

또는 

ifconfig

'리눅스' 카테고리의 다른 글

우분투에서 telnet 접속 하기  (0) 2011.02.22
ibus 한글 설치하기  (0) 2011.02.21
우분투에 안드로이드 개발환경 설정하기  (0) 2011.02.01
Ubuntu Root 계정 PassWord 생성하기  (0) 2011.01.31
PS 명령어  (0) 2011.01.27

x86 안드로이드에서는 shell 을 사용함으로써, 개발자들에게 몇가지 디버깅 환경을 제공하고 있습니다. 개발에 관심이 있으신 분들은 참조해 주시면 되겠습니다.
  • 안드로이드 console (shell) 사용법
  • adb 사용법
  • gdb 사용법
 
1. 안드로이드 console 사용법
 
일반pc에서 안드로이드를 사용하다 보면, 현재 개발진행중이기 때문에 디버깅 및 shell 상에서 작업이 필요합니다. 현재 touch screen 보정이나 사운드 조절등을 위해서는 shell 상에서의 작업이 필요합니다.
  • console화면 (shell) : ALT + F1
  • 안드로이드 UI : ALT + F7
 
 
 
2. adb 사용법 
 
어플리케이션 개발하신분들은 사용에 익숙하실것 같습니다. 안드로이드 framework상이나 어플쪽에 디버깅 코드를 삽입하고 로그를 남기는 방법입니다. ( 호스트(개발PC)를 윈도우라고 가정하고 설명하겠습니다. )
  • 우선 안드로이드가 설치된 타겟에 네트웍이 연결이 되어 있어야 합니다. 
  • 호스트(자신의 개발 PC) 와 타겟(안드로이드) 간의 네트웍 연결이 되는지 확인합니다.(ping 이나 기타 연결확인)
  • 우선 호스트(개발PC)에서 adb 실행파일이 있어야 합니다. 이 툴은 안드로이드 어플 개발 환경이 설정된 상태라면 adb 가 자동으로 설치되어 있으니 참조 바랍니다.
  • 타겟(안드로이드)에서 adbd 를 실행합니다. (adb 서버)
    • # adbd
  • 호스트에서 command 창을 열어서 아래와 같이 타겟의 IP주소로 adb 연결을 합니다. (adbd 서버의 디폴트 port 는 5555 입니다.)
    • adb connect <타겟 IP주소>:5555 (ex> # adb connect 192.168.0.100:5555)
  • 현재 호스트에 연결된 타겟 연결 상태를 확인합니다.
    • adb devices
  • 이제 연결이 정상적으로 되었다면, 아래의 명령으로 디버깅에 필요한 로그를 볼수 있습니다.
    • adb logcat
  
3. gdb  사용법
 

안드로이드 소스를 수정하고 나서 SDK를 릴리즈 해 줘야 하는데, 윈도를 쓰는 사람이 많아서 윈도용도 따로 빌드해서 릴리즈 해야 하는 형편이다. 원래는 무식하게 전부 cygwin에서 빌드하는 방법을 생각하고 있었는데 따로 빌드를 하는 방법이 있더라. 



Requirements

cygwin
리눅스(혹은 MacOS)에서 빌드한 SDK (zip)
위의 SDK를 빌드하는데 사용한 안드로이드 소스의 일부


Source Files

다른 시스템에서 빌드한 SDK를 이용한다면 모든 소스트리를 카피해 올 필요는 없다. 최소 세트에 대해선 따로 연구하지 않았지만,

  • build/*
  • dalvik/*
  • development/*
  • external/
    • expat/*
    • libpng/*
    • qemu/*
    • safe-iop/*
    • sonivox/*
    • sqlite/*
    • svox/*
    • zlib/*
  • frameworks/*
  • prebuilt/
    • Android.mk
    • common/*
    • windows/*
    • windows-x86_64/*
  • sdk/*
  • system/*
  • Makefile

정도만 카피하거나 repository에서 가져 오면 된다. (`*' 표시는 해당 폴더 아래의 모든 파일/폴더를 의미함) 위의 폴더만 별도로 가져 오는 이유는, 뭐 일단 쓸데 없이 카피하는 시간을 줄이려는 것도 있지만,bionic/libc/kernel/common/linux나 external/iptables, external/tcpdump 폴더 아래의 몇 개의 파일들이 대소문자로 구별된 같은 이름을 가지고 있어 윈도우 파일 시스템에선 정상적으로 checkout할 수 없기 때문이기도 하다. 물론 단순히 리눅스 파일시스템에서 복사해 오는 거라면 문제 없겠지만... 


Running Script

development/build/tools 아래에 보면 make_windows_sdk.sh라는 스크립트 파일이 있다. 아래와 같은 명령어를 실행하면 윈도우용 SDK를 빌드 할 수 있다.

$ export SDK_NUMBER="eng.ysjang_`date +%Y%m%d"
$ development/build/tools/make_windows_sdk.sh android-sdk_eng.ysjang_linux-x86.zip .

$SDK_NUMBER는 생성될 zip 파일의 이름에 추가되는 것이므로 특별한 의미를 부여하진 않아도 된다. 명령어를 실행하면, 몇가지 툴의 컴파일을 마치고 linux SDK를 풀어 해당 내용과, 윈도에서 컴파일 한 툴 바이너리들을 합쳐서 현재 디렉토리(마지막 인자)에 zip 파일을 생성해 줄 것이다.


Troubleshooting

development/host/windows/prebuilt/usb/AdbWinApi.a 가 존재하지 않아 컴파일 오류가 나는 경우가 있다. 해당 폴더로 가서 다음의 명령어를 입력하면 생성할 수 있다.

$ cd development/host/windows/prebuilt/usb/
$ dlltool --def AdbWInApi.def --dllname AdbWinApi.dll --output-lib AdbWinApi.a


cygwin에 mgwz.dll 파일이 존재하지 않는 버전이 있다. 내 경우가 바로 그랬는데 ldd를 해 보니cygz.dll을 사용하고 있었다. 만약 make_windows_sdk.sh로 빌드하던 중 mgwz.dll을 카피하는 곳에서 문제가 생긴다면 일단 mgwz.dll을 정말로 참조하고 있는 지부터 살펴 보자. out/host/windows/bin 폴더로 가서 ldd로 aapt.exe가 무슨 라이브러리들을 참고하고 있는지 살펴보자.

이 문제는 mgwz.dll이 있더라도, cygwin을 C:\cygwin에 설치하지 않고 다른 곳에 설치했을 경우에도 마찬가지로 일어난다.

$ ldd aapt.exe
        ntdll.dll => /cygdrive/c/Windows/system32/ntdll.dll (0x77230000)
        kernel32.dll => /cygdrive/c/Windows/system32/kernel32.dll (0x758e0000)
        msvcrt.dll => /cygdrive/c/Windows/system32/msvcrt.dll (0x75b20000)
        cygz.dll => /usr/bin/cygz.dll (0x692c0000)
        cygwin1.dll => /usr/bin/cygwin1.dll (0x61000000)
        ADVAPI32.DLL => /cygdrive/c/Windows/system32/ADVAPI32.DLL (0x76bf0000)
        RPCRT4.dll => /cygdrive/c/Windows/system32/RPCRT4.dll (0x76e60000)

mgwz.dll 대신 다른 라이브러리를 참고하고 있다면 make_windows_sdk.sh를 수정하자. 다음의 두 곳을 수정해 주면 된다.

    # We currently need libz from MinGW for aapt
    # cp -v /cygdrive/c/cygwin/bin/mgwz.dll "$TOOLS"/
    cp -v /cygdrive/c/cygwin/bin/cygz.dll "$TOOLS"/
    cp -v /cygdrive/c/cygwin/bin/cygwin1.dll "$TOOLS"/

    # Note: mgwz.dll must be both in SDK/tools for zipalign and in 
    # SDK/platform/XYZ/tools/ for aapt
    # cp -v "$TOOLS"/mgwz.dll "$PLATFORM_TOOLS"/
    cp -v "$TOOLS"/cygz.dll "$PLATFORM_TOOLS"/
    cp -v "$TOOLS"/cygwin1.dll "$PLATFORM_TOOLS"/
출처 : 
http://zeph1e.tistory.com/15



먼저 안드로이드 소스를 빌드하기 위해선 리눅스 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
 
        $ 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- 
 

웹서핑중 PC에 안드로이드 OS 설치기가 있어 따라해봤습니다.
다만 저의 경우 Mac이기에 Virtual Box를 통해 설치해 보도록 하겠습니다. 너무나 쉬운 나머지 하품이 나올지 모르니 빨리 설명할께요. =)

x86용 안드로이드 이미지가 필요합니다. 저의 경우 Android-x86 사이트에서 iso 이미지 파일을 구했습니다.

해당 이미지를 시디로 굽고요.(RW 시디라야 아깝지 않겠죠? ㅎㅎ) - 디스크 유틸리티를 사용합니다.(시디 없이 Virtual box에서 이미지를 불러 사용할 수 있습니다. 이럴 경우 아래의 시디 굽기는 넘어갑니다.)

정상적으로 구워진 시디를 Virtual Box에서 불러 설치합니다. 설치 전 Android가 저장될 가상 디스크를 만들어야 겠죠? 예전 VirtualBox - 하드 디스크 추가 와 같이 가상 디스크를 만듭니다. 용량은 클 필요가 없겠죠? ㅎㅎ 저는 대략 2기가 할당을 했고 가상 시디롬은 위에서 준비해 두었던 시디를 선택합니다.

시디 굽기도 아깝다면 CD/DVD 장치에서 직접 iso 파일을 불러올수 있습니다. 시디 굽기 보단 이게 더 좋은 방법입니다.



모든 준비를 마무리 하고 가상 머신을 시작합니다.
짜짠~ 하고 화면이 나오죠 ㅎㅎ
가상 디스크에 설치할 거니 마지막 메뉴 'Installation ...'을 선택합니다. 나머진 그냥 일사천리에요.중간에 가상 디스크를 포멧하는 절차가 있지만 어렵지 않습니다.
New -> Primary -> 용량 입력없이 그냥 엔터

만들어진 디스크에 Bootable을 한번 눌러 Flags에 활성화를 해 주고 Write를 선택해 줍니다. 무언가 작업 후 Quit를 선택 합니다.(화면에 조금 깨져서 나올지도 몰라요.) 그럼 아까와 다르게 설치할 수 있는 하드 디스크가 잡히게 되고 해당 디스크를 선택해 주면 설치는 끝납니다. 참 format 옵션은 ext3로 하세요.
잠시 기다리고 재 부팅할때 적절히 Android 시디(혹은 iso 이미지)를 제거해주면 설치 끝!

위와같이 안드로이드로 실행되면 모든것이 OK~
다만 버전이 낮고(1.6) 3G 망이 아닌 인터넷으로만 동작하다 보니 몇몇 어플이 정상 실행이 되지 않습니다. 우선 오늘은 여기까지 ㅎ

출처 : http://namomo.egloos.com/4807713

+ Recent posts