2020년 7월 18일 토요일

자마린, 안드로이드, Xamarin.Android Activity란?

자마린, 안드로이드, Xamarin.Android Activity란?
2.2.2 Xamarin.Android Activity란?
n 사용자에게 UI를 제공하는 메인이 되는 컴포넌트로, 사용자의 상호 작용에 응답하고 동적 인 사용자 환경을 만드는 일을 담당한다.모바일 앱의 특성상 하나의 UI가 떠서 사용자로 부터 입력을 받고, 출력을 담당한다. 즉 하나의 화면 인터페이스에 해당한다고 보면된다. 폰 다이얼러 화면, 카메라 촬영 화면, 이메일 쓰기 화면, 지도 보기 화면 등과 같이 사용자들이 뭔가 하기 위해 상호작용을 할 수 있는 화면을 제공한다는 것이다. 각 액티비티는 하나의 윈도우에 UI를 그리며, 그 윈도우가 보통은 화면을 꽉 채우지만, 화면보다 작을수도 있고, 다른 윈도우의 위에 떠 있을 수도 있다.
n 앞 예제에서 하나의 화면(액티비티)만 있는데 화면을 시작시키는 클래스는 MainActivity 이며MainActivity.cs 파일에 있다. MainActivity라는 이름은 안드로이드에서 특별한 의미가 없는데,비록 MainActivity라는 어플리케이션에서 첫 번째 Activity의 이름을 짓는 것이 관습이지만 안드로이드는 다른 이름이 붙여도 상관 없다.
n MainActivity.cs를 열면 MainActivity 클래스가 Activity 클래스의 하위 클래스이고 Activity가 Activity 특성(Attribue)으로 되어 있음을 알 수 있다.
n 앱은 보통 여러개의 액티비티로 이루어져 있고, 각 액티비티는 서로 느슨한 관계를 갖는다. 일반적인 앱은 하나의 메인(main) 액티비티를 갖고 사용자가 앱을 처음 실행했을때 보여지는 화면(액티비티)이 되고 각 액티비티는 다른 액티비티를 호출할 수 있는데 다른 액티비티가 실행되면 이전의 액티비티는 정지되지만(stopped), "백스택(Backstack)"이라 불리는 스택에 저장되기 때문에 없어지지는 않는다.
n 안드로이드 시스템은 새로운 액티비티를 시작하면 백스택에 담고 나서 사용자에게 보여주는데 백스택은 스택 자료구조 이므로 LIFO의 스택 메커니즘을 따르며 사용자가 “뒤로” 버튼을 누를 경우 스택의 최상위(top)에 있는 현재 액티비티를 제거(pop and destroy)하고 이전의 액티비티를 시작 한다.
n Activity Class는 UI를 작동시키는 코드가 있는데 사용자의 상호작용에 응답하고 동적으로 응답이 처리되는 구조를 가진다.
n 이전의 Hello Android는 하나의 스크린(Activity)만 가지고 MainActivity 클래스가 그일을 하며 MainActivity.cs로 존재했다. MainActivity는 Activity를 상속받아 구현하고 클래스 위에는 Activity Attrubute로 필요한 속성을 정의한다.
n Activity Attribue는 Android Manifest와 함께 액티비티를 등록하고 안드로이드에게 이 클래스가 Manifest에 의해 관리되는 응용프로그램의 일부라고 알리는 역할을 한다. Label 속성은 스크린의 맨위에 표시되는 텍스트를 가리키고 Icon은 텍스트 옆에 표시되는 이미지를 말한다. MainLauncher 속성은 안드로이드에게 응용프로그램이 시작할 때 이 액티비티를 표시하도록 지정하므로 액티비티가 여러 개일 때 유용하다.
[Activity(Label = "@string/app_name", MainLauncher = true, Icon = "@drawable/icon")]
public class MainActivity : AppCompatActivity { …
2.2.3 Activity Life Cycle
n Xamarin.Android 애플리케이션에는 main과 같은 단일 진입 점이 없다. 즉, 운영 체제가 응용 프로그램을 시작하기 위해 호출하는 응용 프로그램의 코드 줄이 하나도 없다는 말이다. 대신, 안드로이드가 클래스 중 하나를 인스턴스화 할 때 애플리케이션이 시작된다. 이때 안드로이드는 전체 애플리케이션의 프로세스를 메모리 로딩한다.
n 에뮬레이터 또는 장치에서 전화걸기앱 응용 프로그램을 처음 실행하면 운영 체제가 첫 번째 Activity를 만들고 이 액티비티는 하나의 애플리케이션 화면에 해당하는 특수한 Android 클래스이며, 사용자 인터페이스 그리기 및 전원 공급을 담당한다. Android는 애플리케이션의 첫 번째 Activity를 생성 할 때 전체 애플리케이션을 로드한다.
n 전화걸기앱 예제에서는 애플리케이션을 구성하는 모든 부분이 Android Manifest라는 특수 XML 파일에 등록된다. Android Manifest의 역할은 애플리케이션의 콘텐츠, 속성 및 권한을 추적하고이를 Android 운영체제에 공개하는 것인데 아래 그림과 같이 Android Manifest 파일로 묶인 하나의 Activity(화면)와 리소스 및 도우미 파일의 모음으로 생각할 수 있다.
n 새로운 액티비티가 실행되어 현재 액티비티가 정지하게 되면 시스템은 생명주기의 콜백 메소드를 호출함으로써 액티비티의 상태가 변경되었음을 알려주는데 이러한 콜백 메소드들은 시스템이 액티비티를 생성하고, 보여주고, 멈추고, 제거하는 등의 상황에 호출되며, 적절히 오버라이드(override)함으로써 각각의 상황에 맞는 동작을 구현할 수 있다. 예를 들어 액티비티는 정지되었을 때 네트웍이나 데이터베이스 관련 객체와 같이 덩치가 큰 객체들을 해제하는 것이 좋고 액티비티가 다시 화면에 보여질 때 필요한 리소스들을 다시 가져와서 중지되었던 작업들을 다시 실행할 수 있다. 이렇게 액티비티가 생성되고 보여지고 멈추고 제거되고 하는 등의 상태변화는 모두 액티비티 생명주기의 일부다.
n Android에서는 액티비티들은 사용자와 상호작용에 의존하는 라이프사이클의 다른 단계를 통하여 작동된다. 액티비티들은 생성(OnCreate), 시작(OnStart), 일시정지(OnPause), 재실행(OnResume), 파괴(OnDestroy)의 라이프 사이클을 가지며 화면 라이프 사이클의 특정 지점에서 시스템이 호출하는 콜백 메소드가 들어 있다.
n Activity가 상태를 변경하면 적절한 라이프 사이클 이벤트 메소드가 호출되어 변경을 알리고 해당 변경 사항에 적응하기 위해 코드를 실행할 수 있다.
n 즉 액티비티 라이프 사이클 메소드를 재정 의하여 Activity가 로드되는 방식, 사용자가 반응하는 방식, 장치 화면에서 사라지는 상황까지 제어 할 수 있다.
n OnCreate : 반드시 구현되어야 하는 콜백 메소드로서 사용자에게 화면을 보여주기 전, 즉 액티비티 생성시 호출된다. 액티비티에 필요한 요소들을 초기화 및 멤버변수로 저장하고, setContentView()를 호출하여 UI 컴포넌트등을 로딩하고, Listener를 바인딩하고, 초기 데이타를 로딩하는 등의 초기화 작업을 한다.( OnCreate() 다음으로는 항상 onStart()가 호출된다. Hello 안드로이드에서 UI를 로딩하기 위해 SetContentView를 호출하고 resource 레이아웃 이름(레이아웃 파일 : activity_main) 을 전달해야 하는데 레이아웃은 Resorce.Layout.activity_main에 위치한다.
// Set our view from the "main" layout resource
SetContentView (Resource.Layout.activity_main);
MainActivity를 시작할 때 activity_main 파일의 내용을 바탕으로 한 뷰가 만들어진다. 레이아웃이름이 Activity 이름과 매칭되는데 activity_main은 MainActivity의 레이아웃이다. 이것은 Android 관점에는 필요한 것은 아니나 더 많은 Activity를 붙이기 시작할때 코드 파일에 매칭되는 레이아웃 파일을 좀더 쉽게 찾기 위한 명명 규칙이다.
일단 레이아웃 파일이 세팅되면 추가된 컨트롤들을 찾을수 있는데 컨트롤 찾기 위해서 먼저 FindViewById 함수에 컨트롤의 Resource ID를 넘겨주면 된다.
EditText phoneNumberText = FindViewById<EditText>(Resource.Id.PhoneNumberText);
Button callButton = FindViewById<Button>(Resource.Id.CallButton)
레이아웃파일에서 컨트롤에 대한 참조를 가지게 되었으므로 사용자 상호작용에 대한 응답을 프로그래밍 할 수 있는 것이다.
n OnReStart : 액티비티가 정지되었다가 다시 시작되기 직전에 호출되며 OnRestart() 다음으로는 항상 OnStart()가 호출된다.
n OnStart : UI가 화면에 보이기 직전에 호출되며 이 시점에 UI가 로딩 된다고 해도 사용자의 입력을 받을 수 는 없다. 이어서 액티비티가 전면에 나서며 포커스를 받을때 OnResume()이 호출되며, 그렇지 않고 바로 가려지면 OnStop()이 호출된다. 즉 다음으로 OnResume() 또는 OnStop()이 호출된다.
n OnResume : Activity가 장치 화면으로 돌아올 때마다 발생해야하는 모든 작업을 수,행 UI 로딩이 끝난후, 사용자 Input (Interaction)이 시작되기 전에 호출된다. 이 함수들이 다 호출되고 나면 애플리케이션은 실행 가능 상태인 “Activity Running” 상태가 되고 UI도 모두 로딩되어 사용자로 부터 입력을 받을 준비도 끝난다. 액티비티가 사용자와 상호작용을 할 수 있는 상태가 되기 직전에 호출된다. 이때 액티비티는 백스택(Backstack)의 최상단에 있고, 사용자는 액티비티에 뭔가를 할 수 있는 상태가 된다. OnResume() 다음으로는 항상 OnPause()가 호출됩니다.
n OnPause : 정지화면에서 액티비티가 사라질 때 실행된다. 즉 Activity가 장치 화면을 떠날 때마다 발생해야 하는 모든 작업을 수행한다. 사용자와 액티비티의 거리가 한단계 멀어지는 경우에 호출되는 콜백 메소드, 액티비티가 화면에 보여지고 있는 상태와 완전히 정지되어 화면에서 사라진 상태의 중간 단계라고 볼 수 있다. 이 상태 이후에 액티비티가 종료될 수도 있기 때문에 여기서는 액티비티가 다시 시작되었을 때 유지되어야 하는 값들이 있을 경우 저장하는 일을 한다. 정확한 상태 정의는 “보이기는 하지만 사용자와 Interaction을 할 수 없는 상태” 정도로 정의할 수 있다. 이런 상태가 어떤 상태인가 하면 다이얼로그등과 같은 다른 액티버티가 앞에 떠서 사용자 Interaction을 수행하는 상태이다 그러나 기존의 Activity는 그대로 뒤에 떠 있지만 뒤에 떠 있는 activity 는 사용자 Interaction을 받지 못하는 상태이다. 이 때 사용중인 쓰레드 정리, 데이타 저장등을 수행하거나 또는 포커스를 잃은 화면이기 때문에 애니메이션등을 정지해야 한다. 다시 해당 Activity로 돌아가게 되면 OnResume으로 다시 돌아가서 화면을 다시 호출하게 된다. 화면이 보이지 않는 상태에서 메모리가 부족하게 되면 안드로이드 시스템에 의해서 이 단계에서 자동으로 정지(Killed) 될 수 있다. Killed 된 상태에서 다시 그 화면으로 돌아가게 되면 다시 onCreate로 돌아가서 앱을 처음부터 다시 시작하게 된다.
n OnStop : 액티비티가 더이상 사용자에게 보여지지 않을때 호출된다. 보통 액티비티가 종료되는 상황이거나, 다른 액티비티가 resume 상태가 되면서 이전 액티비티를 완전히 가려버리는 상황이다. 이어서 액티비티가 다시 사용자에게 보여지는 상태가 되는 경우 OnRestart()가 호출되고 액티비티가 종료되고, 종료되어 백스택에서도 빠지는 경우 OnDestroy()가 호출된다.
n OnDestroy : 액티비티가 메모리에서 소멸될때 호출된다. 생명주기에서 마지막으로 호출되는 콜백 메소드로 finish()가 호출되었거나 시스템이 다른 작업을 위한 메모리를 확보하기 위해 임의로 종료시키는 경우에 호출된다.

댓글 없음:

댓글 쓰기

(C#교육동영상)C# ADO.NET 실습 ODP.NET/ODAC 설치 오라클 함수 호출 실습, C#학원, WPF학원, 닷넷학원, 자바학원

  (C#교육동영상)C# ADO.NET 실습  ODP.NET/ODAC 설치  오라클 함수 호출 실습, C#학원, WPF학원, 닷넷학원, 자바학원 https://www.youtube.com/watch?v=qIPU85yAlzc&list=PLxU-i...