피처폰급 기업문화...

Posted by ironmask84
2016. 3. 15. 15:08 생각과 일상/사회이슈 및 생각


아래 기사를 참고


대한상공회의소와 맥킨지가 지난 9개월간 국내기업 100개사, 4만여명의 임직원을 대상으로 한국 기업의 조직건강도와 기업문화를 종합진단한 결과가 나왔다.

15일 상의와 맥킨지가 발표한 '한국기업의 조직건강도와 기업문화 종합보고서'에 따르면, 국내기업의 조직건강은 글로벌기업에 견줘 '약체'로 평가됐다. 특히 중견기업 대다수가 글로벌기업에 비해 절대 약세인 것으로 드러났다.

조직건강도 진단은 맥킨지 조직건강도(OHI, Organizational Health Index) 분석기법을 활용했다. 리더십, 업무시스템, 혁신분위기, 책임소재 등 조직경쟁력에 영향을 미치는 제반사항을 평가·점수화해 글로벌 1800개사와 비교했다.

조사대상 100개사중 글로벌기업보다 약체인 기업은 최하위수준 52개사 포함, 77개사로 집계됐다. 중견기업은 91.3%가 하위수준으로 평가돼 조직건강에 적신호가 켜졌다. 반면 상위수준으로 진단을 받은 기업은 최상위 수준 10개사 포함 23개사에 그쳤다. 세부영역별 진단결과를 보면 Δ리더십 Δ조율과 통제(시스템) Δ역량 Δ외부 지향성 등 4개 영역이 취약한 반면, Δ책임소재 Δ동기부여 등 2개 항목은 우수한 것으로 확인됐다.

조직건강을 바라보는 경영진과 직원간 시각차도 뚜렷했다. 경영진은 자사의 조직건강을 최상위 수준(71점)으로 평가한 반면, 직원들은 최하위 수준(53점)으로 진단하며 상반된 인식을 보였다. 세부항목별로는 Δ리더십 Δ문화 및 분위기 Δ방향성 항목에서 큰 격차를 나타냈다.

지속적인 성과창출을 가능케 하는 차별적인 조직운영 모델을 뜻하는 '지속성장 DNA' 확보 여부를 조사한 결과에서는 '지속성장 DNA'를 갖고 있는 국내기업은 50%로 글로벌기업 66%보다 낮았다.

최원식 맥킨지 서울사무소 대표는 "우리 기업은 아직도 제조혁신 역량을 중시하고 선도기업 캐치업을 도전목표로 설정해 빠른 실행을 하는 기존의 성공방정식에 머물고 있는 것으로 해석된다"며 "급변하는 시장패러다임에 부응해 능동적인 변신과 다양한 사업기회 포착이 힘들다"고 지적했다.


© News1 최진모 디자이너

... 중략

출처는 아래와 같음.

http://news.naver.com/main/ranking/read.nhn?mid=etc&sid1=111&rankingType=popular_day&oid=421&aid=0001941270&date=20160315&type=1&rankingSeq=3&rankingSectionId=101




 

yes24 에서 문화상품권 이용하기

Posted by ironmask84
2016. 3. 10. 16:24 Excellent Tips


http://blog.naver.com/pureshower?Redirect=Log&logNo=220395901740

 

PreferenceActivity 와 Fragment

Posted by ironmask84
2016. 3. 10. 16:23 나는 프로그래머다!/Java & Android


http://blog.naver.com/xinfra/80172458285

http://mainia.tistory.com/2006

http://blog.naver.com/rlawlss/80140113577

http://nekomimi.tistory.com/483

http://mainia.tistory.com/2052

http://taehoonkoo.tistory.com/132

 

정보보안관련 좋은 레퍼런스 사이트

Posted by ironmask84
2016. 3. 3. 08:54 컴퓨터공학/Security


http://www.boannews.com/default.asp

-> 보안관련 뉴스


http://isms.kisa.or.kr/kor/intro/intro01.jsp

-> ISMS 인증제도


http://www.kisa.or.kr/public/laws/laws3.jsp 

-> kisa 정보보호 가이드

 

악성코드를 이용한 해킹의 종류 및 대처법

Posted by ironmask84
2016. 2. 15. 00:49 컴퓨터공학/Security




1. Stack Buffer overflow 공격

1) strncpy() 사용해서 버퍼만큼만 복사하거나, if문으로 문자열 크기 비교체크해서 복사하면 해결


    process가 메모리에 로딩되었을 때의 메모리 구조에는 몇몇의 영역으로 구분되어있다.

       이는 low address부터 나열하면 다음과 같은 순서이다.


       Code Area (실행코드 위치, 기계어)

       Data Area (초기화 된 정적변수 및 전역변수)

       BSS Area (초기화 되지 않은 정적변수 및 전역변수)

       Heap (동적메모리 할당)

       Stack (함수를 처리하기 위한 영역, 함수 내 로컬변수, 함수의 매개변수)

 

위 영역 중에 Stack 영역에서 Buffer overflow 를 이용한 공격방법은 아래와 같다.

 

예를들어 어떤 프로세스의 main함수에서 func() 함수를 호출될 때,

func() 함수 처리 후 돌아왔을 때 수행되어야할 주소 RET를 저장하고,

func() 함수를 기준으로 하기위해 기존의 main함수의 EBP 레지스터를 저장하고,

func() 함수의 로컬변수 등 처리를 위한 데이터들이 stack에 push/pop 되어가며 수행되다가

func() 처리가 끝나면, 위에서 저장했던 RET, EBP를 불러와서 기존 main함수로 되돌아 오게 된다.

 

위 과정에서 RET를 임의의 주소로 덮어쓸 수 있다면,

해커는 이를 악용해서 공격용 process를 미리 메모리에 로딩해놓고, 이 process의 주소로 덮어쓰게 하여,

새로운 shell을 root권한으로 실행하는 등의 행위로 root권한을 획득할 수 있게 된다.

 

위 공격을 하려면 2가지 조건이 전제되어야 한다.

1) 공격에 이용하려는 프로세스는 root 소유이고, setuid가 설정되어 있어야 한다.

2) 악용하기 위한 공격용 process를 미리 메모리에 로딩해놓아야 한다.

 

*  CPU에는 여러 레지스터가 있지만, 아래 3가지를 참고하자.

1) ESP : 스택 연산이 발생하는 스택 프레임의 최상위 포인터 (EBP를 기준으로 상대위치 의미)

2) EBP : 해당 스택 프레임의 베이스 포인터

3) EIP : 다음에 실행할 명령어의 주소값을 가지고 있다. (= Program Count)

 

 

