Search Results

Search Results for 'Android' : 17 POSTS

  1. 2010.09.10 이클립스 Unable to upload file: timeout 이 뜨며 컴파일이 안될때 (1)
  2. 2010.08.27 XML을 이용하여 Shape Drawable 를 만드는중 radius가 적용이 안될때 (1)
  3. 2010.08.22 RelativeLayout 사용하기
  4. 2010.08.19 태스크란? (Task, Activity Stack)
  5. 2010.08.13 액티비티 생명주기 (Activity LifeCycle) (1)
안드로이드 이클립스에서 Run했을때 Unable to upload file: timeout 이 뜨며 컴파일이 안될때

Failed to upload ********.apk on device 'M???????????'
[2010-09-10 13:44:46 - ********] java.io.IOException: Unable to upload file: timeout


와 같이 뜨며 컴파일이 안될때는 아래와 같이 이클립스 설정을 변경한다.

Window > Preferences > Android > DDMS > ADB connection time out (ms) 의 값을 늘려주면 된다.

Comments List

  1. Comment List
비밀글
안드로이드 XML을 이용 Shape Drawable 를 만드는중 radius가 적용이 안될때
<item>
  <shape>
    <!--corners android:radius="5dp"/-->
    <corners
    android:topRightRadius="5dp"
    android:topLeftRadius="5dp"
    android:bottomRightRadius="1px"
    android:bottomLeftRadius="1px"
    />
  </shape>
</item>


- 위와 같은 방법으로 모서리가 둥근 도형을 만들 수 있다

- radius 만 설정하면 모서리가 모두 값에 맞게 변하며 각각 따로 설정할때에는 위와 같은 설정을 해줘야 한다

- 이때 네가지 속성중 하나라도 빠지면 둥근 모서리가 적용이 되지 않으며 0dp 일 지라도 적용되지 않는다

- 어쩔 수 없이 모서리를 적용 시키지 않을 부분은 1px 의 값을 주어 눈에 잘 안보이도록 처리하였다

Comments List

  1. Comment List
비밀글

RelativeLayout 사용하기

2. RelativeLayout

RelativeLayout은 위젯의 위치를 상대 위젯/ 컨테이너를 기준으로 결정하는 방법이다.

첫 번째로, 부모 컨테이너 내부에서 위젯 자신의 위치를 결정하는 속성은 다음과 같다.


위의 속성들은 모두 true, false 값을 입력 받는다.

 두 번째로, 상대 위젯/컨테이너를 기준으로 배치 시 사용하는 속성은 다음과 같다.


마지막 android:layout_alignBaseline는 label과 EditText등의 Text기반 위젯의 글자 높이를 맞추는데 유용하게 쓰임.

위의 모든 attribute들은 기준이 되는 상대 위젯/컨테이너의 id를 값으로 지정하여야 한다.

 

기준이 되는 상대 위젯의 id는 "@id/위젯id"로 결정한다.

예를들어, 위젯 A 가 android:id="@+id/A"로 identiy되어있다면XML 내부에서 위젯 A는 "@id/A"로 불린다.

그럼으로 위젯 B를 위젯 A 오른쪽에 위치 하게 하고 싶다면 위젯 B의 alignment 속성을 다음과 같이 지정한다.

<위젯 A

......

android:id="@+id/A" />

<위젯 B

......

android:layout_alignRightOf="@id/A" />

 

이 경우 위젯 A, B는 다음과 같은 형태로 배치 된다.

 

  RelativeLayout에서 주의할 두 가지 점은:

  • XML Layout 파일은 위에서 아래로 순차적으로 한번 파싱됨으로 XML 문서상 밑에 위치한 위젯의 id를 위에 위치한 위젯이 참고하는 것은 불가능 하다. (아직 선언되지 않은 변수를 참조 할 수 없는 것과 같다.)
  • 모든 fill 관련 속성은 자신 이외의 위젯이 사용하고 남은 스페이스에만 적용됨.

  

