'Activity'에 해당되는 글 1건

  1. 2013.10.01 Activities
Programming/Android2013. 10. 1. 23:19

액티비티(Activities)

참조: http://developer.android.com/guide/components/activities.html


액티비티 명세(Declaring the activity in the manifest)

기본적으로 manifest파일에 <application> 태그 안에 <activity> 태그로 생성된다. attribute 로 android:name만 설정하면 되지만 한번 앱이 실행되면 이름을 바꿀수 없다.


인텐드 필터의 사용(Using intent filters)

<activity>는 <intent-filter> 태그를 사용하여 명시될 수 있다. 이는 다른 앱의 컴포넌트가 이 액티비티를 활성화할 수 있는 선언을 해 준다.


만약 다른 앱에서 이 액티비티를 실행시키기를 원하지 않으면 메인을 설정하는 <intent-filter>를 제외한 나머지 필터를 설정하지 않으면 된다.

- 인턴트 필터에 대한 더 많은 정보는 다음을 참조: http://developer.android.com/guide/components/intents-filters.html


액티비티의 시작(Starting an Activity)

다른 액티비티에서 startActivity() 와 Intent 객체를 인자로 원하는 액티비티를 실행시킬 수 있다. 그리고 인텐트는 정확하게 실행시키고싶은 액티비티를 설정할 수도있고 원하는 타입의 액티비티를 설정할 수도 있다(이때 시스템은 다른 액에서 적당한 액티비티를 선택한다). 그리고 인텐트는 적은양의 데이터도 옮길 수 있다.


그러니까 

명시적 인텐트가 있고(인텐트 객체 생성시 인자로 실행시킬 액티비티 클래스 설정)

암시적 인텐트가 있다(인텐트 객체 생성시 인자로 원하는 동작 타입과 그게 맞는 데이터만 넘김).

암시적 인텐트에 가치가 있는데 이는 다른 앱에서 원하는 액티비티를 불러낼 수 있고 만약 이런 앱이 많다면 사용자가 고를 수 있다. 예를 들어 이메일을 보내는 다른 앱의 액티비티를 불러내 보낼 당사자의 이메일 정보를 같이 이메일 앱으로 보낼 수 있다.


결과를 위한 액티비티의 시작(Starting an activity for a result)

startActivity()메소드 대신에 startActivityForResult()라는 메소드(인자: Intent intent, int requestCode)를 실행시킬 수 있다. 이 경우 다음 실행된 액티비티가 실행이 맞췄을 때 onActivityResult() 콜백 메소드로 인자 int requestCode, int resultCode, Intent data를 받을 수 있다. resultCode로 응답의 유무를 알 수 있고 requestCode로 startActivityForResult()메소드와 시퀀스를 맞추고 intent에서 데이터를 추출할 수있다.


액티비티 끄기(Shutting Down an Activity)

하나의 액티비티를 소멸하기 위해 finish() 메소드를 사용할 수 있고 finishActivity() 메소드를 사용하여 각각의 액티비티를 소멸할 수 있다. 하지만 굳이 액티비티를 액티비티 라이프싸이클에 의해 소멸시킬 필요가 없기 때문에 만약 필요하면 위의 메소드를 좀더 찾아 보길.


액티비티 라이프싸이클(Managing the Activity Lifecycle)

이전 포스팅에서 액티비티 라이프 싸이클에 대해 충분히 설명이 되었고 하나 추가하자면 onCreate(), on Start() … onDestroy()까지 모든 오버라이드하는 메소드는 super.onCreate() 같이 상위 클래스의 메소드를 첫줄에 추가해 줘야한다.



그리고 시스템이 스스로 액티비티를 죽일 수 있는 순간은 onPause(), onStop(), onDestroy() 가 호출 된 이후에만이다. 그래서 onPause()메소드가 실행되는 시점부터 자동으로 액티비티가 죽을 수 있으니 모든 중요 데이터는 onPause() 단계에서 중간 저장하고 가라 하지만 또 너무 많이 저장하면 매번 실행되기 때문에 시스템을 느리게 할 수 있는 요지가있기 때문에 선별하여 저장하는게 좋다.


액티비티 상태 저장(Saving activity state)

번들로 액티비티 상태를 저장하는 것은 이 부분역시 이전 포스팅에서 설명했다. 저장하는 onSaveInstanceState()와 복원하는 onRestoreInstanceState()는 클래스를 오버라이드한 후 바로 슈퍼클래스의 각각의 메소드를 호출해 주어야 한다. (만약 이런 상태 저장 자체를 원하지 않는다면 android:saveEnable 애트리뷰트에 false로 저장하거나 setSaveEnabled() 메소드를 호출하여 설정할 수 있다.) 그리고 간단하게 이걸 확인하는 방법은 기기를 로테이션 시켜서 가로모두로 바꾼하 돌아와보면 그 결과를 쉽게 알 수 있다.



컨피그레이션 변경 핸들링(Handling configuration changes)

스크린 로테이션, 키보드 보이기 나 언어 설정 등의 기기 컴피그레이션이 런타임동안 변할수 있다. 이러한 변경이 이루어질 때 시스템은 액티비티를 재생성한다(onDestory()->onCreate()). 그래서 가장 좋은 핸들링 방법은 위의 액티비티 상태를 저장하고 복귀하는 것이다. 


- 컴피그레이션 변경에 대한 더 많은 정보는 다음을 참조: http://developer.android.com/guide/topics/resources/runtime-changes.html


코디네이팅 액티비티(Coordinating activities)

액티비티A가 다른 액티비티B를 불러낼때 

1. 액티비티 A의 onPause() 메소드가 실행되고

2. 액티비티 B의 on Create(), onStart(), onResume()의 세게의 메소드가 순서대로 실행된다.

3. 그리고 마지막으로 액티비티 B가 화면에 보이면 액티비티 A의 onStop() 메소드 실행된다.


그러니까 액티비티 B가 실행되기 전 마지막 액티비티 A의 실행은 onPause() 때문에 액티비티 A에서 데이터 베이스 저장 후 액티비티 B에서 그 데이터를 쓰려면 액티비티 A의 onPause()에서 저장 시켜야 한다는 것이다 onStop() 에서가 아니라.

Posted by Brian B. Lee