iterator 사용시에 iterator 구동되는 동안에 insert, update, delete 를 시도하면 ConcurrentModificationException 이 발생합니다.

iterator 가 부모의 내용이 변경되지 않는 것을 전제로 하기 때문인데, 이 때 Iterator 로 빼낼 객체의 clone 을 만들어서 사용하면 해결됩니다.

Iterator it = ((ArrayList<String>)list.clone()).iterator();
while(it.hasNext()) {
    it.remove();
}


Posted by 행복한 프로그래머 궁금쟁이박

댓글을 달아 주세요

  1. 스파게티코더 2011.01.07 22:25  댓글주소  수정/삭제  댓글쓰기

    clone을 하면 deep copy를 하는 것인가?
    아니면 인스턴스의 레퍼런스만 추가하는거?

  2. BlogIcon 박상구 2011.01.11 13:06  댓글주소  수정/삭제  댓글쓰기

    얘기했듯이 셸로우 카피 인가벼.ㅎ

  3. 지나가던 공돌이 2011.07.26 10:31  댓글주소  수정/삭제  댓글쓰기

    덕분에 에러를 하나 해결했습니다. 감사합니다.

  4. BlogIcon 피의화요일 2011.12.22 11:01 신고  댓글주소  수정/삭제  댓글쓰기

    상현아 올만이다.
    오류 난거 찾다보니 네 블로그까지 왔구나 ㅋㅋㅋㅋ

  5. BlogIcon Gucci Guccissima 2012.08.21 16:54  댓글주소  수정/삭제  댓글쓰기

    이 문서는 위대한 작성

  6. 장원준 2012.10.01 16:11  댓글주소  수정/삭제  댓글쓰기

    http://docs.oracle.com/javase/tutorial/collections/interfaces/collection.html
    iterator.remove 를 쓰는게 정석이라고 나오는 구만 ^-^

  7. BlogIcon sweertate 2013.07.02 19:30  댓글주소  수정/삭제  댓글쓰기

    sdfsdfsdfsdfsdfsdfsdfsdfsdf

  8. BlogIcon sweertate 2013.07.04 00:59  댓글주소  수정/삭제  댓글쓰기

    For anybody who values comfort over glamour, flip flops are heaven-sent. No other type of footwear is more comfortable. They are available in every color and can be made out of any material. You can have a pair to use at home, and more classy ones for social engagements.
    Past designs of flip flops were not very foot-friendly. A wearer would often need a few weeks to get used to a pair. Fortunately, modern footwear manufacturers have incorporated comfort in their designs making flip flops more popular. They can now be found in homes throughout out the world.
    Being easy to slip-on and off is just one of the lovely attributes of flip flops. It doesnt matter if they get wet and they allow women to show off their newly painted toenails. Their popularity has prompted almost all footwear companies to manufacture them.
    Some expensive models are available for brand-conscious individuals and some less costly models are available for thrifty costumers. It all depends on you; you can wear what kind of flip flops that satisfy your taste. But no matter how much they cost, they are still adored by countless consumers.
    It would be wonderful if society allowed people to wear flip flops whenever and wherever they went to. Unfortunately they are not allowed at workplaces and are considered to be informal by fashion authorities, limiting the places where you can wear them. I think that our feet would really appreciate it we could wear them more often.
    If you walk through any department store or shoe store and you notice the tons of sandals available. You'll notice that flip flops come in every color and material, which you could easily view in display in most living rooms. They may vary in price range and but are still a girls best friend.

트리거

Programming/GoogleAndroid 2010. 11. 19. 17:52

요즘 대세인 안드로이드 폰의 google backup 동작을 위해서 폰 최초 부팅시 Google setup wizard 에서 트리거를 생성한다고 하네요...


Posted by 행복한 프로그래머 궁금쟁이박

댓글을 달아 주세요

  1. BlogIcon prada wallet 2012.08.17 15:36  댓글주소  수정/삭제  댓글쓰기

    아직 RC버전이지만 다양한 종류의 기능들이 많이 생겼으니 틈틈이 프리뷰를 하도록 하겠습니다 -

  2. BlogIcon hermes bags 2012.09.11 17:17  댓글주소  수정/삭제  댓글쓰기

    私はちょうど地区の後にエルメスのレプリカ4分の1を愛して

  3. BlogIcon Rolex DateJust 2013.01.22 16:53  댓글주소  수정/삭제  댓글쓰기

    당신의 기사에서 아이디어를 잡을 수있어 기뻐요. 내가 오랫동안 검색되었습니다 정보가 있습니다.