RelativeLayout 예제 (main.xml)

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
	android:layout_width="fill_parent"
	android:layout_height="fill_parent"
	android:padding="5px" >

	<!-- XML layout은 위에서 부터 밑으로 parsing 됨으로  -->
	<!-- 다음의 TextView내부에서 아직 선언되지 않은   -->
	<!-- EditText나 Button들의 id(@id/edittext, @id/ok, @id/cancel)를 사용할 수 없음  -->
	<TextView
		android:id="@+id/label"  
		android:layout_width="wrap_content" 
		android:layout_height="wrap_content" 
		android:text="URL" 
		android:paddingTop="15px"
		android:paddingRight="10px" />

	<!-- 다음의 EditText(edittext)의 layout_width="fill_parent"는 -->
	<!-- 위 TextView(lable)가 사용하고 남은 공간을 채움 -->
	<EditText
		android:id="@+id/edittext"
		android:layout_width="fill_parent"
		android:layout_height="wrap_content"
		android:layout_toRightOf="@id/label"
		android:layout_alignBaseline="@id/label"
		android:text="http://tigerwoods.tistory.com" />
	<Button
		android:id="@+id/ok"
		android:layout_width="80px"
		android:layout_height="wrap_content"
		android:layout_alignRight="@id/edittext"
		android:layout_below="@id/edittext"
		android:text="OK" />
	<Button
		android:id="@+id/cancel"
		android:layout_width="80px"
		android:layout_height="wrap_content"
		android:layout_toLeftOf="@id/ok"
		android:layout_below="@id/edittext"
		android:text="Cancel" />
</RelativeLayout>

 

실행결과는 다음과 같다.



RelativeLayout의 완전한 API Reference는 다음의 링크를 참조.

RelativeLayout API Reference 링크



출처 : http://tigerwoods.tistory.com/11

Comments List

  1. Comment List
비밀글

태스크란? (Task, Activity Stack)



안드로이드 태스크란? (Android Task, Activity Stack)

-  Task는 어플리케이션에서 실행되는 액티비티를 보관하고 관리하며 Stack형태의 연속된 Activity로 이루어진다

- 선입후출(First In Last Out)형태로 나중에 적재된 액티비티일 수록 가장 먼저 사용된다
  만약 1페이지>2페이지>3페이지 순으로 액티비티를 이동했을때 실행순서대로 Task에 push해 놓았다가
  back버튼을 누르면 3페이지>2페이지>1페이지순으로 Task에서 pop시켜 되돌아 간다고 생각하면 된다

- 서로 다른 어플리케이션간의 이동에도 Task를 이용해 사용자 경험(UX)를 유지시켜 준다

- 최초적재 액티비티는 Root Activity 라고 하며 어플리케이션 런처로부터 시작된다

- 마지막으로 적재되는 액티비티는 Top Activity 라고 하며 현재 화면에 활성화 되어있는 액티비티를 말한다

- Task내에는 서로 다른 어플리케이션의 액티비티들이 포함될 수 있어 어플리케이션에 경계없이 
  하나의 어플리케이션인것 처럼 보이게 해준다

- Task의 Stack내에 존재하는 액티비티들은 모두 묶여서 background와 foreground로 함께 이동한다
  홈버튼 클릭(task interrupt => background 이동), 홈버튼 롱클릭(recent task => foreground 이동)

- Flag를 사용하여 Task내 액티비티의 흐름을 제어할 수 있다


어피니티란? (Android Affinity)

- 어플리케이션 내의 액티비티들은 하나의 어피니티를(affinity:친화력) 가지고 있다

- AndroidManifest 에서 <activity> 요소의 taskAffinity 속성을 사용해 개별 affinity가 지정 가능하다

- FLAG_ACTIVITY_NEW_TASK 플래그를 가진 인텐트 객체로 부터 호출된 allowTaskReparenting 속성을
  True로 가지고 있는 액티비티에 한해 affinity가 동작한다

- 위 조건이 만족한 상황에서 시작된 액티비티는 자신과 동일한 어피니티를 갖는 태스크가 있을경우
  해당 태스크로 이동한다

- 즉, [b]어피니티를 가진 A액티비티가 호출되어 해당 태스크에 속해있을때 [b]어피니티를 가진 태스크가
  호출되면 A액티비티는 [b]어피니티를 가진 태스크로 이동한다

- 어피니티에 의해 태스크가 이동된 후에 back버튼으로 반환시 원래 해당하던 태스크로 돌아간다

- 하나의 어플리케이션내에서 하나 이상의 기능을 갖는 어플리케이션이 존재할경우 각 액티비티별로 다른
  어피니티를 지정해 관리할 수 있다