2. Race Condition 공격

   1) A 프로세스가 /tmp 디렉토리에 tmp.dat 라는 파일을 생성하고 오픈해서 write를 한다고 하고,
      A프로세스가 root소유의 프로세스이고, tmp.dat 라는 파일에 root권한을 가지도록 setuid를 한다고 가정.

      이 시점을 캐치하여, 공격용 프로세스를 통해 tmp.dat라는 동일한 이름의 파일을 심볼릭 링크파일로 해서 
      /etc/shadow와 같이 중요한 파일에 링크를 건 파일을 생성시킨다.


   2) 위 과정에서 A 프로세스와 공격용 프로세스가 tmp.dat라는 파일을 누가 먼저 생성 시키는지의 race가 발생하게 된다.
      정상적인 경로를 통해 A 프로세스가 먼저 tmp.dat 파일을 생성시키면,
      공격용 프로세스는 이 파일을 지우고, 자신이 생성시킨 파일을 수행하도록 유도할 것이다.


  ** 여기서도 마찬가지로 공격에 이용하려는 A 프로세스는 root 소유이고, setuid가 설정되어 있어야 한다.

 

 

3. Format String 공격

   1) process가 메모리에 로딩되었을 때의 메모리 주소에 잘못된 데이터를 덮어씀으로 인한 공격
   2) printf 계열의 함수 사용 시 틀리지 않고 쓰면 해결, %n은 변수의 주소값 이다.




 

BroadcastReceiver 간단 정리

Posted by ironmask84
2016. 2. 1. 15:20 나는 프로그래머다!/Java & Android


안드로이드에는 BroadcastReceiver 라는 Callback 이벤트를 처리해주는 컴포넌트가 제공됩니다.


쉽게말해서, A라는 앱을 만들었는데, 

문자가 왔을 때 어떤 데이터를 받고 싶다던가 배터리가 50% 이하가 되었을 때 뭔가 변화를 주고 싶다고 한다면

SMS 앱이나 배터리체크 앱에서 어떤 이벤트를 데이터와 함께 날리게 되고,

A에서는 그 이벤트와 데이터를 받아서 원하는 기능을 처리하도록 할 수 있다는 것입니다.


위에서 언급한 이벤트처리를 복잡하지 않고 쉽게 처리해주는 녀석이 BroadcastReceiver 라는 컴포넌트 인 것입니다.


아래에 2가지 방법에 대한 예시를 올립니다.


1. BroadcastReceiver 클래스를 상속  (AppWidgetProvider 도 가능, 아마 BroadcastReceiver를 가지고 있겠지..)

   onReceive() 를 Override해서 기능 정의

   androidManifest.xml에 등록되어 있어야 함.

 androidManifest 이용해서 등록하면, 명시적으로 해제해줄 수는 없다. (unRegisterReceiver 불가능)
    (
onReceive() 메소드가 완료되면 가비지 컬렉션 대상이 되서 해지될지도... 언제 될지는 모름...)


   ex) <receiver android:name=".favorite.MissedCallWidget" >

            <intent-filter>

                <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />

                <action android:name="lge.intent.action.MISSED_CALLS" />

            </intent-filter>


            <meta-data

                android:name="android.appwidget.provider"

                android:resource="@xml/missed_call_widget_info" />



2. Actvity, Service, ContentProvider에 registerReceiver() 내에서 등록한다. 

   * onDestory() 에서 this.registerReceiver() 해줬던것을 해제가능 (메모리 누수 방지 효과도 있음)


ex) 이미 있는 action이 아니라, 새로 만든 custom action을 이용한 예시

public static final String ACTION_KEY_CODE = "com.ironmask.home.KEYCODE_ALERT";

private BroadcastReceiver mKeyCodeReceiver = null;


onCreate() 

{ .........

MyregisterReceiver();

  .........

}


onDestory()

{ ...........

    this.unRegisterReceiver(mKeyCodeReceiver);


MyregisterReceiver() {

if (mKeyCodeReceiver != null)

return;


        IntentFilter filter = new IntentFilter();

        filter.addAction(ACTION_KEY_CODE);


this.mKeyCodeReceiver = new BroadcastReceiver() {

       @Override

       public void onReceive(Context context, Intent keyintent) {

           String action = keyintent.getAction();


           if (ACTION_KEY_CODE.equals(action)) {

...

};

this.registerReceiver(this.mKeyCodeReceiver, filter);

}


미리 Broadcast를 제공하는 App에서 아래와 같이 수행해 놓으면, 위 Receiver가 동작!! 

(SMS, Call 등 이미 기본 안드로이드 App에서 제공되는 것들도 많다.)

Intent keyCodeAlert = new Intent("com.ironmask.home.KEYCODE_ALERT"); 

keyCodeAlert.putExtra("key_code", keyCode);


mContext.sendBroadcast(keyCodeAlert);


--> 위의 예시가 맞는지 다시 확인 필요...


즉, 2번 예시의 경우도, com.ironmask.home.KEYCODE_ALERT이라는 액션을 가진 Activity 내에서 
위의 과정이 있어야 한다...


 

2015년 서울장애인 IT챌린지

Posted by ironmask84
2016. 1. 29. 16:16 생각과 일상/봉사생활


2015년 7월에 매해 열리는 서울장애인 IT챌린지가 있었습니다.

회사에서 많이 후원하는 봉사활동이어서, 자원신청하여 참가하였죠.


하는 업이 IT관련이며, 이를 이제는 사명으로 생각하고 있기에
사회에 조금이나마 공헌도 하고 싶었습니다.


청각이 약하신분, 팔,
다리가 불편하신분, 뇌에 장애가 있으신분 등 다양한 분들이 참가하는 자리였습니다. :)
한글, 파워포인트, 인터넷 활용 능력이 주 대회였죠 ^^



대회에 몰두하는 모습이 보기좋습니다. ㅎㅎ


IT 대회 뿐 아니라, 장기자랑의 시간도 있었습니다. ^^



어디서 많이본 토끼와 곰이죠?


네이버에서 후원하는 상품들이 많았습니다.


IT챌린지 참여자들과 봉사자분들 단체 샷, 가운데 잘보시면 강원래씨가!!



IT라는 도구가 인류에 편리한 도구로써 활용되고, 악용되지는 않았으면 좋겠습니다.


 

3일차 (오전) - 도쿄탐험(4) 지브리박물관, 이노까시라온시 공원

Posted by ironmask84
2016. 1. 29. 12:57 해외여행/일본 - 2010



하루 온전히 자고 일어나니, 여독이 풀렸는지 상쾌하게 여행을 시작한 날이었다.
컨디션도 좋았고, 개인적으로 이번 여행에서 기대를 많이 했던 것이 지브리 박물관이었다.

그리고.. 그 기대를 충족시켜주었다! 
내부 사진을 못찍게 했던가..
아무튼 내부 사진은 없는데, 애니메이션이 어떻게 만들어지는지 굉장히 상세하고 재밌게 보여준다.

캐릭터 상품들을 사고 싶은 유혹이 많았는데, 가격이 쎄서 사지는 않았다..
(사실 이때, 갓 대학을 졸업해서 주머니 사정이..)


날 밤, 깨알같은 계획#1 (삼보 에버라텍 노트북..)



전날 밤, 깨알같은 계획#2 (와이파이가 잡혔던 숙소!)



평일 오전 미카타역으로 가는 열차안. 텅텅 비어있었다..


주위에 사람들이 없더니, 지브리박물관 가는 버스엔 줄이 꽤 서있었다...


어디서 많이본 고양이? :)


입구에선 더욱 많은 사람들이 줄서있다..


이거 국내에선 못구할뻔했는데,
같이 여행간 친구의 일본친구가 간단하게 편의점? 에서 예매 주었었다..




천공의 섬 라퓨타라고 하면 아시려나?


지브리박물관 옆 이노까시라온시 공원으로 가는 길 #1


지브리박물관 옆 이노까시라온시 공원으로 가는 길 #2


이노까시라온시 공원 #1


이노까시라온시 공원 #2



반말과 존댓말이 여전히 왔다리 갔다리 하네요..^^;;
지브리박물관은 일본여행을 다시 간다면, 한번 더 가보고 싶다고 생각된 곳 중에 하나입니다.

3일째 오후엔 아사쿠사로의 여행이 이어집니다..




 

2일차 (저녁) - 도쿄탐험(3) 오다이바

Posted by ironmask84
2016. 1. 29. 12:08 해외여행/일본 - 2010



아키하바라를 뒤로 하고, 오다이바로 이동합니다. ^^
모노레일을 타고, 바다풍경을 보며 열차가 달렸는데 사진은 없네요..;;


아키하바라를 떠나기 전, 전자제품 상점들을 여럿 둘러봤습니다.


이번 저녁도 간단히 규동으로...
자판기로 표를 뽑고 사먹었던 것 같은데, 일본은 자판기 문화가 발전한듯..
아기자기 하고 소소한 맛이 있다!


레인보우 브릿지 입니다.. 부산의 광안대교가 생각나네요..ㅋㅋ



요런 자유의 여신상 모조품도 있습니다. 중간엔 도쿄타워도 보이네요.


FUJI 티비 본사 입니다.
요건 먼가 계획은 했으나, 너무 늦어져 관광은 못했네요.


한인 민박집이 많은 오쿠보에서 숙소를 잡았습니다.
늦은 시간 가로등이 많고, 참 밝네요..


자기전에 야식을 먹을려고...ㅋㅋㅋ




겨울바다여서 꽤 추웠습니다.
야간 버스이동 후 첫날이라 많이 피곤했는데도, 첫 해외여행이라 열정이 가득!

3일째 도쿄여행은 지브리박물관, 이노까시라온시 공원, 아사쿠사, 롯뽄기 편입니다.. :)



 