Low memory killer란 녀석이 내부적으로 움직이면서 메모리가 부족하면 운영체제 내부의 우선순위 알고리즘에 의해 프로세스를 죽인다.

리눅스 커널은 프로세스의 요청을 위한 할당을 위해서 남은 메모리가 없는 상황을 위한 OOM(Out of Memory) 킬러를 가지고 있다. 그 것은 모든 프로세스를 시험하고 어떤 제약으로 점수를 매깁니다. 최고 점수의 init을 제외한 프로세스는 죽여버린다.

안드로이드의 Low Memory Killer는 OOM 킬러와 약간 다르다. 그 것은 그룹의 중요성에 따라 프로세스를 분류하고 가장 낮은 그룹의 프로세스를 죽인다. 그 것은 시스템을 최종 사용자(end user) 관점에서 안정적이게 만든다. 예를 들면, UI 프로세스 - foreground process -는 최종 사용자에게 가장 중요한 프로세스이다. 그래서 프로세스를 지키는 것은 다른 background 프로세스의 삶을 지키는 것보다 더 안정적으로 보이는 것을 살린다.

Posted by 행복한 프로그래머 궁금쟁이박

댓글을 달아 주세요

안드로이드 String 리소스는 int 형의 id 를 통해 사용한다.

이 id 를 통해 진짜 value 를 얻어오고 싶을 때가 있다...

그럴 땐 간단하게 getString(resId) 하면 된다.ㅋㅋ

ex.) String msg = getString(R.string.message);


Posted by 행복한 프로그래머 궁금쟁이박

댓글을 달아 주세요

  1. BlogIcon Loewe bag 2012.09.04 15:51  댓글주소  수정/삭제  댓글쓰기

    쌀대란 해결을 위한 고창군 농민총회 개최

출처 : http://www.samsungblogs.com/20

역시 주말 출근(운영자주 : 이 글이 원래 작성된 시점은 4월 4일 입니다) 은 기분이 참 꿀꿀하네요. 일이 있어서 출근 하긴 하지만, 업무의 효율이나 가족들을 위해서라도 가급적 주말 근무는 안하는 것이 좋을 것 같습니다.
오늘은 주말 출근을 하게 만든 원흉... Android 에 대해서 글 하나를 써볼까 합니다. ^-^


++++++++++++++++++++++++++++++++++++++++

요즘 Motorola, LG 에서도 안드로이드 폰을 국내에서 출시하며, IPhone 대항마의 역할로써 안드로이드 폰이 어느 정도 자리를 잡아가고 있는 것 같죠?
TV만 보고 있어도 하루에도 여러 번씩 SKT 안드로이드 폰 광고를 볼 수도 있고요.
오늘은 안드로이드에 대한 재밌는 상식 하나를 소개할까 합니다.

아시는 분도 계시겠지만, Anroid 플랫폼의 버젼명은 디저트 종류 음식 이름을 애칭으로 가지고 있습니다.
최초 버젼인 1.5 는 Cupcake(컵케익), 1.6 은 Donut(도넛), 최근의 2.0 버젼이후 2.1까지는 Eclair(이클레어) 라고 불리고 있죠.
2010년 5월경 출시될 다음 버젼 이름은 Froyo(프로요 : Frozen Yogurt)가 확정된 상태입니다.



Froyo 의 다음 버젼은 Gingerbread(진저브레드)라는 것도 거의 확정인 상태이지요.



딱 보고 감이 오시나요?
Cupcake
Donut
Eclair
Froyo
Gingerbread


Cupcake 을 시작으로 닉네임의 제일 첫글자는 알파벳 순서로 증가하고 있습니다.
아마 Gingerbread 다음 버젼은 H 로 시작하는 디저트 이름이 닉네임으로 붙게 되겠지요? H 로 시작하는 디저트가 뭐가 있을까요?
H 로 시작하는 음식 이름도 Hotdog, Hamburger 를 제외하면 딱히 생각이 안나는 군요... ^^ 여러분들이 한 번 맞춰 보도록 하세요~

아래는 구글의 PM 인 Ryan Gibson 이 라디오 방송에서 얘기한 Andorid Version 에 대한 이야기 입니다.

