액티비티를 먼저 소개합니다
1. 액티비티란 무엇인가요?
액티비티는 원칙적으로 사용자에게 대화형 인터페이스 기능을 제공하는 프로그램입니다. 안드로이드 애플리케이션의 기본 기능 단위입니다. 활동 자체에는 인터페이스가 없습니다. 따라서 활동 클래스는 창을 생성하고 개발자는 setContentView(View) 인터페이스를 통해 활동에 의해 생성된 창에 UI를 배치할 수 있습니다. 활동이 전체 화면 창을 가리키는 경우 다음과 같이 다른 방법으로도 구현할 수 있습니다. 부동 창( windowIsFloating 테마 컬렉션을 통해) 또는 다른 활동에 포함( ActivityGroup 사용). 활동은 별도의 활동이며 사용자 작업을 처리하는 데 사용됩니다. 거의 모든 활동은 사용자를 다루어야 합니다
2. 활동 수명주기
public class Activity extends ApplicationContext { protected void onCreate(Bundle savedInstanceState); protected void onStart(); protected void onRestart(); protected void onResume(); protected void onPause(); protected void onStop(); protected void onDestroy(); }
그림에서 볼 수 있듯이:
활동이 정상적으로 시작되는 동안 이러한 메소드 호출의 순서는 onCreate -> onStart -> 활동이 종료될 때 메소드 순서는 onPause -> onStop -> 수명주기. 그런 다음 인터럽트 처리(예: 전화 수신)의 경우 onPause -> 재개할 때 현재 애플리케이션이 반투명(반투명) 테마의 활동인 경우 onResume입니다. , 복구 중에 인터럽트는 onPause, onResume입니다.
따라서 "다른 앱에 메모리가 필요합니다"의 경우, 우리 휴대폰이 애플리케이션을 실행하는 동안 전화나 문자 메시지가 올 수도 있고, 전원이 없을 수도 있습니다. 이때 프로그램이 중단되어 프로그램이 실행됩니다. 또한, 시스템에서는 너무 많은 리소스를 점유하는 것을 허용하지 않으며, 최소한 일부 기능(전화 통화 등)은 보장되어야 하므로 리소스가 부족할 경우 종료될 수 있습니다. 불충분하다.
시스템에서 메소드의 역할과 수행해야 할 작업:
onCreate: 여기에서 인터페이스를 만들고 일부 데이터 초기화 작업을 수행합니다.
onStart: 여기에서 변경합니다. 단계 "사용자에게 표시되며 상호 작용할 수 없습니다."
onResume: 사용자와 상호 작용합니다(활동 스택 시스템은 스택을 통해 이러한 활동을 관리합니다. 즉, 현재 활동은 실행 후 스택을 팝하고 이전 활동으로 돌아갑니다.
onPause: 이 시점에서는 표시되지만 대화형이 아니며 시스템은 CPU를 소비하는 애니메이션 및 기타 작업을 중지합니다. . 위의 설명을 통해 우리는 귀하의 데이터 중 일부가 여기에 저장되어야 한다는 것을 이미 알고 있습니다. 왜냐하면 이때 프로그램의 우선 순위가 낮아지고 시스템에서 다시 가져갈 수 있기 때문입니다. 여기에 저장된 데이터는 onResume에서 읽어야 합니다.
onStop: 보이지 않게 되고 다음 액티비티에 포함됩니다.
onDestroy: 액티비티가 종료되기 전에 호출되는 마지막 메서드입니다. 다른 클래스가 종료 메서드나 시스템을 호출할 수도 있습니다. 공간을 절약하고 일시적으로 종료하려면 isFinishing()을 사용하여 스레드에서 실행 중인 Progress Dialog가 있는 경우 onDestroy에서 취소하세요. 그렇지 않으면 스레드가 종료되면 Dialog의 cancel 메소드를 호출하세요. 예외가 발생합니다.
OnPause, onstop, onDestroy 이 세 가지 상태에서는 시스템에 의해 활동이 종료될 수 있습니다.
3. Activity 간 통신
Android에서는 서로 다른 Activity 인스턴스가 하나의 프로세스에서 실행될 수도 있고 다른 프로세스에서 실행될 수도 있습니다. 따라서 활동 간에 메시지를 전달하는 데 도움이 되는 특별한 메커니즘이 필요합니다. Android는 Intent 객체를 사용하여 메시지를 나타냅니다. Intent 객체에는 메시지 대상뿐만 아니라 메시지 내용도 포함됩니다. 이는 수신자 주소뿐만 아니라 특정 내용도 포함해야 하는 이메일과 같습니다. . Intent 객체의 경우 메시지 "destination"은 필수이지만 내용은 선택 사항입니다.
Intent는 작업의 동작, 동작에 관련된 데이터 및 추가 데이터를 설명하는 역할을 담당합니다. Android는 이 Intent의 설명을 기반으로 해당 구성 요소를 찾아 Intent를 전달하는 역할을 담당합니다. 구성 요소 호출 및 구성 요소 호출 완료. 따라서 Intent는 여기서 미디어 중개자 역할을 하며, 특히 서로 호출하는 구성 요소와 관련된 정보를 제공하고 호출자와 호출 수신자 간의 분리를 달성합니다.
애플리케이션에서는 Intent를 두 가지 형식으로 사용할 수 있습니다.
직접 인텐트: 구성 요소 속성을 지정하는 인텐트입니다(지정하려면 setComponent(ComponentName) 또는 setClass(Context, Class) 호출). 특정 구성 요소 클래스를 지정하면 해당 구성 요소를 시작하라는 알림이 애플리케이션에 전달됩니다.
간접 인텐트: 구성요소 속성을 지정하지 않는 인텐트입니다. 이러한 인텐트는 시스템이 이 정보를 기반으로 사용 가능한 모든 구성 요소 중에서 이 인텐트를 만족하는 구성 요소를 결정할 수 있도록 충분한 정보를 포함해야 합니다.
직접 인텐트의 경우 대상 구성 요소가 이미 명확하므로 Android에서 구문 분석할 필요가 없습니다.
Android에서 파싱해야 하는 것은 간접 인텐트입니다. 파싱을 통해 인텐트는 인텐트를 처리할 수 있는 활동, IntentReceiver 또는 서비스에 매핑됩니다. 인텐트 파싱 메커니즘은 주로 AndroidManifest.xml에 등록된 모든 IntentFilters와 여기에 정의된 Intents를 검색하고 최종적으로 일치하는 Intent를 찾습니다.
4. 액티비티의 인텐트 필터
인텐트 필터는 Android가 이를 android.content.IntentFilter 클래스로 추상화하는 구성 요소의 종류를 설명합니다. Android의 AndroidManifest.xml 구성 파일에서
startActivity(intent)를 사용하여 다른 Activity를 시작할 때 인텐트 개체의 Component 속성을 직접 지정하면 Activity Manager는 해당 Component 속성에 지정된 Activity를 시작하려고 시도합니다. 그렇지 않으면 Android는 인텐트의 다른 속성을 사용하여 시스템에 설치된 모든 활동에서 시작하기 위해 가장 일치하는 항목을 찾습니다. 적절한 활동이 없으면 애플리케이션은 시스템에서 예외를 발생시킵니다. 매칭 과정은 다음과 같습니다.
5. Activity의 스택 관리
Android에서는 Activity 관리를 위해 스택을 사용하므로 An Activity만 존재합니다. 이 활동이 소멸되면 다음 활동이 스택 상단에 떠 있을 수 있으며, 새 활동이 생성되면 이전 활동이 스택에 푸시되어 싱크됩니다. 활동은 Android 프로그램의 프레젠테이션 계층입니다. 프로그램의 각 표시 화면은 활동입니다. 실행 중인 활동은 스택의 맨 위에 있으며 실행 중 상태입니다.
프로그램에서 Activity.finish() 메서드를 호출하면 결과는 사용자가 BACK 키를 눌렀을 때와 동일합니다. 즉, Activity Manager에게 Activity가 인스턴스는 "재활용"될 수 있습니다. 그런 다음 Activity Manager는 스택의 두 번째 레이어에서 활동을 활성화하고 원래 활동을 스택의 두 번째 레이어에 푸시한 다음 Running 상태에서 Paused 상태로 이동합니다.
6. 액티비티 로딩 모드
standard, SingleTop, SingleTask, SingleInstance(처음 2개는 그룹, 마지막 2개는 그룹), 기본값은 표준
표준: 인텐트가 새 인스턴스로 전송되므로 점프할 때마다 새 활동이 생성됩니다.
singleTop: 새 인스턴스도 전송하지만 표준과 다른 점은 요청한 액티비티가 정확히 스택 상단에 있는 경우(액티비티는 싱글탑으로 구성됨) 새 인스턴스가 생성되지 않는다는 것입니다.
SingleTask: 후속 SingleInstance는 하나의 인스턴스만 생성합니다. 인텐트가 도착하고 SingleTask로 설정된 Activity를 생성해야 하는 경우 시스템은 스택에 이미 Activity의 인스턴스가 있는지 확인합니다. 있는 경우 인텐트를 직접 보내십시오.
singleInstance:
먼저 태스크의 개념을 설명하겠습니다. 태스크는 여러 액티비티에 배치될 수 있는 스택으로 간주할 수 있습니다. 예를 들어 애플리케이션이 시작되면 Android는 작업을 생성한 다음 애플리케이션의 항목 활동을 시작합니다. 그런 다음 이 작업에서만 인터페이스에서 다른 활동을 호출할 수 있습니다. 그렇다면 여러 작업 간에 활동을 공유하면 어떻게 될까요? 예를 들어, 투어 가이드 서비스 애플리케이션을 열면 그 안에 GOOGLE 지도를 여는 액티비티가 있습니다. 홈 버튼을 눌러 메인 메뉴로 돌아가서 GOOGLE 지도 애플리케이션을 다시 시작하면 방금 지도가 표시됩니다. 실제로 이는 실제로 SingleInstance를 도입하는 동일한 활동입니다. SingleInstance 모드는 Activity를 별도로 스택에 넣어서 스택에 이 Activity만 존재하게 하고, 이 Activity를 통해 다양한 애플리케이션의 인텐트를 수신하고 표시하여 공유를 달성하는 모드입니다. 물론, 전제는 이러한 애플리케이션이 파괴되지 않았기 때문에 방금 HOME 키를 눌렀을 때 리턴 키를 누르면 무효가 됩니다.
7. 활동 점프
활동 점프, 결과가 반환되지 않음
이것은 활동으로 점프하는 가장 간단한 방법입니다. 하나의 활동에서 다른 활동을 시작하려면 직접 startActivity(new Intent(current Activity.this, next Activity.class))를 시작하세요.
액티비티 점프 및 데이터/결과 반환
데이터나 결과를 반환해야 하는 경우 startActivityForResult(Intentintent, int requestCode)를 사용하세요. 점프 대상 활동을 식별합니다. 점프 대상 활동이 해야 할 일은 데이터/결과를 반환하는 것뿐입니다. setResult(int resultCode)는 데이터 없이 결과만 반환하거나, setResult(int resultCode, Intent data)는 둘 다를 반환합니다! 반환된 데이터/결과를 받는 처리 함수는 onActivityResult(int requestCode, int resultCode, Intent data)입니다. 여기서 requestCode는 startActivityForResult의 requestCode이고, resultCode는 setResult의 resultCode이며, 반환된 데이터는 data에 있습니다.