2일차 (점심) - 도쿄탐험(2) 아키하바라

Posted by ironmask84
2016. 1. 29. 11:45 해외여행/일본 - 2010



와... 2010년에 여행 갔던 것을 2012년에 한번 쓰고, 근 4년이 지나고 다시 이어서 씁니다..
그 동안 블로그 관리가 띄엄띄엄이라, 반말했다 존댓말했다가 등등 많은 양해 부탁드립니다.

물론 현재 여기 블로그에 일본여행 사진을 보고싶어서 올 사람은 거의 없겠지만.. 그래도 다시 시작하려고 합니다..ㅋㅋ
여행 간지 6년이 지났으니.. 자세한 지역 명칭 등이 잘 기억나지 않네요.. 
약간은 대략적으로 포스트 해야겠습니다. ㅠㅠ

혹시나 이전 글 처럼 혹시, 누군가 이 블로그를 보고 정정해야될 명칭이 있다면 댓글 부탁드립니다. ㅡㅡ;




이 사진으로 감이 오실진 모르겠지만, 네.. 아키하바라 입니다.. :)
게이머즈라는 랜드마크격? 으로 보이는 건물이었습니다.

사실 학창시절동안 일본 게임과 애니메이션에 많은 영향을 받아왔었습니다.. (PC 게임, PS게임 등)
도쿄역에서 가깝기도 하고, 게임과 애니메이션의 본고장? 같기도 한 곳이라 찾아가 보았습니다.

처음 궁금했던건, 말로만 듣던 오타쿠가 있나 해서 두리번 거렸었네요 ㅎㅎ..
아쉽게도 뚱뚱하고 안경낀 변태? 같은 모습의 사람은 못봤던 것 같네요..ㅋㅋ



점심은 간단하게 우동과 튀김으로.. 



건물만 봐도 게임으로 가득할 것 같은.....



이런 코스프레같은 복장을 입은 사람도 있고..


이런 기모노 복장을 입은 사람도 있었습니다..



야간 버스를 타고 오사카에서 도쿄로 건너와서 그런지, 오후에 꽤 힘들었던 기억이 나네요..
확실히 애니메이션과 게임 문화로 유명한 나라답게 수 많은 캐릭터 상품들과 게임들이 있었습니다.


우리나라엔 이런 거리를 보진 못한 것 같은데, 코엑스가 약간 비슷하려나..

우리나라도 우리나라를 잘 나타낼 수 있는 문화로 타 나라에 영향력을 많이 끼쳤으면 좋겠네요 :)


다음 편엔 2일째 저녁 오다이바 입니다!!





 

대한민국의 현 경제 상태

Posted by ironmask84
2016. 1. 22. 17:52 생각과 일상/사회이슈 및 생각


1997년  5.9%  동아시아 외환위기 발발 (IMF)

1998년  -5.5%  2월 25일, 제15대 대통령 김대중 취임 

1999년  11.3%  

2000년  8.9%  

2001년  4.5%  

2002년  7.4%  

2003년  2.9%  2월 25일, 제16대 대통령 노무현 취임 

2004년  4.9%  

2005년  3.9%  

2006년  5.2%  

2007년  5.5%  

2008년  2.8%  2월 25일, 제17대 대통령 이명박 취임, 세계금융위기 발발 (리먼브라더스)

2009년  0.7%  

2010년  6.5%  

2011년  3.7%  

2012년  2.3%  

2013년  2.9%  2월 25일, 제18대 대통령 박근혜 취임 

2014년  3.3% 

2015년  3.6%


(출처 : 한국은행)