Q: How did Android versions come to be named after desserts?
A: We wanted an alphabetical naming scheme that would also provide a fun theme for our small release celebrations. We considered predatory animals, and stomach viruses but they are a lot less fun to have at a party.

Q: What were the "A" and "B" desserts? Apple crumb? Babka?

A: There actually were no "A" and "B" software updates named after a dessert. It just started with Cupcake.

Q: Who determines the dessert names?
A: It's a collaborative effort from the entire team, company, spouses, Google chefs, random passer-bys
and the Android development community all throwing out ideas and recipes. My office door is festooned with suggestions for the future. &nbsp;It is very motivational to look up from work and see pictures of tasty treats.

Q: Are the desserts actually served at the Google cafeteria at any point?
A: Absolutely!

Q: Have you determined any desserts past "F"?
A: The discussion is as heated as an oven full of cupcakes &nbsp;We would like to have a Gingerbread House, but that depends a lot on what happens with the housing market by then.


※ 우리는 일반적으로 Phone 의 버젼명에 의미없는 숫자나 날짜를 기반으로 한 버젼명을 사용하는데요.
버젼명 만 봐도 구글 참 멋지죠~~ 힘든 개발 환경속에서의 이런 사소한 잔 재미를 찾고 만들어 실행하는 것이 구글의 창의적인 결과물의 원동력의 일부라고 봐도 되겠지요??

※ 이런식의 작명법은 Ubuntu 의 Project가 원조라고 하네요.














 글 / 취재 박근형 선임 (삼성전자)
Posted by 행복한 프로그래머 궁금쟁이박

댓글을 달아 주세요

  1. BlogIcon louis vuitton monogram 2012.09.05 15:52  댓글주소  수정/삭제  댓글쓰기

    이 문서가 잘 작성되어, 매우 좋아, 난 당신이 더 나은 글을 쓰고 다음 번 바랍니다.

  2. BlogIcon timberland españa 2012.12.24 12:53  댓글주소  수정/삭제  댓글쓰기

    People Micha, http://www.timberlandbaratas.com Timberland? précisant que l'enfant, http://www.timberlandbaratas.com Timberland Online, et d'une offre quadruple play DartyBox en juin 2011, http://www.timberlandbaratas.com botas timberland,000 Kinect vendus en France , http://www.timberlandbaratas.com zapatos timberland!
    Related articles:


    http://www.i5wan.com/plus/view.php?aid=93931 http://www.i5wan.com/plus/view.php?aid=93931

    http://armedwarfare.lp.pl/index.php?topic=340925.msg392990#msg392990 http://armedwarfare.lp.pl/index.php?topic=340925.msg392990#msg392990

    http://bbs.asp126.com/thread-34601-1-1.html http://bbs.asp126.com/thread-34601-1-1.html

GED

Programming/GoogleAndroid 2010. 4. 5. 12:31

안드로이드에서 GED란...

GED - Google Experience Device

참고.. GMS..

Google Mobile Service
Posted by 행복한 프로그래머 궁금쟁이박

댓글을 달아 주세요

<EditText android:id="@+id/edtInput" 
 android:layout_width="0dip" 
 android:layout_height="wrap_content" 
 android:layout_weight="1"
 android:inputType="textShortMessage|textAutoCorrect|textCapSentences|textMultiLine" 
 android:imeOptions="actionSend|flagNoEnterAction" 
 android:maxLines="4" android:maxLength="2000" 
 android:hint="@string/compose_hint"/>

imeOptions 로 done, next, send 버튼 등을 결정할 수 있다.


Posted by 행복한 프로그래머 궁금쟁이박

댓글을 달아 주세요

  1. BlogIcon repair iphone 2011.06.15 21:27  댓글주소  수정/삭제  댓글쓰기

    좋은 글 잘 보고 갑니다. 다음에도 또 좋은 글 기대 할께요. 퍼가도 되죠?

  2. BlogIcon louis Vuitton outlet 2012.09.07 16:57  댓글주소  수정/삭제  댓글쓰기

    블로그 랭킹에 들어있는 인기블로거들에 대해서 1년전 쯤 포스팅

암시적 인텐트를 사용해봅니다.

이것은 주로 어플리케이션 간에 인텐트를 파이어할 경우 사용합니다.

암시적 인텐트를 사용하기 위해서는 수신측 액티비티에서 인텐트 필터가 필요합니다.

