안드로이드 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 참고


 

JNI & 예제

Posted by ironmask84
2013. 4. 1. 14:27 나는 프로그래머다!/Java & Android


JNI는 요 근래에 알개 되었다. C언의 요소들을 자바에서 사용하고자해서 찾아보것이 알개 된계기
JNI는 자바에서 C/C++로 구현되거나 자바에 비해 장점이라 할수 있는 것들을 사용할수 있개 해주는 것이다.

 native method라는 것을 구현화 함으로 C와 C++의 문법적 요소들을 가져와 쓰는 것이다.
이러한 장점에 비해 자바의 강점인 이식성과 네이티브 메소드들의 자바의  메소드들과 같은 보호를 장담하지 못한다는 단점이 있다.

 자료를 수집하려 들려본 블로그, 카페들 중에서는 이론상으로 C로 구현된 것들(API)을 모두 가져다 쓸수 있다고 표현한 분들도 있었지만 해보지 않아 장담할 수없어 아쉽다.

 첫 단계로 "Hello World"예제를 만드는 법을 설명하갰다.
테스트 환경은 윈도우 2003 R2, 자바 1.6  비쥬얼스트디오 6.0에서 하였다.

 먼저 HelloWorld.java다

=============================================================
public class HelloWorld {
 static
 {
  System.loadLibrary("HelloWorld");
  System.out.println("===library was loaded");
 }

 public native void printHelloWorld();
 public static void main(String[] args) throws Exception
 {
  new HelloWorld().printHelloWorld();
 }
}
=============================================================

위에서 static이라 구현해 준 부분은 자바소스가 실행될때 HelloWorld라는 라이브러리를 가져다 쓰갰다는 이야기가 된다.

 그리고 public native void printHelloWorld() 이부분이 C에서 구현해주고 사용할 메소드,함수의 선언 부분이다.

 위의 소스가 준비가 됬다면 이제는 javac 와 javah로 컴파일과 해더파일을 작성해주면 된다. 컴파일이 먼저 이루어져야 하겠고 javah뒤에는 확장자를 뺀 클래스 파일의 이름을 넣어 주면 된다.

위 그림과 같이 되갰으며 아무 매세지가 나오지 않으면 성공한것이다.


그럼 HelloWorld.h 해더 파일을 보갰다.

=============================================================
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class HelloWorld */

#ifndef _Included_HelloWorld
#define _Included_HelloWorld
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     HelloWorld
 * Method:    printHelloWorld
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_HelloWorld_printHelloWorld
  (JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif
=============================================================

 javah로 만들어준 해더 파일이다. 이파일은 수정하면 안되며 c에서 구현해줄 함수의 선언 부를 볼수 가있다.
그럼 이 해더파일을 이용해 c파일을 만들갰다.

=============================================================
#include <jni.h>
#include "HelloWorld.h"
#include <stdio.h>

JNIEXPORT void JNICALL Java_HelloWorld_printHelloWorld(JNIEnv *env, jobject obj)
{
 printf("Hello World!\n");
 return;
}
=============================================================

 이것이 c언어로 구현해 주어야 할 부분이다.
이소스는 비쥬얼 스트디오에서 DLL을 만들어주는 프로젝트를 만들어야 한다.
일단 jni.h파일과 만들어준 HelloWorld.h 파일을 인클루드해야 한다.
jni.h는 자바가 설치된 디렉토리 및에 있으며 비쥬얼 스트디오에서는 라이브러리 추가를 해주어야 한다.

 함수의 명은 Java_클래스명_자바에서 선언한 네이티브메소드명 이 되갰다.
이제 이소스를 DLL파일로 만들어 주었으면 작업공간의 가장 상위 폴더로 옯겨준다.

이제 실행을 해보자


이와 같은 결과가 나올것이다.

출처 : http://blog.naver.com/sysganda/30095941540 

 


 

make / 모듈 추가 방법

Posted by ironmask84
2013. 4. 1. 14:22 나는 프로그래머다!/Java & Android


테스트 라이브러리를 플랫폼에 추가하기
안드로이드는 config.mk 에서 각 프로젝트별 android.mk를 뒤져
빌드하는 형태로 구성되어 있다~


안드로이드 플랫폼내에 모듈이나 어플리케이션을 추가시키기 위해
별도의 mk 및 타겟 플랫폼 빌드환경을 구성하기에는 작업해야 하는 일이
많고, 안드로이드에 특화된 시뮬레이터, 서명 등의 문제가 발생할 여지가 있다.

(실제로 발생하는지는 모르겠다... -_-;)


아무튼 기 구성된 make 프로세스에 포함시켜 빌드하는게

가장 편한 방법이기에 해당내용을 정리해 본다. 


ex) helloworld 라는 공용라이브러리 추가하기


1. 테스트 라이브러리를 위한 폴더명 설정  "helloworld"

2. /frameworks/base/helloworld 폴더 추가(다른위치에 추가해도 됨)

3. /build/core/pathmap.mk 수정

pathmap.mk는 프레임워크의 각 서브항목에 대해 정의해둔 곳이다.

make 파일에서 FRAMEWORKS_BASE_SUBDIRS 를 찾아 마지막에 추가될

모듈(helloworld 추가)


#

# A list of all source roots under frameworks/base, which will be

# built into the android.jar.

#

FRAMEWORKS_BASE_SUBDIRS := \

$(addsuffix /java, \

   core \

   graphics \

   im \

   location \

   media \

   opengl \

   sax \

   telephony \

   wifi \

   vpn \

   keystore \

   helloworld \

)


4. 소스 복사 or 코딩

/frameworks/base/helloworld/libhelloworld/ 와 같은 폴더 생성 후 코딩 및 소스 추가