(펌 : http://namu.mirror.wiki/kiwi/%EA%B2%BD%EC%A0%9C%EC%84%B1%EC%9E%A5%EB%A5%A0/%EB%8C%80%ED%95%9C%EB%AF%BC%EA%B5%AD  - 연도별 세계 경제 자료도 있음.


위와같이 IMF 때, -5.5% 에서 1999년 11.3%라는 2자리 수 성장까지 이뤄졌다가,
2005년까지 평균 5%를 밑도는 수준으로 떨어져 갔고,
작년 2015년은 3%대 정도로 떨어졌습니다.


근 10년간(2005 ~ 2015) 평균 3% 성장률을 유지해온 셈이죠..

세계경제도 이와 비슷하게 흘러가고 있으며,

이를 경제학자들은 저성장시대,

이른바 "뉴 노멀 시대" 라고 일컫습니다.


기존의 IMF, 리먼브라더스 (글로벌 금융위기) 와는 달리 저성장이 계속 유지되는 시기를 말하고 있습니다.


중국이 엄청 부상하고 있습니다.

이미 경제성장이 우리나라를 앞질렀으며,
우리나라의 큰 산업의 축인 전자, 조선 산업이 잠식되어가고 있고, 자동차 산업도 그렇게 될 것으로 예상되고 있습니다.


우리나라가 일본을 그렇게 따라잡았듯, 이제 중국으로 인해 비슷한 입장이 되어 가고 있네요..


** 한국 경제 악화 요인들

1. (최근엔 유가 상승 -> 증시 악화) , 미국 금리 인상, 엔저현상 등

2. 세계일등 품목수 중국 1650개, 일본 180개, 한국 65개 -> 글로벌 경쟁력 위기 상황

3. 세계 첫 비지니스 모델들이 중국에서 나오고 있다... (특히,샤오미..)


사실 위의 요인들은 기업들에게 크게 와닿고, 개인에게는 좀 먼 얘기긴 합니다만,

앞으로 부익부빈익빈이 계속 심화되지 않았으면 좋겠습니다.


집값 거품, 실업률, 명예퇴직(이젠, 노사대타협으로 일반해고?? ㅠㅠ) 등이 개선되어서,

누구나 열심히 하면, 살만한 세상이 되어가길 바랍니다.



 

2016년 1월 겨울 한파!!

Posted by ironmask84
2016. 1. 22. 11:18 생각과 일상/오늘의 일상


안녕하세요. 방문자 여러분 ^^

사실 제 블로그에 방문자 수는 하루 평균 40 ~ 50명 정도 이고,

그 중에 이 글을 보는 분은 몇 안되겠지만, 이렇게 소통 하고 싶은 마음에 인사드립니다. :)


이번주엔 정말 한반도에 한파가 왔네요..

주초엔 러시아 보다도 추웠다고 합니다..

부산에서 오래살다가 서울로 와서 매서운 추위를 5년정도 겪었는데,

좀 오래된 집으로(한 30년정도 된??) 옮기고 첫 겨울을 맞게 되었는데, 동파가!!..


혹시나 하고, 찬물을 틀어놓고 출근하고, 퇴근 후 집에 들어와 보니.. 뜨거운물이 안나오네요... 

관리실에 물어보고, 관리기사님을 콜하기 전에 조치할 수 있는 팁을 얻었는데,

헤어 드라이기로 배관을 좀 녹여보라고 하시더군요..

반신반의 하는 마음가짐으로 한 10분 정도? 시도했는데..

틀어놓은 수도꼭지에서 물이 콸콸~ 캬....... ㅋㅋ


다행히 파이프가 동파되진 않았나 봅니다.. ^^

벌써 1월 중순이 지나가는데요, 추운 겨울 건강유의하시고, 2016년 힘차게 출발합시다!

 

안드로이드 View 클래스 관련 깨알같은 스펙정보

Posted by ironmask84
2016. 1. 21. 16:47 나는 프로그래머다!/Java & Android


setContentView() : 화면에 무엇을 보여줄지를 결정하는 함수(메소드)

R.layout.activity_main : 화면에 보여줄 대상이 되는 화면의 설정파일(xml)을 지정하는 구문

@string/hell_world  : activity_xxx.xml파일을 작성 할때 values/strings.xml 파일에 id가 hello_world로 설정된 문자열을 지정하는 구문 - android:text="@string/hello_world"

@+id/button01 : activity_xxx.xml파일 안에 있는 태그의 id를 지정하는 방식. 구성요소들을 화면상에 배치하기 위해 layout_below등의 값으로 지정할때 사용

findViewById() : xml에서 정의한 태그의 id를 이용해 코드에서 객체를 참조하는 방식

Intent : 어떤 기능을 실행할 지를 지정하기 위해 사용

Toast : 화면에 잠깐 보였다가 사라지는 풍선 메시지 사용을 위한 객체


 크기를 지정 할때 사용되는 단위들

 단 위

 단위 표현

 설 명

 px

 필셀

 화면 필셀

 dp or dip

 밀도 독립적 픽셀(density independent pixel)

 160dip 화면을 기준으로 한 픽셀

예) 1이치당 160개의 점이 있는 디스플레이 화면에서 1dp는 1px와 같음, 1인치당 320개의 점이 있는 디스플레이 화면에서 1dp는 2px와 같음

 sp or sip

 축척 독립적 픽셀(scale independent pixel)

 가변 글꼴을 기준으로 한 픽셀로 dp와 유사하나 글꼴의 설정에 따라 달라짐

 텍스트 표현시 폰트 크기대로 뷰를 표시할때 일반적으로 사용.

 in

 인치

 1인치로 된 물리적 길이

 mm

 밀리미터

 1밀리미터로 된 물리적 길이

 em

 텍스트 크기

 글꼴과 상관없이 동일한 텍스트 크기 표시

!!! 실제 앱의 화면을 구성 할 때는 'dp'단위를 주로 사용한다고 한다. 안드로이드 단말은 다양한 화면 크기와 해상도를 가지고 있는데 'dp'단위를 사용하면 단말의 해상도에 따라 비율로 픽셀값이 계산되므로 대부분의 화면에서 비슷한 크기로 보이도록 만들 수 있기 때문이다.


Color Format : ARGB( A: Alpha, R: Red, G : Green, B : Blue) - 

Alpha값 : 투명도 조절에 사용  - FF(불투명) -> 88(반투명) -> 00(투명)

textColor 속성 : 텍스트뷰에서 표시하는 문자열의 색상 속성 - ARGB 값으로 지정 - #88FF00FF

textSize 속성 : 텍스트뷰에서 표시하는 문자열의 크기 속성 - 12dp or 12sp or 12px

textStyle 속성 : 텍스트뷰에서 표시하는 문자열의 스타일 속성 - normal, bold, italic, bolditalic

typeFace 속성 : 텍스트뷰에서 표시하는 문자열의 폰트 설정 속성 - normal, sans, serif, monospace

singleLine 속성 : 텍스트뷰에서 표시하는 문자열이 한줄로 표시되도록 설정하는 속성.


배경 이미지 지정 : android:background="@drawable/pretty"

               res/drawable-hdpi 폴더에 pretty.png 파일을 위치시킨다. 폴더명의 hdpi 부분은 기기별 dpi에 따라 다른 해상도의 이미지를 지정해주기 위함인가?


orientation : 뷰를 추가하는 방향을 설정하는 속성 ( LinearLayout에만 적용되는 속성 )

gravity : 뷰의 정렬 방향을 설정하는 속성

padding : 뷰의 여유공간을 설정하는 속성

weight : 뷰가 차지하는 공간의 가중치 값을 설정하는 속성


레이아웃 종류 