그리고 인텐트 필터는 반드시 android.intent.category.DEFAULT 를 포함해야 합니다.

세개의 APP 를 만들었습니다.

A :  인텐트 파이어
B : 인텐트 수신 

A 코드

public class IntentTestA extends Activity {
private Button buttonB;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.main);
        buttonB = (Button)findViewById(R.id.fireButtonB);
        buttonB.setOnClickListener(new View.OnClickListener() {
        
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Intent intent = new Intent("com.sh.android.testB.DEFAULT");
//intent.setClassName("com.sh.android.testB", "com.sh.android.testB.IntentTestB"); 명시적 인텐트로
/// 다른 어플리케이션으로 인텐트를 파이어할 수도 있다.
intent.putExtra("From", "A");
startActivity(intent);
}
});
      
        
    }
    
    
}

B 코드

public class IntentTestB extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        String test;
        if((test = getIntent().getStringExtra("From")) != null) {
         Toast t = Toast.makeText(getApplicationContext(), test, Toast.LENGTH_SHORT);
        
         t.show();
        }
    }
}

B 의 AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      android:versionCode="1"
      android:versionName="1.0" package="com.sh.android.testB">
    <application android:icon="@drawable/icon" android:label="@string/app_name">
        <activity android:name=".IntentTestB"
                  android:label="@string/app_name">
           
       <intent-filter>
          <action android:name="com.sh.android.testB.DEFAULT"></action>
        <category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>

    </application>
    <uses-sdk android:minSdkVersion="5" />

</manifest> 

메니페스트에서 볼 수 있듯이 DEFAULT 카테고리를 포함하고 액션을 지정해 주고 

파이어하는 쪽 ( A ) 에서 저 액션을 파라미터로 넣어서 인텐트를 생성하면 됩니다.

추가적으로 테스트 해 본 것이 다른 어플리케이션이지만 패키지이름과 액션이름이 같을 때입니다.

그럴 때는 해당 액션을 넣어서 인텐트를 날리면 두 애플리케이션 중 선택할 수 있는 메뉴를 띄어 줍니다.


Posted by 행복한 프로그래머 궁금쟁이박

댓글을 달아 주세요

  1. BlogIcon louis Vuitton replica 2012.09.07 16:57  댓글주소  수정/삭제  댓글쓰기

    블로그 랭킹에 들어있는 인기블로거들에 대해서 1년전 쯤 포스팅

출처 : http://blog.naver.com/osk1004?Redirect=Log&logNo=50069078782


==========================================================================================

원문 : http://letsgoustc.spaces.live.com/?_c11_BlogPart_BlogPart=blogview&_c=BlogPart&partqs=amonth%3d12%26ayear%3d2008

[First written by Steve Guo, please keep the mark if forwarding.]

Input Event Detect and Dispatch

input event dispatch engine 은 WindowManagerService.java 안에 위치한다.

WindowManagerService.java 는 KeyInputQueuq.java 로 부터 input event 를 read 하기 위한 하나의 thread 를 생성한다.

그리고, 그 event 를 binder 를 통해서 현재 focus 가 있는 window 로 dispatch 시키는 일을 한다.

                // Retrieve next event, waiting only as long as the next

                // repeat timeout.  If the configuration has changed, then

                // don't wait at all -- we'll report the change as soon as

                // we have processed all events.

                QueuedEvent ev = mQueue.getEvent(

                    (int)((!configChanged && curTime < nextKeyTime)

                            ? (nextKeyTime-curTime) : 0));

input event 가 읽어 지면,  input event type 을 결정한다.현재는 3개의 input event type 을 지원한다.

1. Key

2. Trackball

3. Pointer

binder 를 통해 현재 fucus 를 가지고 있는 window 로 event type 에 매핑되는 dispatch fucntion 을 호출한다.(아~ 해석이 어색하다)

 

key event 를 예를 들면, 아래의 code 를 호출하게 된다.

            focus.mClient.dispatchKey(event); 

 

가장 아랫단에서,  Android 는 Linux input device 로 부터 실제 input event(keyboard,mouse,touch 등)를 읽어들인다.

그에 상응하는 소스는 EventHub,cpp 이다.

Key input event 를 위해서, Android 는 key lyout map file로 부터 key code 를 scen 한다.