플래그란? (Android Flag)

- AndroidManifest 에서 플래그를 사용할때에는 <activity> 요소의 launchMode 속성을 사용하며
  launchMode에서 사용가능한 속성은 다음과 같이 4가지만 가능하다

  standard: 
  스택중 어느곳에나 위치 가능하며 여러개의 인스턴스가 생성가능하다

  singleTop: 
  스택중 어느곳에나 위치 가능하며 여러개의 인스턴스가 생성가능하고 호출한 activity와 현재
  최상위 activity가(top activity) 동일한 경우 최상위 activity가 재사용 된다(기존 최상위 activity는 pop)

  singleTask: 
  루트 액티비티로만 존재하며 하나의 인스턴스만 생성가능하다(타 task에서 동일 activity 사용불가)
  다른 액티비티 실행시 동일 Task내에서 실행이 가능하다
 
 singleInstance: 루트 액티비티로만 존재하며 하나의 인스턴스만 생성가능하고 태스크내에 해당
  액티비티 하나만 속할 수 있어
 다른 액티비티를 실행시키면 새로운 Task가 생성되어
  (FLAG_ACTIVITY_NEW_TASK와 동일) 그 Task내에 포함된다


- 소스코드에서 플래그를 사용하고 싶을때에는 Intent에 addFlags() 또는 setFlags() 메소드를 사용한다

  FLAG_ACTIVITY_NEW_TASK:
  동일 affinity의 task가 있으면 그곳에 실행되고 아니면 새로운 task를 실행

  FLAG_ACTIVITY_SINGLE_TOP:
  상단 singleTop과 같으며, 실행시 재사용 액티비티의 실행은 onPause(), onNewIntent(), onResume()
  순으로 호출된다
  ☞ [B]를 single top설정: [A][B] 상태에서 [B] 호출시 => [A][재사용된B]
  ☞ [B]를 single top설정: [B][A] 상태에서 [B] 호출시 => [B][A][B]

  FLAG_ACTIVITY_NO_HISTORY:
  해당 액티비티는 재활성화시(back키를 눌러 다시 활성화될때) pop 된다
  ☞ [B]를 no history설정: [A][B][A] 상태에서 back키 사용시 [A]가 pop 되고 [B] 역시
  no history에 의해 pop => [A]

  FLAG_ACTIVITY_REORDER_TO_FRONT:
  activity 호출시 이미 같은 activity가 task내에 있으면 같은 activity는 pop 시키고 해당 activity가 push 된다
  ☞ [A]를 reorder to front설정: [A][B] 상태에서 [A] 호출시 같은 activity인 [A]가 pop되고 => [B][A]

  FLAG_ACTIVITY_CLEAR_TOP:
  해당 task에 있는 모든 activity를 pop 시키고 해당 activity가 root activity로 task에 push된다
  ☞ [A]를 clear top설정: [A][B] 상태에서 [A] 호출시 모두 pop되고 => [A]
  단, 해당 플래그는 액티비티를 모두 onDestroy() 시킨 후 새롭게 onCreate() 시키기 때문에 [A]를
  유지하려면 FLAG_ACTIVITY_SINGLE_TOP 플래그와 함께 사용하면 된다

http://developer.android.com/reference/android/content/Intent.html
#FLAG_ACTIVITY_BROUGHT_TO_FRONT


Clear Task

- Task를 오랫동안 사용하지 않고 방치해 두면 시스템은 Root Activity를 제외한 모든 액티비티를 Clear 시킨다
- 이러한 동작은 Activity의 속성을 수정하여 제어할 수 있다

  alwaysRetainTaskState:
  Task의 Root Activity에 true로 설정되어 있다면 상단에 언급되었던 동작은 발생하지 않으며 Task는
  오랜 시간 이후에도 Stack에 있는 모든 Activity를 유지한다

  clearTaskOnLaunch:
  이 속성이 true로 설정되어 있으면 alwaysRetainTaskState 와 정반대로 사용자가 Task를 떠났다가
  다시 돌아올 때마다 항상 Stack은 Root Activity로 정리된다

  finishOnTaskLaunch:
  이 속성은 clearTaskOnLaunch와 유사하지만 전체 Task가 아닌 단일 Activity에서 동작한다
  그리고 그것은 Root Activity를 포함한 어떤 Activity가 사라지는 원인이 될 수도 있다
  true로 설정되어 있을 때, Activity는 현재 Session 동안 Task의 일부만 유지한다
  만일 사용자가 해당 Task를 벗어났다가 다시 돌아오면 더이상 존재하지 않는다