@string/hell_world  : activity_xxx.xml파일을 작성 할때 values/strings.xml 파일에 id가 hello_world로 설정된 문자열을 지정하는 구문 - android:text="@string/hello_world"

 레이아웃 이름

 설 명

 LinearLayout

 - 박스(Box) 모델( 특정 방향으로 뷰들을 나열하듯 배치 )

 - 사각형 영역들을 이용해 화면을 구성하는 방법

 - 표준 자바의 BoxLayout과 유사

 RelativeLayout

 - 규칙(Rule) 기반 모델

 - 부모 컨테이너나 다른 뷰와의 상대적 위치를 이용해 화면을 구성하는 방법

 FrameLayout

 - 기본 단위 모델

 - 하나의 뷰만 보여주는 방법

 - 가장 단순하지만 여러 개의 뷰를 추가하는 경우 중첩시킬 수 있으므로 뷰를 중첩한 후 각 뷰를 전환하여 보여주는 방식으로 사용할 때 유용함.

 TableLayout

 - 격자(Grid) 모델

 - 격자 모양의 배열을 이용하여 화면을 구성하는 방법

 - HTML에서 많이 사용하는 정렬 방식과 유사하여 실용적임

 ScrollView

 - 스크롤이 가능한 컨테이너

 - 뷰 또는 뷰그룹이 들어갈 수 있으며 화면 영역을 넘어갈 때 스크롤 기능 제공

 



앱의 실행시 보여지는 첫번째 화면을 바꾸려면 아래의 AndroidManifest.xml 파일에서 볼드폰트로 표시된 부분을 타겟 액티비티 이름으로 변경해주면 된다.

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".MainActivity"?
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name=".NewActivity"></activity>
        <activity android:name=".LinearLayoutActivity"></activity>
        <activity android:name=".SampleLayoutCodeActivity"></activity>
        <activity android:name=".RelativeLayoutActivity"></activity>
    </application>


layout_width, layout_height 속성값

match_parent : 부모컨테이너와 같은 크기로 보이기(여유공간 모두 사용),  프로요(2.2) 버전 이전에는 fill_parent로 사용되었음.

wrap_content : 뷰에 표시할 내용물의 크기에 따라 뷰의 크기가 결정됨.

수치값 : dp등의 수치값으로 지정할 수 있음.


layout_gravity : 부모 컨테이너의 공간에서 뷰가 표시될 위치를 지정할 때 사용되는 속성.

gravity : 뷰가 표현해야 할 내용을 뷰의 공간 내에서의 정렬을 설정하는 속성.

gravity 속성값들

 정렬 속성값

 설 명

 top

 위쪽 끝에 배치

 bottom

 아래쪽 끝에 배치

 left

 왼쪽 끝에 배치

 right

 오른쪽 끝에 배치

 center_vertical

 수직방향의 중앙에 배치

 center_horizontal

 수평방향의 중앙에 배치

 fill_vertical

 수직 방향으로 여유공간만큼 확대하여 채우기

 fill_horizontal

 수평 방향으로 여유공간만큼 확대하여 채우기

 center

 수직/수평 방향의 중앙에 배치

 fill

 수직,수평 방향의 여유공간만큼 확대

 clip_vertical

 - 대상 객체의 상하 길이가 여유공간보다 클 경우에 남는 부분을 잘라내기

 - top|clip_vertical로 설정한 경우 아래쪽에 남는 부분 잘라내기

 - bottom|clip_vertical 로 설정한 경우 위쪽에 남는 부분을 잘라내기

 - center_vertical|clip_vertical 로 설정한 경우 위쪽과 아래쪽에 남는 부분 잘라내기

 clip_horizontal

 - 대상 객체의 좌우 길이가 여유 공간보다 클 경우에 남는 부분을 잘라내기

 - right|clip_horizontal 로 설정한 경우 왼쪽에 남는 부분 잘라내기

 - left|clip_horizontal 로 설정한 경우 오른쪽에 남는 부분 잘라내기

 - center_horizontal|clip_horizontal 로 설정한 경우 왼쪽과 오른쪽에 남는 부분 잘라내기

 



baselineAligned : layout_gravity나 gravity 속성만으로 정렬에 어려움이 있을 경우를 위해 지원되는 속성이며 레이아웃에 추가되는 뷰들의 텍스트들의 아랫줄 맞추기 한다.

                         android:baselineAligned="true"


상대 레이아웃에서 부모 컨테이너와의 상대적 위치를 이용해 뷰를 배치할 수 있는 속성들 

 속성

 설명

 layout_alignParentTop

 부모 컨테이너의 위쪽과 뷰의 위쪽을 맞춤

 layout_alignParentBottom

 부모 컨테이너의 아래쪽과 뷰의 아래쪽을 맞춤

 layout_alignParentLeft

 부모 컨테이너의 왼쪽 끝과 뷰의 왼쪽 끝을 맞춤

 layout_alignParentRight

 부모 컨테이너의 오른쪽 끝과 뷰의 오른쪽 끝을 맞춤

 layout_centerHorizontal

 부모 컨테이너의 수평 방향 중앙에 배치함

 layout_centerVertical

 부모 컨테이너의 수직 방향 중앙에 배치함

 layout_centerInParent

 부모 컨테이너의 수평과 수직 방향 중앙에 배치함

 


상대 레이아웃에서 다른 뷰와의 상대적 위치를 이용하는 속성들

 속성

 설명

 layout_above

 지정한 뷰의 위쪽에 배치함

 layout_below

 지정한 뷰의 아래쪽에 배치함

 layout_toLeftOf

 지정한 뷰의 왼쪽에 배치함

 layout_toRightOf

 지정한 뷰의 오른쪽에 배치함

 layout_alignTop

 지정한 뷰의 위쪽과 맞춤

 layout_alignBottom

 지정한 뷰의 아래쪽과 맞춤

 layout_alignLeft

 지정한 뷰의 왼쪽과 맞춤

 layout_alignRight

 지정한 뷰의 오른쪽과 맞춤

 layout_alignBaseline

 지정한 뷰와 내용물의 아래쪽 기준선(baseline)을 맞춤 

 