OEM 회사들은 필요하다면, 그들의 device 에 match 시키기 위해 key lay map file 을 customize 할 필요가 있다.

그것은 key layout map file 에서 찾기 위해 아래 함수를 이용한다.

 

        // a more descriptive name

        ioctl(mFDs[mFDCount].fd, EVIOCGNAME(sizeof(devname)-1), devname);

        devname[sizeof(devname)-1] = 0;

        device->name = devname;

 

        // replace all the spaces with underscores

        strcpy(tmpfn, devname);

        for (char *p = strchr(tmpfn, ' '); p && *p; p = strchr(tmpfn, ' '))

            *p = '_';

 

        // find the .kl file we need for this device

        const char* root = getenv("ANDROID_ROOT");

        snprintf(keylayoutFilename, sizeof(keylayoutFilename),

                 "%s/usr/keylayout/%s.kl", root, tmpfn);

        bool defaultKeymap = false;

        if (access(keylayoutFilename, R_OK)) {

            snprintf(keylayoutFilename, sizeof(keylayoutFilename),

                     "%s/usr/keylayout/%s", root, "qwerty.kl");

            defaultKeymap = true;

        }

        device->layoutMap->load(keylayoutFilename);

 

OEM 은 Android가 booting 하는 동안, key layout map file 이름을 가져올수 있다. 왜냐하면, Android 는 그 file name 을 기록할것이기 때문이다.

Java layer 단의 wrapper 는 WindowManagerService.java 에서 사용되어지는  KeyInputQueue.java 파일이다.

그것은 JNI 를 통해 EventHub.cpp 를 호출한다. com_android_server_KeyInputQueuq.cpp 는 JNI implementation 파일이다.

 

Input Event Processing

ativity 가 launch 되어질때, ActivityManagerService.java 는 activity 를 생성하기 위해서 ActivityThread.java 를 호출한다.

                activity.attach(appContext, this, getInstrumentation(), r.token, app,

                        r.intent, r.activityInfo, title, r.parent, r.embeddedID,

                        r.lastNonConfigurationInstance, config);

 

그러고 나서 Activity.java 가 activity 를 표시하기 위해 PhoneWindow.java 의 intance 를 생성한다. 각각의 PhoneWindow.java 는 activity 내의 view 들에 대한 Root 로써 DecorView.java 의 instance 를 포함하고 있다.

        mWindow = PolicyManager.makeNewWindow(this);

        mWindow.setCallback(this);

 

Activity 가 생성된 후에, Activity 를 resume 시키기 위해 ActivityManagerService.java 는 ActivityThread.java 를 호출한다.

이때, ActivityThread.java 는 DecorView.java 의 instance 를 add 시키기 위해서 WindowManagerImpl.java 를 호출한다.

                r.window = r.activity.getWindow();

                View decor = r.window.getDecorView();

                decor.setVisibility(View.INVISIBLE);

                ViewManager wm = a.getWindowManager();

                WindowManager.LayoutParams l = r.window.getAttributes();

                a.mDecor = decor;

                l.type = WindowManager.LayoutParams.TYPE_BASE_APPLICATION;

                wm.addView(decor, l);

 

WindowManagerImpl.java 는 ViewRoot.java 의 instance 를 생성한다. ViewRoot.java 는 각각의 process 에서 오직 한번만 initialize 되는 static member 를 가진다.

그것은 WindowManagerService.java 에게 현재 link 된 process 가 있는지 여부를 알려줄때 사용되어진다.

            if (!mInitialized) {

                try {

                    sWindowSession = IWindowManager.Stub.asInterface(

                            ServiceManager.getService("window"))

                            .openSession(new Binder());

                    mInitialized = true;

                } catch (RemoteException e) {

                }

            }

 

ViewRoot.java instance 가 생성된 이후에, WindowManagerImpl.java 는 ViewRoot.java 를 binding 하기 위해 DecorView.java 에 대해 setView API 를 호출한다.

        // do this last because it fires off messages to start doing things

        root.setView(view, wparams, panelParentView);

 

setView API 안에서, 마침내 ViewRoot.java 는 DecorView.java 를 그리게 된다. 그리고 IWindow instance 를 WindowManagerService.java 에 register 시킨다.  

                    res = sWindowSession.add(mWindow, attrs,

                            getHostVisibility(), mCoveredInsets);

 

