2010년 1월 12일 화요일

괜찮은 기능 ContentObserver

ContentObserver 라는 것이 있다.

 

안드로이드 관련 책에서는 ContentProvider의 사용에 대해서만 알려주는데

 

ContentObserver가 빠진 ContentProvider는 팥없는 찐빵이나 다름 없다.

 

그러면 ContentObserver 가 뭐하는거냐 하면...

 

ContentProvider를 사용할때 마다 사용되었음을 알려주는 콜백이다.

 

먼저 다음과 같은 클래스를 하나 만들고

 

private class MyContentObserver extends ContentObserver{

.....

  public void onChange(boolean selfChange) {
   updateFromProvider();//뭔가 변경점이 있을때 마다 처리할 루틴
  }
}

 

import mycontentobserver;

MyContentObserver  mObserver = new MyContentObserver();

 

사용할 Activity의 OnCreate 쯤에

 

mObserver = new MyContentObserver();

getContentResolver().registerContentObserver(XXX.CONTENT_URI,true,mObserver);

해주면 된다.

 

그러면 해당 ACTIVITY가 살아 있는동안 CONTENT_URI에 해당하는 작업이 발생하면 updateFromProvider()가 호출 될 것이다.

 

OnDestroy 에는 다음과 같이 등록 해제 코드 넣어주는것을 잊지 않는다.

 

getContentResolver().unregisterContentObserver(mObserver);

 

등록할때 두번째 인자가 false 이면 CONTENT_URI가 정확하게 일치 하는경우에만 호출 된다.

 

등록에 사용한 CONTENT_URI가  content://aaa.bbb.ccc/ddd 일때

getContentProvider.update( content://aaa.bbb.ccc/ddd/1 , values) 가 호출되면

true 일때는 updateFromProvider가 호출 되고 false면 호출 되지 않는다.

 

서비스를 만들때 등록해서 사용하면 좋다.

2009년 12월 28일 월요일

Parcelable을 사용할때 주의점

1. read와 write 순서를 주의한다.

2. 멤버 변수로 boolean은 사용하지 않는다.

3. boolean은 byte또는 int로 변환해서 캐스팅 할수 있게 수정한다.

public class TestPacel implements Pacelable {

    boolean _Example;

    public boolean is_Example(){

        return _Example;

    }

    public void set_Example(boolean example){

        _Example = example;

    }

}

이것을 다음과 같이 변형한다.

 

public class TestPacel implements Pacelable {

    byte _Example;

    public boolean is_Example(){

        if ( _Example == 0 ) {

            return false;

        }

        return true;

    }

    public void set_Example(boolean example){

        if ( example == false ) {

                _Example = 0;

        }else{

                _Example = 1;

        }

    }

}

 

 

4. Message의 setData에 Parcel을 추가 하지 않는다.

Message msg = new Message();

msg.what = CMD_TEST

Bundle data = new Bundle();

data.putParcel("xxxx",yyyyy);

msg.setData(data);

Intent targetIntent = new Intent( blahblah_receiver);

targetIntent.putExtra("EXTRA_MSG",msg);

sendBroadcast(targetIntent);

 

이렇게 데이터 전달을 하게 되면 받는 곳에서 마샬링 에러가 뜬다.

(android 1.6까지 해당)

 

이렇게 바꾸면 문제 없다.

 

Message msg = new Message();

msg.what = CMD_TEST

Bundle data = new Bundle();

data.putParcel("xxxx",yyyyy);

Intent targetIntent = new Intent( blahblah_receiver);

targetIntent.putExtra("EXTRA_MSG",msg);

targetIntent.putExtra("EXTRA_DATA",data);

sendBroadcast(targetIntent);

 

리시버쪽에서는

public void onReceive(Context context, Intent intent) {

 

    Message msg = intent.getParcelableExtra("EXTRA_MSG");
    Bundle data = intent.getParcelableExtra("EXTRA_DATA");

    msg.setData(data);

    process(msg);

}

요런식으로 처리 하면 된다.

2009년 9월 30일 수요일

리눅스 파일 찾기

$find . -name 찾을파일

현재 폴더 아래에서 *.h 인 파일을 전부 찾으려면
$find . -name *.h

현재 폴더 아래에서 *.h 인 파일에서 CONFIG_가 들어가있는 것을 찾을려면
$find . -name *.h|xargs egrep -e CONFIG_

이러면 되더라...

2009년 9월 29일 화요일

리모트 디버깅

virtual Box 상의 이미지 또는 실기와 리모트 디버깅 하기

모두 wifi또는 lan으로 네트웍 연결이 되어 있어야 한다.

adb가 동작하는 PC와 같은 서브넷에 들어 있어야 한다.

Windows Command Prompt 상에서

SET ADBHOST=<버츄얼 박스 또는 실기 IP> 한 다음

tools>adb kill-server
tools>adb devices

하면 장치가 잡힌다.

물론 안드로이드에 adbd가 떠 있어야 한다. (당연한건가..)

2009년 9월 16일 수요일

프로세스당 메모리 할당(?)

각 프로세서당 16MB 가 최대 사용할수 있는 메모리이다.

뭔가 좀 크게 만들려면 JNI를 통해 메시지를 주고 받던가 해야 할것 같다

SD CARD 이미지 만들기

SDK_PATH/tools 폴더에 mksdcard 라는 실행 파일이 있다.

$./mksdcard 128M sdcard.img라고 해 주면 128메가 SD카드 이미지가 만들어진다.

안드로이드 SDK 1.6

어제 밤에는 없었던 안드로이드 SDK 1.6이 방금 사이트에 가보니 새로 올라 왔네요

ADT도 새로 올라왔고 뭐가 변한건지 한번 확인해 봐야 겠습니다.

이클립스용 플러그인 ADT도 업데이트 되었습니다.

이클립스에서 Install new Software 를 통해 업데이트 하면 됩니다.

업데이트 하면 기존의 AVD Manager메뉴가 약간 바뀝니다.

그리고 1.1 버전을 지원하지 않게 됩니다.