helloworld.h

namespace android {


class HelloWorldTest

{

public:

HelloWorldTest();

~HelloWorldTest();


void Test();

};

};


helloworld.cpp

#include "helloworld.h"

using namespace android;


void HelloWorldTest::Test()

{

return;

}



5. Android.mk 추가

LOCAL_PATH:= $(call my-dir)


include $(CLEAR_VARS)


#여기에 소스 목록을 등록

LOCAL_SRC_FILES:= \

helloworld.cpp


#여기에 사용하는 라이브러리들 등록

LOCAL_SHARED_LIBRARIES:= \

libui \

libcutils \

libutils


#출력 모듈명

LOCAL_MODULE:= libhelloworld

LOCAL_PRELINK_MODULE:= false


#링커 관련 플래그

ifeq ($(TARGET_OS)-$(TARGET_SIMULATOR),linux-true)

LOCAL_LDLIBS += -ldl

endif

 

#동적으로 참조할 라이브러리 추가

#에뮬레이터인 경우 libdl 을 동적참조

ifneq($(TARGET_SIMULATOR),true)

LOCAL_SHARED_LIBRARIES += libdl

endif


#헤더파일 위치

LOCAL_C_INCLUDES:= \

$(LOCAL_PATH)/include \

$(call include-path-for, graphics corecg)


#빌드방식

include $(BUILD_SHARED_LIBRARY)


6. 아웃풋 위치

out/target/product/generic/system/ 에 빌드방식에 따른 폴더가

정의되어 있다.


동적 라이브러리의 경우

out/target/product/generic/system/lib/

out/target/product/generic/obj/SHARED_LIBRARIES/xxxx/

out/target/procuct/generic/symbols/system/lib/

등이 출력 위치이다.



7. 주요 define 항목 설명

LOCAL_PRELINK_MODULE : 프리링크 활성화(true, false)


LOCAL_MODULE_TAGS : 타겟 시스템 설정을 위한 태그

이 값은 최상위의 /build/core/main.mk 에서 각 프로젝트를 빌드할때

사용되는 값으로 어플리케이션의 속성을 지정하게 된다.

설치 관련 정보나 보안 등급, 디버깅 여부 등의 설정이 이루어진다.

기본 값은 user 이다.


eng, user ,userdebug, optional


LOCAL_MODULE_CLASS

모듈의 등급을 지정하는 것으로 아래와 같은 값이 들어감

EXECUTABLES , JAVA_LIBRARIES , SHARED_LIBRARIES


LOCAL_PACKAGE_NAME

/packages/app/ 에 등록된 패키지들과 마찬가지로

패키지명으로 기본 os 에 포함될 패키지를 의미한다.


이름은 패키지의 디렉토리명과 동일해야 한다.

실제 패키지가 이미지에 포함되기 위해서는

build/target/product/generic.mk 에도 등록해야 

system.img에 패키지가 포함된다.



LOCAL_CERTIFICATE : 키 서명

설정되지 않으면 testkey가 사용되며, 해당 키에 대한 값은

/build/target/product/security/ 폴더에 pk8, x509.pem 파일이 존재한다.

이 파일의 이름이 키가 되고, 빌드시 해당 키를 사용한다고

이곳에 지정하게 된다.


테스트용 키를 생성하기 위한 mkkey.sh 스크립트도 포함하고 있다.


LOCAL_CFLAGS : C , C++ 관련 컴파일러 플래그

LOCAL_CPPFLAGS : C++ 관련 컴파일러 플래그

LOCAL_CXXFLAGS

일반적으로 gcc 관련 옵션사항을 기술한다.


기본 최적화 옵션

-O : 기본 최적화를 켠다.

-O2 : 모든 최적화를 켠다. 대부분 -O 보다 나은 선택이며, 일반적으로 사용됨.

-O3 : -O2 에 더해 추가 최적화를 켠다. 바이너리 사이즈가 증가하며 디버깅이 거의 불가능.

-Os : -O2 에 더해 사이즈 관련 최적화를 한다. 큰 어플리케이션에 유용하다.

-O2, -O3 보다 실행 속도가 빠른데, 로드 시간의 감소, 메모리 사용 및 캐쉬, 디스크 사용등

의 최적화가 이루어지기 때문이다.

-fomit-frame-pointer : x86 시스템에서 함수 호출과 관련한 스택포인터와 

이를 지시하는 프레임 포인터에 해당하는 작업을 하지 않는다. 

(각 인수들,  리턴 주소 등의 ebp 관련 레지스터 )

-march=<your_arch> 

-mtune=<your_arch>

-mcpu=<your_arch>

머신 컴파일 옵션으로 대상에 대해 최적화를 수행한다. 대상의 cpu 정보를 넣어주면 되며,

세개 모두 동일한 내용이며, -march 는 -mtune을 의미한다.

-mtune/-mcpu는 gcc 구버전에서 이용되었다. 

-pipe : 컴파일시 별도의 임시파일을 생성하지 않음.



TARGET_SIMULATOR : 대상 시뮬레이터여부 , true/false

TARGET_OS : 대상 os

TARGET_ARCH : 대상 아키텍처



LOCAL_LDLIBS : 링커 옵션

LOCAL_STATIC_LIBRARIES

LOCAL_SHAREDLIBRARIES


LOCAL_C_INCLUDES : include 폴더

LOCAL_CPP_EXTENSION : cpp 소스의 확장자. 기본값은 .cpp



빌드 규칙

include $(BUILD_PACKAGE)

include $(BUILD_EXECUTABLE)

include $(BUILD_SHARED_LIBRARY)

include $(BUILD_HOST_EXCUTABLE)

 

출처 : http://blog.daum.net/hopefullife/117