그이후에, WindowManagerService.java 는 ViewRoot.java 내에서 이 IWindow instance 와 직접적으로 통신한다.( Dispatching input event 를 포함해서...)

그러면, ViewRoot.java 는 input event 를 처리하기 위해서 View.java 를 호출한다.

Key event 를 예를 들면, View.java 안에 있는 dispatchKeyEvent() API 가 호출될 것이다.

    public boolean dispatchKeyEvent(KeyEvent event) {

        // If any attached key listener a first crack at the event.

        //noinspection SimplifiableIfStatement

        if (mOnKeyListener != null && (mViewFlags & ENABLED_MASK) == ENABLED

                && mOnKeyListener.onKey(this, event.getKeyCode(), event)) {

            return true;

        }

   

        return event.dispatch(this);

    }

 

만약 어떤 Key listener 가 이 view 에 register 되어져 있다면, View.java 는 그것을 찾는다.

Key listener 가 있다면, 그 key event 는 그 Key listener 에 의해 처리되어질 것이다.

그렇지 않으면,  대개 OnKeyDown/OnKeyUp 을 호출하게 된다.

 

모든 Key listener 구현은 frameworks/base/core/java/android/text/metod 에 있다.

 

MultiTapKeyListener.java     -    keypad 가 NUMERIC 면, 이 listener 는 숫자입력을 문자로 변환할것이다.

QwertyKeyListener.java        -     keypad 가 QWERTY 면, 이 listener 가 사용된다.

 

 

 

=============================================== 원 문 ===============================================

[First written by Steve Guo, please keep the mark if forwarding.]

Input Event Detect and Dispatch

The input event dispatch engine is in WindowManagerService.java. WindowManagerService.java creates a thread to read input event from KeyInputQueue.java and dispatches the event to the window which has current focus through binder.

                // Retrieve next event, waiting only as long as the next

                // repeat timeout.  If the configuration has changed, then

                // don't wait at all -- we'll report the change as soon as

                // we have processed all events.

                QueuedEvent ev = mQueue.getEvent(

                    (int)((!configChanged && curTime < nextKeyTime)

                            ? (nextKeyTime-curTime) : 0));

If an input event is read, it judges the input event type. Currently support three input event types: key, trackball and pointer. Then according to event type call corresponding dispatch function to the window which has current focus through binder. For example, for key event, it calls the following code.

            focus.mClient.dispatchKey(event);

At the lowest level, Android reads the real input event (keyboard, mouse or touch) from Linux input device. The corresponding source code is EventHub.cpp. For key input event, Android maps scan code to key code according to a key layout map file. OEM needs customize the key layout map file to match the needs of his own device. It uses the following method to find out the key layout map file.

        // a more descriptive name

        ioctl(mFDs[mFDCount].fd, EVIOCGNAME(sizeof(devname)-1), devname);

        devname[sizeof(devname)-1] = 0;

        device->name = devname;

 

        // replace all the spaces with underscores

        strcpy(tmpfn, devname);

        for (char *p = strchr(tmpfn, ' '); p && *p; p = strchr(tmpfn, ' '))

            *p = '_';

 

        // find the .kl file we need for this device

        const char* root = getenv("ANDROID_ROOT");

        snprintf(keylayoutFilename, sizeof(keylayoutFilename),

                 "%s/usr/keylayout/%s.kl", root, tmpfn);

        bool defaultKeymap = false;

        if (access(keylayoutFilename, R_OK)) {

            snprintf(keylayoutFilename, sizeof(keylayoutFilename),

                     "%s/usr/keylayout/%s", root, "qwerty.kl");

            defaultKeymap = true;

        }

        device->layoutMap->load(keylayoutFilename);

OEM can get the key layout map file name during Android booting, because Android will log the name. The JAVA layer wrapper is KeyInputQueue.java which is used by WindowManagerService.java. It calls EventHub.cpp through JNI. com_android_server_KeyInputQueue.cpp is the JNI implementation.

 

Input Event Processing

When an activity is to be launched, ActivityManagerService.java calls ActivityThread.java for creating the activity.

                activity.attach(appContext, this, getInstrumentation(), r.token, app,

                        r.intent, r.activityInfo, title, r.parent, r.embeddedID,

                        r.lastNonConfigurationInstance, config);

Then Activity.java creates a PhoneWindow.java instance to represent the activity. Each PhoneWindow.java contains a DecorView.java instance as the root of any views in the activity.

        mWindow = PolicyManager.makeNewWindow(this);

        mWindow.setCallback(this);