EditText InputType 속성값들 

 속성 값 EditText에 입력 가능한 값  설명 
 none  모든 문자, 모든 기호 ,숫자  다른 톡징이 없는 기본 EditText. 입력 폼안에 줄 바꿈이 가능하다.
 text  none과 같으나 줄바꿈이 불가능.
 textCapCharacters  모든 입력된 영문이 대문자로 입력이 된다.
 textCapWords  단어의 첫번째 영문이 대문자로 입력된다.
 textCapSentences  문장의 첫번째 영문이 대문자로 입력.
 textAutoCorrect  입력된 단어를 올바른 단어로 수정할 수 있다.
 textAutoComplete  단어를 입력중에 완성된 단어를 표시 할 수 있다. 
 textMultiLine  입력 폼에 줄 바꿈이 가능하나 따로 설정하지 않으면 단일 줄의 텍스트로 제한됨.
 textImeMultiLine  여러줄의 텍스트 입력가능. 키보드에 줄바꿈 키가 표시됨.
 textNoSuggestions  입력할때 사전에 등록되어있는 어떤 단어도 표시하지 않는다.
 textUri  URI를 입력.
 textEmailAddress  이메일 주소를 입력.
 textEmailSubject  이메일의 제목을 입력.
 textShortMessage  짧은 메시지를 입력.
 textLongMessage  긴 메시지를 입력.
 textPersonName  사람 이름을 입력.
 textPostalAddress  주소의 우편번호를 입력.
 textPassword  비밀번호를 입력. 입력된 문자는 (*)로 표시.
 textVisiblePassword  비밀번호를 입력. 입력된 문자가 보인다.
 textWebEditText  텍스트를 입력. 웹 양식으로 제공된다.
 textFilter  다른 텍스트를 필터링 하기 위한 문자를 입력.
 textPhonetic  발음되는 발음문자를 입력.
 textWebEmailAddress  이메일 주소를 입력. 웹 양식으로 제공.
 textWebPassword  비밀번호를 입력. 웹 양식으로 제공.
 number  숫자  숫자를 입력 받는다.
 numberSigned  숫자  부호가 있는 숫자를 입력.
 numberDecimal  .(점) 기호, 숫자  소숫점이 있는 소수를 입력 받는다.
 numberPassword  숫자  숫자로 된 패스워드를 입력.
 phone  - 기호, 숫자  전화번호를 입력 받는다.
 datetime  -, : 기호, 숫자  날짜와 시간을 입력. 날짜는 -, 시간은 :로 구분.
 date  - 기호, 숫자  날짜를 입력.
 time  : 기호, 숫자   시간을 입력.



ImageVew의 Scaltype 속성

1. matrix(원본 그대로)
2. center(가운데 정렬)
3. centerCrop(비율을 유지하며 가운데를 중심으로 자른다.)
4. centerInside(비율을 유지하며 줄어듬)
5. fitStart(왼쪽 위 정렬/ 비율유지)
6. fitCenter(centerInside와 동일)
7. fitEnd(왼쪽 아래 정렬 / 비율유지)
8. fitXY(늘이기 ImageView를 비율에 상관없이 다 채웁니다.)

속성값 java 설명
matrix setScaleType(ImageView.ScaleType.MATRIX) 원본 크기 그대로 보여줌 (왼쪽 상단 정렬)
Center setScaleType(ImageView.ScaleType.CENTER) 원본 크기 그대로 보여줌 (가운데정렬)
centerCrop setScaleType(ImageView.ScaleType.CENTER_CROP) View 영역에 공백이 있으면 채워서 보여줌(비율유지)
centerInside setScaleType(ImageView.ScaleType.CENTER_INSIDE) View 영역을 벗어나면 맞춰서 보여줌(비율유지)
fitStart setScaleType(ImageView.ScaleType.FIT_START) View 영역에 맞게 보여줌 (왼쪽상단 정렬비율유지)
fitCenter setScaleType(ImageView.ScaleType.FIT_CENTER) View 영역에 맞게 보여줌 (가운데정렬비율유지)
fitEnd setScaleType(ImageView.ScaleType.FIT_END) View 영역에 맞게 보여줌 (왼쪽하단 정렬비율유지)
fitXY setScaleType(ImageView.ScaleType.FIT_XY) View 영역을 가득 채워서 보여줌(비율유지 안함)


TextView & EditText 기능들

EditText 의 selectAllOnFocus 속성 : 아래와 같이 이 값을 true로 설정하면 포커스를 받을때 문자열 전체가 선택된다.

                                 android:selectAllOnFocus="true"

EditText 의 cursorVisible 속성 : 이 속성 값을 false로 설정하면 커서가 보이지 않게 된다.

getSelectionStart() : 선택된 문자열의 시작 위치 얻기

getSelectionEnd() : 선택된 문자열의 끝 위치 얻기

setSelection() : 문자열중에서 선택영역을 지정하기

extendSelection() : 선택영역 확장하기

selectAll() : 전체 문자열 선택하기


자동링크 : autoLink - 이 속성은 문자열에 들어 있는 링크 정보를 자동으로 찾아 링크 색상으로 표시하고 클릭하면 필요한 기능을 수행하도록 한다.

                              이메일, 전화번호, 웹링크등..


줄 간격 조정

lineSpacingMultiplier 속성 : 줄 간격을 배수로 설정 - 1.0보다 작으면 기본 설정값보다 더 좁게 보인다.

lineSpacingExtra 속성 : 여유값으로 설정 - 줄 간격 설정에 주로 사용되며 빼곡한 문자열의 가독성을 높이기 위한 것이다.


대소문자 표시

capitalize 속성 : 대문자나 소문자로 바꾸어 표시하는 기능이며, characters, words, sentences 값을 사용 할 수 있고 이는 1문자, 단어, 문장 단위로

                       맨 앞 글자를 대문자로 표시해 준다.


줄임 표

- TextView의 텍스트가 한줄로 되어 있는데 범위를 넘어가는 경우에 뒷부분은 '...'로 표시된다.

ellipsize 속성 : 범위를 넘어가는 텍스트에 대해 어디를 잘라서 표시할 것인지 설정하는 속성이다.

                 default 값 : none - 뒷부분을 자른다.

                 start, middle, end : 각각 앞부분, 중간부분, 뒷부분을 잘라서 보여준다.

singleLine 속성 : 텍스트 뷰를 한줄로 표시한다.


힌트 표시

hint 속성 : EditText에 어떤 내용을 입력하라고 안내문구를 표시하고자 할때 사용한다. 입력값이 없을때만 표시된다.

textColorHint 속성 : hint 문구의 색상을 지정한다.


편집 제한

editable 속성 : EditText에 입력되어 있는 문자열을 편집하지 못하게 하고 싶다면 이 속성값을 false로 한다. 기본값은 true.


EditText의 입력 문자열 변경 처리

getText() : 입렫된 문자열을 얻기 위해 Editable 객체를 얻는다. toString()메소드로 일반 String타입의 문자열을 얻을수 있다.

TextChangedListener() : 입력 될때마다 문자열을 확인하고 싶을때 사용한다.

addTextChangedListener() : 텍스트가 변경될 때마다 발생하는 이벤트를 처리할 수 있는 TextWatcher객체를 설정 할 수 있다.

TextWatcher 인터페이스의 메소스들

      public void beforeTextChanged(CharSequence s, int start, int count, int after)

      public void afterTextChanged(Editable s)

      public void onTextChanged(CharSequence s, int start, int before, int count)


출처 : http://blog.naver.com/dalmagru?Redirect=Log&logNo=220257843965

 

안드로이드 App Flag_Activity 란?

Posted by ironmask84
2016. 1. 21. 11:27 나는 프로그래머다!/Java & Android


안드로이드 App을 개발에서 Activity는 필수적인 클래스입니다.