Comments List

  1. Comment List
비밀글

액티비티 생명주기 (Activity LifeCycle)




안드로이드 액티비티 생명주기 (Android Activity LifeCycle)

- 액티비티는 효율적인 메모리 관리를 위해 생성, 소멸되는 조건인 생명주기를(Lifecycle) 가지고 있다

- 생명주기는 7가지 단계로 구분되며 다음 순서를 기본으로 진행된다
  onCreate(), onStart(), onResume(), onPause(), onStop(), onRestart() 또는 onDestroy()

- 각 상태에 따라 필요한 작업을 메소드를 오버라이드 하여 처리해주면 된다

- 여러개의 액티비티를 이용중 시스템의 리소스가 부족하면 다음상태의 액티비티를 강제로 종료시킨다
  onDestroy() - 1순위, onStop() - 2순위, onPause() - 3순위

- onPause() 상태의 Callback은(실행완료) 보장하지만, onStop()과 onDestroy()는 보장할 수 없다
  (미완료 상태에서 System이 강제종료 시킬 수 있으므로 되도록 onPause()에서 종료를 대비 해야한다)

- 강제종료된 Activity는 리소스가 확보되면 다시 복구 시킨다

- 강제종료시에는 데이터 복원를 대비하여 onPause() 실행 전 onSaveInstanceState(Bundle b) 를 실행시킨다

- 강제종료시에는 onStart() 호출 후 실행되는 onRestoreInstanceState(Bundle b) 또는 
  onCreate(Bundle b) 를 사용하여 복원작업을 수행할 수 있다

- 화면의 Orientation(가로/세로) 변경시 onDestroy()를 호출 후 onCreate()가 실행된다

 

- onCreate()
액티비티가 처음 생성될때와(화면이 회전되어 orientation이 변경될때도 기본으로 실행) 실행되며
레이아웃배치와 변수선언 등 각종 초기화 작업을 구현하는 단계이다
완료 후 onStart()를 호출한다

- onStart()
onCreate() 이후 또는 onRestart()로 다시 시작된 후 처음으로 호출하는 단계이며
화면생성이 완료되고 사용자 입력을 받기 바로 직전의 단계이다
완료 후 onResume()를 호출한다

- onResume()
onResume() 이 실행되면 상호작용이 가능하며 모든준비가 완료되고 액티비티가 완벽하게 활성 상태가 된다.
onPause()에서 다시 시작되었을때 호출하는 단계이기도 하다

- onPause()
상태에서 다른 Activity에 포커스를 넘겨준 후 비활성화(background) 되며 상호작용이 중단된 단계이다
이 상태 이후부터는 언제든지 시스템의 강제종료가 가능하며 이 상태가 완료 되어야 다음 Activity가
활성화(foreground) 되고 이후 이 액티비티는 onStop() 상태가 된다
단, 다음 Activity 의 테마가 translucent 인 투명한 배경의 Activity 와 같이 풀스크린이 아닌
Activity일 경우에는 onStop() 상태가 되지 않고 onPause()를 유지한다
하나 더 덧붙이면, 투명배경의 Activity와 비슷한 Diaglog 의 경우에는 onPause()가 적용되지 않는다

- onStop()
Activity가 사용자에게 보이지 않는 비활성화 상태로 돌아서게 되면 호출하는 단계이다
=> 다른 activity 를 활성화 시켰을때는 background로 onStop() 상태가 유지되며,
=> 현 액티비티에서 finish()를 호출하거나 back key를 이용해 home activity로 돌아갈때는
onStop() 후 onDestroy()를 호출하고
=> 다음 Activity에서 back 하여 현 액티비티로 돌아올때는 onRestart(), onStart(), onResume 순으로 호출한다

- onDestroy()
finish(), finishActivity() 같은 정상적인 종료시에 호출되며, onCreate()에서 호출한 자원의 반납등을 하는 단계이다

- onRestart()
onStop()인 비활성화 상태에서 다시 활성화되는 단계에서 발생한다

Comments List

  1. Comment List
비밀글