After an activity is created, ActivityManagerService.java calls ActivityThread.java for resume the activity. At this time, ActivityThread.java calls WindowManagerImpl.java to add the DecorView.java instance.

                r.window = r.activity.getWindow();

                View decor = r.window.getDecorView();

                decor.setVisibility(View.INVISIBLE);

                ViewManager wm = a.getWindowManager();

                WindowManager.LayoutParams l = r.window.getAttributes();

                a.mDecor = decor;

                l.type = WindowManager.LayoutParams.TYPE_BASE_APPLICATION;

                wm.addView(decor, l);

WindowManagerImpl.java news a ViewRoot.java instance. ViewRoot.java has a static member which will be only initialized once for each process. It’s used to let WindowManagerService.java know that there is a process linked now.

            if (!mInitialized) {

                try {

                    sWindowSession = IWindowManager.Stub.asInterface(

                            ServiceManager.getService("window"))

                            .openSession(new Binder());

                    mInitialized = true;

                } catch (RemoteException e) {

                }

            }

After ViewRoot.java instance is created, WindowManagerImpl.java calls its setView API to bind the ViewRoot.java for the DecorView.java.

        // do this last because it fires off messages to start doing things

        root.setView(view, wparams, panelParentView);

In setView API, ViewRoot.java finally draws the DecorView.java and registers an IWindow instance to WindowManagerService.java.

                    res = sWindowSession.add(mWindow, attrs,

                            getHostVisibility(), mCoveredInsets);

After that WindowManagerService.java directly communicates (including dispatching input event) with this IWindow instance in ViewRoot.java. Then ViewRoot.java calls View.java to process input event. For example, for key event, dispatchKeyEvent API in View.java will be called.

    public boolean dispatchKeyEvent(KeyEvent event) {

        // If any attached key listener a first crack at the event.

        //noinspection SimplifiableIfStatement

        if (mOnKeyListener != null && (mViewFlags & ENABLED_MASK) == ENABLED

                && mOnKeyListener.onKey(this, event.getKeyCode(), event)) {

            return true;

        }

   

        return event.dispatch(this);

    }

View.java detects if any key listener is registered for this view. If so, the key event will be handled by the key listener. Otherwise, it calls OnKeyDown/OnKeyUp as usual.

 

All the key listener implementations are under frameworks/base/core/java/android/text/method folder.

MultiTapKeyListener.java       - if the keypad is NUMERIC keypad, this listener is used to transform digit inputs to characters.

QwertyKeyListener.java – if the keypad is QWERTY keypad, this listener is used.

Posted by 행복한 프로그래머 궁금쟁이박

댓글을 달아 주세요

  1. BlogIcon rolex replica 2013.01.22 16:57  댓글주소  수정/삭제  댓글쓰기

    팁 주셔서 감사합니다, 아마도이 호리 호리한 내 순수 지성의 인식 작용 마케팅을 사용할 수 있습니다 그리고 상호 작용을 시도에 어떠한 인종의 미디어를 사용하고 있으며 사람들이 유효 그린 저에 큰 친근합니다.


출처 : http://www.aesop.or.kr/?document_srl=65021


=============================


http://android.git.kernel.org/?p=platform/development.git;a=blob;f=apps/SdkSetup/Android.mk;h=b89baaf8f5838fe4bf90b15ec22e654f395198ac;hb=master

 

 

development/apps/SdkSetup/Android.mk

 

파일의 중간에

 

LOCAL_MODULE_TAGS := foo

 

이렇게 한줄 써주면

 

out/target/product/generic/system/app/SdkSetup.apk

 

파일이 생깁니다.

 

즉, 이 파일이 생성된 android root filesystem image의 경우

 

keyquard가 동작하게 되며 homekey도 먹게 됩니다.

 

==============

 

다른 방법은 몇가지 더 있습니다만..........sqlite를 이용해서 db에 직접 써 넣는 방법

코드를 고치는 방법 등등이 있습니다.


Posted by 행복한 프로그래머 궁금쟁이박

댓글을 달아 주세요

  1. BlogIcon Mulberry replica handbags 2012.09.10 17:43  댓글주소  수정/삭제  댓글쓰기

    아침형 인간이 되려고 노력중입니다.
    쉽지만은 않네요.ㅋㅋ