Activity를 상속받아서, Form 하나의 UI부 및 제어부를 구성합니다.


디폴트로 제공하는 유용한 CallBack 함수들도 (oncreate, onstart, ondestroy... 등) 유용합니다.


이 Activity를 구성해서 만들어보면, 어떻게 다른 Activity 혹은 다른 App의 Activity로 이동할 수 있을까?

하고 생각하게 되는데, 이를 처리해주는 것이 "Intent" 라는 클래스 입니다.

(안드로이드 App에 대해 어느정도 공부를 하신 분들은 Acticity, Intent, Service, BroadcastReceiver 클래스에 익숙하실 것입니다.)


자, 그럼 "Intent"를 통해서 "Activity"라는 Form을 왔다갔다 이동한다는 것은 알겠는데,
계속해서 왔다갔다 이동을 하게 되면, 이 Form들이 Stack에 어떻게 쌓이게 될까??

이에 대해서 알아보려고 합니다.


잘 정리된 블로그의 내용이 있어서 퍼왔습니다.. ^^;;


<안드로이드는 굉장히 유용한 FLAG_ACTIVITY 들을 제공합니다.>

일반적인 경우, 안드로이드 용 어플리케이션을 작성하게 되면 여러가지 Activity 들을 생성하게 됩니다. 
이때, 가장 골치가 아픈 일 중 하나는 바로 Activity 와 Activity 간의 Flow 를 설계하고 이를 적절하게 구현하는 일입니다. 
(특히 안드로이드를 사용해보지도 않은 UX 팀과 함께 일하게 되는 경우라면 더욱 그러합니다...)

 기본적으로 안드로이드 플랫폼 상에서 Activity 는 또 다른 Activity 를 시작할 수 있고, 각각의 Activity 는 차곡 차곡 Task 라고 
불리우는 Activity Stack 에 쌓이게 됩니다. 사용자는 일반적으로 Back 버튼을 이용해서 현재 화면상에 보이는 Activity 를 
종료 시키고, 바로 직전에 사용된 Activity 로 돌아갈 수 있습니다. 안드로이드 펍의 회색님의 말을 빌리자면, 
인터넷 브라우저를 통해 웹페이지를 검색하는 것과 유사한 방식입니다. 

 하지만 이러한 방법만으로는 효과적인 UX Flow 를 구축하는데 어려움이있습니다. 
다행히, 구글에서는 Activity 를 호출할 때 사용되는 Intent 에 적절한 플래그 값을 설정해서 Activity Stack 을 제어할 수 있는 방법을 
제공해 줍니다. 이 플래그들은  FLAG_ACTIVITY 라는 접두어를 갖고 있는데, 종류가 다양해 헷갈리는 수도 있는데, 
개인적으로 제가 가장 요긴하게 사용하고 있는 FLAG_ACTIVITY 네 가지를 소개해 봅니다. 

 먼저 FLAG_ACTIVITY_SINGLE_TOP 입니다. 우선 간단하게 그림으로 표현해 보았습니다. 
A 와 B  두 가지 Activity 가 있는 데, A 라는 Activity 는 B 를 
B 라는 Activity 는 다시 자기 자신인 B 를 호출 하는 경우라고 가정해 보겠습니다. 
< FLAG_ACTIVITY_SINGLE_TOP >

 호출하는 Activity B 가 이미 Task 의 가장 앞에 위치하는 경우, 또 하나의 B 를 생성하는 대신, 기존에 존재하는 B Activity 가 
재활용됩니다. 이 때 B 가 재활용된다는 것을 개발자가 알아채고 새롭게 전달되는 Intent 를 사용할 수 있도록 B Activity 의 
onPause() / onNewIntent() / onResume() 가 순차적으로 호출됩니다. 별 생각없이 동일한 Activity 를 여러번 생성하는 것은 
메모리 사용량과 Activity 시작 속도 양쪽 모두에 악영향을 끼칠 수 있습니다. (특히 이미지가 덕지덕지 붙어 있는 Activity 라면). 
이런 경우 FLAG_ACTIVITY_SINGLE_TOP 를 적절하게 활용하면 제법 큰 효과를 볼 수 있습니다.

 두 번째는, FLAG_ACTIVITY_NO_HISTORY 플래그입니다. 우선 간단하게 그림으로 표현해 보았습니다. A 와 B  두 가지 Activity 가 있는 데, A 라는 Activity 는 B 를 B 라는 Activity 는 A 를 호출한 후 에 (A->B->A) 사용자가 Back 키를 누르는 경우를 가정해 보겠습니다.
<FLAG_ACTIVITY_NO_HISTORY>

 말 그대로, FLAG_ACTIVITY_NO_HISTORY 로 설정된 Intent 로 시작된 Activity B 는 Task 에 그 흔적을 남기지 않게 됩니다. 
B 에서 또다른 A 를 시작한 후, Back 을 누르면 일반적인 경우 이전에 실행되었던 B 가 나타나지만, NO_HISTORY 를 사용하는 경우 
맨 처음에 실행 되었던 A 가 화면에 표시됩니다. 몇 가지 주의할 점이 있습니다. 우선 NO_HISTORY 를 사용하게 되면 Task 에 
해당 Intent 의 정보가 기록되지 않기 때문에, A->B 인 상황 (그림에서 두 번째 단계...) 에서 홈키등을 눌러 다른 Task 로 전환된 후, 
다시 본 Task 로 돌아오게 되면, A Activity 가 화면에 표시됩니다. 또한, B Activity 의 onDestroy() 가 호출되는 시점이 조금 애매합니다.
일반적인 예상과는 달리, B 에서 또다른 A Activity 를 호출하는 세 번째 단계에서는 onStop 까지만 호출되고, 
이 후에 새롭게 호출된 A Activity 가 사라지는 순간 (네 번째 단계) 에서야 onDestroy() 가 호출 됩니다.

 FLAG_ACTIVITY_NO_HISTORY 는 여러가지로 쓸모가 있는데, 특히 특정한 이벤트에 대한 알람등을 위해 
다이얼로그 형태로 화면에 표시되는 Activity 들에 적용하기에 편리합니다. (대게의 경우 팝업은 해당 시점에 한번만 보여주면 되니까.)

 다음으로 굉장히 유용한 플래그 두 가지를 동시에 설명해보고자 합니다.FLAG_ACTIVITY_REORDER_TO_FRONT 와 FLAG_ACTIVITY_CLEAR_TOP플래그입니다. 
우선 간략하게 그림으로 살펴 보겠습니다. A Activity 에서 B Activity 를 
그리고 B 에서 A 를 호출하는 상황을 가정해보았습니다. (A->B->A)


 FLAG_ACTIVITY_REORDER_TO_FRONT 는 매우 특이하게도 Task 의 순서 자체를 뒤바꿔 줍니다. 이 플래그를 사용하면, 
런치하고자 하는 Activity 가 이미 Task 상에 존재하는 경우 해당 Activity 를 새롭게 생성하는 대신, 
아래쪽에 위치한 Activity 의 순서를 Task 의 가장 위로 끌어올려줍니다. 따라서 A->B->A 의 순서로 Activity 호출이 일어날때, 
새로운 A 가 생성되는 대신 아래쪽에 위치한 A 가 위로 올라와 최종적으로 B->A 의 형태로 Task 가 구성되게 됩니다. 
어떤 Activity 에서 특정 Activity 로 점프하는 형식의 Flow 를 구성해야하는 경우 요긴하게 사용될 수도 있지만
Task 의 순서를 뒤섞는 다는 점에서 사용에 주의를 기울일 필요가 있습니다.  
(별 생각없이 남발하게 되면 Back 키가를 누를 때 엉뚱한 Activity 가 표시되어 사용자들이 굉장히 혼란스러워 하는 경우가 있습니다.) 

 마지막으로 소개해 드릴 플래그는 바로 FLAG_ACTIVITY_CLEAR_TOP 입니다. 
제가 개인적으로 가장 사랑스럽게 생각하는 녀석입니다.
이 플래그가 사용되는 경우  런치하고자 하는 Activity 가 이미 Task 상에 존재하는 경우,
 해당 Activity 위에 존재하는 다른 Activity 를 모두 종료시켜 줍니다. 
따라서 A->B->A 로 호출이 일어나는 경우, B Activity 가 종료 되고, A Activity 만 Task 에 남게 됩니다.
 (A->B->C->A 인 경우에도 마찬가지로 B와 C 가 종료되고 A 만 남게 됩니다.)

  이 Flag 는 특정 어플리케이션의 대쉬보드 (혹은 홈) Activity 를 호출할 때 굉장히 유용하게 사용될 수 있습니다. 
즉 하나의 어플리케이션이 하나 혹은 두 가지의 주요한 Activity 와 
그 외 특정 값을 선택하는등 단순한 일을 수행하기 위한 여러 개의 Sub-Activity 로 구성되어 있다면, 
주요 Activity 를 호출하는데 이 Flag 를 사용함으로서 어플리케이션의 홈버튼등을 손쉽게 구현할 수 있습니다. 
또 이 Flag 는 FLAG_ACTIVITY_REORDER_TO_FRONT 와는 달린 Task 의 순서를 뒤섞지 않음으로 
사용자에게도 큰 혼란을 주지 않습니다. (사용을 적극 권장합니다.)

 한 가지 주의해야할 점은 A->B->A 형태로 Activity 를 호출 하고자 할 때, 
단순히 FLAG_ACTIVITY_CLEAR_TOP 만을 사용하게 되면, 기존에 생성되었던 A Activity 가 종료된 후 (onDestroy() 가 호출됨) 
새롭게 A 가 생성 (onCreate()) 됩니다. 만일 기존에 사용된 A Activity 가 계속 사용되기를 원한다면, 
SINGLE_TOP 플래그와 함께 사용해야 합니다.

 휴... 생각보다 내용이 길어졌네요. 대부분 SDK 문서를 읽어보면 잘 나와있는 내용이라 새로운 내용은 없습니다만... 
문서 읽기를 게을리한 덕분에 한창을 고생했던 기억이 떠올라 (특히 CLEAR_TOP) 
유용하게 사용한 Flag 를 정리하는 겸 작성해 보았습니다~



 

App 위젯 만들기 (in Eclipse)

Posted by ironmask84
2016. 1. 14. 16:15 나는 프로그래머다!/Java & Android


< 개발 환경 >  
   작성일 : 2016.01.14
   OS 설치 버전 : Windows7 32bit 
   SDK 설치 버전 : 안드로이드 SDK 4.4.2 (KitKat) / API LELVEL : 19 
   Java 설치 버전 : JDK 1.8.0_45 / JRE7 
   이클립스 설치 버전 : Mars
   테스트단말 : LG G2 4.4.2 (KitKat)   

 < 프로젝트 적용 > 
   API LEVEL : 19  
   minSdkVersion : 19 
   targetSdkVersion : 지정 안함 (지정 안하면 min = target)    
   Java Compiler Level : 1.8  
   Text file encoding : 
UTF-8


오랜만에 다시 안드로이드 개발이 시작되었습니다..

Home App을 건드리다가 이제는 위젯을 만들어야 하는데,

간단한 위젯이어서 큰 부담은 없었지만, 처음 만들어 보는 것이여서..

역시 첨 접근이 힘든법이죠. ㅎㅎㅎ


2014년에 사용했던, Eclipse + ADT 버젼을 그대로 사용하려 했는데,

Ant를 이용한 빌드환경 세팅이 잘 안되서...
(정확한 원인은 모르겠으나, 결과적으론 Eclipse 버젼 교체(Juno -> Mars) 후 정상동작)
Eclipse만 Mars 버젼으로 사용하고, and-sdk 세트를 적용(Preferences -> Android ->  SDK Location)

정말 Eclipse가 갈수록 발전하는 것 같네요.

project 생성 시, 기본 세팅을 해주는 것들이 많은데 위젯도 예전부터 있었겠지만,
Activity와 마찬가지로  기본적인 override 함수들 정의 및 기본 layout, strings 까지 생성시켜줍니다.

new-> Others -> Android -> Android Object 로 들어가서 App Widget 선택!


위 메뉴 대로 직접 생성시켜보면,

위젯만드는법을 검색해서 찾아보는 것보다 훨씬 직관적으로 이해하게 되더군요...

역시 여러번 보는 것보다 1번 직접 해보는 것이 효과적입니다. ㅋㅋ

간략히 정리하면, 아래 상자에 있는 것들이 생성됩니다.

1. AndroidManifest.xml -> receiver로 추가


2. res/layout/widget.xml 추가 (위젯 구성 UI Object)


3. res/xml/widget_info.xml 추가 (위젯 사이즈 및 update 주기 설정)


4. Widget Class 생성 

--> extends AppWidgetProvider, onUpdate(), onEnabled(), onDisabled(),

updateAppWidget(Context context, AppWidgetManager appWidgetManager, 

int appWidgetId) 을 기본으로 구성 

    
여기서, onUpdate() 가 인자로 AppWidgetManager appWidgetManager, int[] appWidgetIds 를 

받아오는 이유는, 기본적으로 App위젯은 appWidgetManager 에서 관리되며 이 위젯을 복수로 사용할 경우, 

appWidgetIds[] 를 통해 인덱스가 관리되므로, 각각의 위젯 UI를 Update해주기 위함이다..
onUpdate()는 명시적으로 호출해도 되고, 위에서 설명한 3번 
widget_info.xml에서 

주기 설정이 가능하다.


5. res/value/strings.xml 에 기본 추가되는 TextView에 넣을 string 하나 추가



* Ant : http://blog.naver.com/tommybee/220312166870  참고

* 더욱 자세한 위젯 설명 : http://arabiannight.tistory.com/239 참고