중화사전망 - 중국어 사전 - Android 의 handler 와 service 의 차이점은 무엇입니까?

Android 의 handler 와 service 의 차이점은 무엇입니까?

작업, 프로세스 및 스레드

Android 의 구성 요소 및 응용 프로그램과 관련하여 대부분 정적 개념입니다. 응용 프로그램이 실행 중일 때 프로세스와 스레드의 개념에 관심을 갖는 것은 불가피하다. Android 에서 구성 요소의 동적 작동에는 가장 독특한 개념 중 하나인 Task 가 있습니다. task 로 번역해야 합니다.

작업 개입의 가장 중요한 역할은 구성 요소 간의 연결을 프로세스 개념의 세부 사항에서 분리하여 다른 모델로 구성할 수 있다는 것입니다. 상위 개발자의 이해 난이도를 단순화하고 더 나은 개발과 구성을 도울 수 있는 경우가 많다.

SDK 에는 Task (guide/topics/fundamentals.html # acttask) 에 대한 좋은 비유가 있는데, task 는 애플리케이션 개념과 맞먹는다. 개발자의 눈에는 안드로이드 프로그램을 개발하는 것이 독특한 구성 요소를 만드는 것이지만, 일반 사용자의 경우 실행 중인 전체 응용 프로그램일 뿐, 이 전체 뒤에는 작업이 있습니다.

간단히 말해서, 작업은 스택으로 함께 모이는 활성 구성 요소 세트입니다. 서로 관련될 수 있습니다. 새로 추가된 활성 구성 요소는 스택 맨 위에 있으며 스택 맨 위에 있는 활동만 사용자와 상호 작용할 수 있습니다. 스택 맨 위에 있는 활동이 해당 작업을 완료하면 Task 가 해당 작업을 스택으로 푸시하고 스택에 더 이상 활동이 없을 때까지 스택 맨 위로 실행할 다음 활동이 사용자를 대면하게 합니다. 작업이 종료됩니다.

이벤트 작업 스택

전자 메일 응용 프로그램을 클릭하고 받은 편지함 (활동 a) 으로 들어갑니다

E-메일을 선택하고 활동 버튼을 클릭합니다.

회신을 클릭하여 새 메일 (활동 C) ABC 를 쓰기 시작합니다.

몇 줄을 쓰고, 연락처 선택을 클릭하고, 활동 D ABCD 를 입력하세요.

연락처를 선택하고 이메일 ABC 작성을 계속합니다

메일을 쓰고, 보내고, 원래 사서함 AB 로 돌아갑니다.

뒤로를 클릭하여 받은 편지함 a 로 돌아갑니다

종료 전자 메일 프로그램이 null 입니다

위의 표에서 볼 수 있듯이 한 가지 예입니다. 사용자가 사서함에 들어가는 시점부터 응답 종료 응용 프로그램을 완료하는 시점까지 작업 스택이 변경됩니다. 이것은 표준 스택 모델입니다. 대부분의 경우 이러한 작업 모델은 처리하기에 충분하지만 실제 성능, 비용 등의 문제가 발생할 경우 훨씬 더 잔인해집니다. 예를 들어 Android 에서 브라우저를 시작하는 것은 번거로운 과정이며 많은 초기화 작업과 많은 메모리 오버헤드가 필요합니다. 그러나 동시에 브라우저를 사용하여 일부 콘텐츠를 여는 것은 일반 응용 프로그램의 요구 사항입니다. 동시에 10 개의 실행 중인 응용 프로그램 (여러 작업에 해당) 이 있고 브라우저를 시작해야 하는 경우 얼마나 잔인한 장면인지 상상해 보십시오. 열 개의 작업 스택에 매우 유사한 브라우저 활동이 쌓여 있어 그야말로 화려한 낭비이다. 그런 다음 브라우저 활동이 별도의 작업으로 존재할 수 있는지, 그 작업의 요청에 관계없이 브라우저 작업이 과거에 병합되지 않는다는 생각을 하게 됩니다. (데이비드 아셀, Northern Exposure (미국 TV 드라마), 성공명언) 이렇게 하면 브라우저 활동 자체가 더 많은 상태를 유지해야 하지만 전체 비용이 크게 낮아져 가정을 포기하는 행위는 칭찬할 만하다.

이렇게 칭찬할 만한 행동은 안드로이드가 당연히 양손으로 지지할 것이다. Android 에서 각 활성 작업 모드는 활동 공급자 (프로필 ...) 및 활성 소비자 (의도의 플래그 정보 ...) 가 구성 및 선택할 수 있습니다. 물론 활동에 대한 사용자 제어는 공급자가 허용하는 범위로 제한되며 공급자가 명시적으로 금지하는 모드는 사용할 수 없습니다.

SDK (guide/topics/fundamentals.html # acttask)

응용 프로그램 개발자의 경우

표준 모드는 기본 표준 작업 모드입니다. 다른 요인의 영향을 받지 않고 이 모드를 사용하는 활동은 해당 활동의 인스턴스를 구성하고 호출자의 작업 스택에 추가합니다. 사용 빈도가 보통인 경우, 비용이 많이 드는 활동의 경우, 표준 패턴이 가장 적합하다. 논리가 간단하고 명료하기 때문에 기본 선택이기 때문이다.

반면 SingleTop 모드는 기본적으로 standard 와 동일하며 요청된 활동이 스택의 맨 위에 있는 경우에만 다릅니다. 이때 singleTop 으로 구성된 활동은 더 이상 작업 스택에 새 인스턴스를 구성하지 않고 새 의도를 스택 맨 위의 활동으로 보냅니다. 스택 맨 위의 활동은 onnewitt 를 다시 로드하여 새 의도를 처리할 수 있습니다 (물론 무시할 수도 있음 ...). 이 모드는 스택 맨 위에 있을 때 중복 오버헤드를 줄여 이상한 동작을 방지합니다. 살아 있는 예는 안드로이드가 기본적으로 제공하는 응용 프로그램에서 브라우저의 북마크 활동 (BrowserBookmarkPage) 이 singleTop 을 사용한다는 것이다.

SingleTop 모드는 원래 스택의 논리를 손상시키지만 (스택에 새 요소를 구성하지 않고 스택의 맨 위를 재사용하는 등) 전용 작업을 열지 않습니다. SingleTask 와 singleInstance 는 서로 다른 작업 처리 방법을 사용합니다. SingleTask 로 표시된 최대 하나의 활성 인스턴스가 있으며, 이 인스턴스는 single task 를 루트로 하는 작업에 있습니다. 이 활동에 대한 모든 요청은 해당 활동의 작업으로 점프하여 전개됩니다. SingleTask, 단일 모드의 개념과 마찬가지로 모든 수정 사항은 단일 인스턴스를 기반으로 하며 일반적으로 구축 비용은 높지만 전환 비용은 낮은 활동에 사용됩니다. 이 모델은 안드로이드 소스 코드가 제공하는 응용 프로그램에서 널리 사용되고 있습니다. 가장 일반적인 예는 브라우저 응용 프로그램의 주요 활동 (브라우저 ...) 으로, 현재 탭과 현재 페이지 내용을 표시하는 창입니다. 구축 비용은 높지만 페이지 전환은 여전히 빠르기 때문에 singleTask 에 적합합니다.

이에 비해 singleInstance 가 더 극단적입니다. 대부분의 경우 singleInstance 는 singleTask 와 동일합니다. 유일한 차이점은 singleInstance 의 활동이 스택에서 유일한 활동이라는 것입니다. 만약 다른 활동이 관련된다면, 그것들은 다른 임무로 넘겨질 것이다. 이로 인해 singleInstance 의 활동은 마치 외딴 섬처럼 완전히 블랙박스로, 요청이 어디서 왔는지, 앞으로 누가 수행하는지 신경쓰지 않습니다. 안드로이드의 기본 앱에서는 이런 활동이 거의 없다. 내 개인적인 엔지니어링 관행에서, 나는 사전 빠른 취사 활동에서 그것들을 사용하려고 시도했다. 왜냐하면 나는 빠른 취사 입구가 충분히 편리하다고 생각하기 때문에 (통지에서 클릭 입력), 각종 장소에서 모두 사용되기 때문에 완전히 독립적이어야 한다.

LaunchMode 를 배포 작업에 사용할 수 있는 것 외에도 ,

과정

대부분의 다른 플랫폼 개발에서 각 개발자는 자신이 적용한 프로세스 모델에 대해 매우 명확하게 알고 있습니다. 예를 들어, 콘솔 프로그램, 주 함수로부터 프로세스를 시작하여 주 함수로 종료하고 프로세스가 실행된 후 종료되는 것을 상상할 수 있습니다. UI 프로그램에서 메시지 루프가 실행되는 경우가 많습니다. 종료 메시지가 수신되면 메시지 루프를 종료하여 프로세스를 종료합니다. 프로그램이 실행되는 동안 각 개발자는 시작된 프로세스, 타사 프로세스와의 커뮤니케이션 등과 같이 잘 알고 있습니다. 과정 경계, 여기, 국경처럼, 통과할 때마다 깊은 흔적을 남깁니다.

안드로이드 프로그램에서 개발자가 직접 감지할 수 있는 것은 종종 임무일 뿐이다. 분명한 것은 어셈블리 경계이고, 프로세스 경계는 종잡을 수 없게 되어, 프로세스 호스팅까지 모두 말했다. (윌리엄 셰익스피어, 템플릿, 프로세스, 프로세스, 프로세스, 프로세스, 프로세스) 안드로이드는 손으로 메모리를 위조할 수 있는 권력을 박탈할 뿐만 아니라 손으로 주저없이 프로세스를 처리할 수 있는 권한을 독점했다.

물론, 안드로이드는 과정의 세부 사항을 숨기고, 고의적인 것이 아니라 자연스러운 것이다. 전통적인 응용 프로그램을 프로세스 지향 개발이라고 부르는 경우 Android 에서 하는 것은 구성 요소 지향 개발입니다. 앞의 내용에서 알 수 있듯이 안드로이드 구성 요소 간의 점프와 통신은 모두 제 3 자의 개입을 전제로 이루어진다. 이러한 개입으로 인해 일반적으로 두 구성 요소는 직접 연락하지 않습니다 (서비스와의 통신에는 타사 개입이 필요하지 않으므로 Android 는 프로세스 경계를 넘어 RPC 를 기반으로 통신하여 프로세스의 세부 사항을 가린다 ...). 프로세스 경계를 넘나드는지 여부는 중요하지 않습니다. 따라서 개발자가 이때 프로세스에 주의를 기울여야 한다면 매우 이상하고 난해하게 될 것이다. 간단히 말해서, Android 는 모든 프로세스를 함께 호스팅하며, 상위 계층은 프로세스의 생사와 통신 세부 사항을 알 필요가 없습니다.

Android 의 맨 아래에서 프로세스는 작업의 활성 구성 요소뿐만 아니라 다른 세 가지 구성 요소인 서비스, 컨텐츠 제공자 및 브로드캐스트 수신자가 모두 기본 프로세스에서 실행되는 실행 풀을 구성합니다. 여기서 프로세스는 리소스 풀과 더 비슷합니다. (개념은 스레드 풀과 같고, 상위 계층은 어느 구성 요소의 작동을 호스팅하기 위해 필요한 경우에만 하나를 제거합니다.) 각 구성 요소의 직접적인 논리적 관계는 신경 쓰지 않습니다. 그러나 무결성을 보장하기 위해 기본적으로 Android 는 동일한 작업 및 응용 프로그램의 모든 구성 요소를 동일한 프로세스에 던지는 경향이 있다고 상상할 수 있습니다. 물론 효율성을 위해 Android 는 개발자가 구성할 수 있도록 합니다.

안드로이드 시스템의 경우, 전반적으로

통과를 제외하고

Android 시스템은 개발자가 프로세스를 호스팅할 수 있도록 도와주므로 복잡한 알고리즘이 필요합니다. 안드로이드의 각 프로세스의 생사는 실행 중인 구성 요소와 밀접한 관련이 있습니다. 구성 요소의 특성에 따라 우선 순위 시스템에 프로세스를 예약하고 재활용이 필요한 경우 낮은 우선 순위에서 높은 우선 순위까지 재활용합니다. 안드로이드 프로세스 * * * 는 포그라운드 프로세스, 보이는 프로세스, 서비스 프로세스, 백그라운드 프로세스 및 빈 프로세스의 다섯 가지 우선 순위 범주로 나뉩니다. 이름에서 알 수 있듯이, 사용자 운영과 긴밀하게 연결될수록 사용자와의 상호 작용이 많아지고 우선 순위가 높을수록 재활용하기가 더 어렵다는 것을 알 수 있습니다. 자세한 내용은 guide/topics/fundamentals.html # proclife 를 참조하십시오.

우선 순위로, 우리는 또한 좋은 재활용 기회가 필요하다. 조기 재확보 및 캐시 적중률이 낮으면 지속적인 생성 프로세스 손상 프로세스가 발생할 수 있으며 풀의 이점이 사라질 수 있습니다. 재활용이 너무 늦어서 전체 비용이 많이 들고 시스템 운영 효율성이 떨어집니다. 좋은 페라리는 QQ 빈티지 자동차로 파괴 될 수 있습니다. Android 의 프로세스 복구에서 가장 중요한 것은 메모리 비용 및 전력과 같은 기타 리소스를 고려하는 것입니다. 또한 각 프로세스가 호스팅하는 구성 요소 수와 단일 응용 프로그램에서 열린 프로세스 수도 측정의 중요한 지표입니다. 또한 일부 런타임 시간 오버헤드도 엄격하게 모니터링되어 느린 프로세스를 시작하면 강제로 사망합니다. Android 는 이러한 매개변수를 정기적으로 점검하고 프로세스 재활용이 발생할 수 있는 시점 (예: 구성 요소 실행 후) 에 재활용을 시도합니다.

사용자 경험의 관점에서 볼 때, Android 의 프로세스 메커니즘은 매우 만족스러운 면을 가질 수 있다. 일부 프로그램은 시작이 느리지만, 자원이 풍부한 상황에서 퇴출하고 재사용하면 시작이 매우 빨라질 수 있습니다 (프로세스가 죽지 않고 백그라운드에서 프런트까지). 이는 프로세스 호스팅에 감사해야 합니다. 물론 다른 쪽은 슬프다. 안드로이드의 호스팅 알고리즘은 수시로 유치한 모습을 보여준다. 분명히, 사용자는 운영 체제의 속도가 떨어지는 것을 분명히 느꼈다. 그들이 임무 관리자를 열었을 때, 한 표의 앱이 여전히 펄펄 뛰는 것을 보았을 때, 그들이 생명을 끝내고 무덤을 찾도록 수동으로 도와야 했기 때문에, 임무 관리자는 기본적으로 안드로이드의 필수 설치 소프트웨어가 되었다.

개발의 관점에서 Android 의 프로세스 메커니즘은 개발자의 손발을 해방시켰다. 개발자는 일부러 백그라운드 프로세스를 만들어 몰래 어느 시간을 감청할 필요가 없고, 각종 수호 수단을 통해 자신의 과정을 한 마리 불멸의 새처럼 단조하려고 할 필요가 없다. (윌리엄 셰익스피어, 햄릿, 지혜명언) 프로세스 생사의 문제는 이미 일반 개발자가 관리해야 할 범위 내에서 설명되었다. 그러나 동시에, GC 와 인간 메모리 관리 사이의 분쟁과 마찬가지로, 모든 개발자들은 알고리즘이 자신보다 더 효율적이고 더 좋을 수 있다고 믿지 않는다. 그러나 나는 항상 알고리즘의 지속적인 개선과 하드웨어의 지속적인 개선으로 효율성의 모든 이점이 사라질 것이라고 믿었으며 개발 모델의 단순성 만 시간이 지남에 따라 변하지 않을 것입니다.

어셈블리 라이프 사이클

아키텍처의 모든 변화는 상위 개발 모델의 변화로 이어질 수 있습니다. Android 의 프로세스 모델을 통해 개발자는 프로세스 생성 및 삭제의 시점을 면밀히 주시할 필요가 없지만 이러한 시점이 어셈블리에 미치는 영향에 주의를 기울여야 합니다. 예를 들어 프로세스가 삭제되기 전에 메모리에 기록된 내용을 하드 드라이브에 지속해야 할 수 있으므로 프로세스가 종료되기 전에 몇 가지 이벤트에 주의를 기울여야 합니다.

Android 에서 이러한 시점을 파악하려면 구성 요소의 라이프 사이클을 이해해야 합니다. 구성 요소의 라이프 사이클이란 구성 요소가 포그라운드와 백그라운드에서 전환되고, 사용자에 의해 생성 및 종료되고, 시스템에 의해 회수될 때 해당 구성 요소에 알림이 발생하며, 개발자는 해당 시점에서 이러한 이벤트를 선택적으로 처리하여 추가 작업을 수행할 수 있습니다.

컨텐츠 제공자를 제외한 모든 구성 요소에는 라이프 사이클의 개념이 있으며, 이 모델에 따라 정기적으로 규칙적으로 처리해야 합니다. 모든 내용은 guide/topics/fundamentals.html # l cycles 를 참조하십시오. 여기서 먼저 도둑을 잡을까, 아니면 활동을 모델로 할까.

SDK 에서 그림을 계속 훔칩니다. 자연활동 생명의 여정은 창조부터 파멸의 끝까지이다. (조지 버나드 쇼, 인생명언) 그러나, 달은 맑고 둥글고 결핍되어, 구성 요소가 위태롭다. 시스템이 필요할 때, 구성 요소가 백그라운드에 있으며, 그 과정은 국가를 위해 희생될 수 있으며, 언제든지 재활용될 수 있기 때문에, 이를 통해 어떻게 무대 뒤로 들어갈 수 있는지를 아는 것이 매우 중요해질 수 있습니다. (데이비드 아셀, Northern Exposure (미국 TV 드라마)

OnResume 함수는 구성 요소가 스택 맨 위에 들어가 사용자와 상호 작용할 때 호출됩니다. 마찬가지로 스택 맨 위를 종료하면 onPause 함수가 호출됩니다. OnResume 과 onPause 는 많은 일을 처리할 수 있다. 가장 일반적인 것은 일부 파일이나 설정을 읽고 쓰는 것이다. 이 구성 요소가 더 이상 포그라운드에서 실행되지 않을 때 다른 구성 요소는 동일한 파일과 설정을 읽고 써야 할 수 있기 때문입니다. Resume 에서 업데이트 작업을 하지 않으면 더티 데이터를 사용할 수 있습니다 (물론 구체적인 경우 구체적인 분석이 필요합니다. 많은 사람이 파일을 읽고 쓸 수 없다면 onCreate 에 넣어 읽기 작업을 할 수 있다.

위에서 언급한 무대 뒤에서 다른 구성 요소에 의해 괴롭힘을 당할 수 있는 문제 외에도 원인 불명의 사망도 무서운 일이다. Android 에서 구성 요소의 일반적인 죽음은 두 가지입니다. 하나는 자연사입니다. 예를 들어 스택 요소 ABC 가 AB 가 되면 C 성분은 자연히 죽는다. 이런 사법은 홍모처럼 가벼워서 추가적인 보살핌이 필요하지 않다. 그러나 또 다른 경우에는 체제에 의해 재활용되고, 태산처럼 중사하고, 나라를 위해 목숨을 바쳤다.

그러나 이런 사법은 사용자들을 더욱 난해하게 한다. 게임이 구해낼 수 없다고 상상해보세요. 너는 이미 3 일과 3 박 동안 놀았는데, 눈을 붙이지 못했다. 이때 너의 mm 이 전화를 걸어 너를 격려했다. 당신은 정력이 넘치고, 더 열심히 할 준비가 되어 있지만, 당신의 게임 과정을 발견하고, 무대 뒤로 들어간 후, 시스템에 의해 회수되고, 하룻밤 사이에 해방되기 3 일 전의 거품이 되려고 합니다. 당신은 이 게임을 하는 사람을 죽이고 싶습니까? 그럴거야? 이때, 활동주기가 없다면 게임 프로그래머는 억울하게 죽어서 안드로이드의 희생양이 된 것이 틀림없다. 그러나 안드로이드 구성 요소에는 라이프 사이클이 있습니다. 이런 상황이 발생하면 주저하지 말고 개발자를 죽여라.

도피를 위해 프로그래머는 안드로이드의 상태 메커니즘인 면제금메달을 가지고 있다. 상태란 개발자가 현재 실행 상태 정보 중 일부를 직렬화 가능한 키 값 쌍의 모음인 Bundle 객체에 저장하는 것입니다. 활성 구성 요소의 프로세스를 재활용해야 하는 경우 Android 커널은 그 위에 있는 활성 구성 요소의 Bundle 개체를 디스크에 지속시킵니다. 사용자가 활성으로 돌아오면 구성 요소가 재구성되고 디스크에 영구적으로 저장된 패키지 개체가 복구됩니다. 이러한 지속적인 상태 정보를 통해 개발자는 특정 사망 방법을 잘 구분하고 사망 상태에서 사망 전 상태로 활동을 되돌릴 수 있는 기회를 가질 수 있습니다. 개발자가 해야 할 일은 유지 관리가 필요한 상태 정보 (기본적으로 시스템 컨트롤은 TextView 와 같은 관련 상태 정보를 자체적으로 저장하고, 현재 텍스트 정보를 저장하며, 개발자는 걱정하지 않아도 됩니다 ...) 를 Bundle 객체에 작성한 다음 onSaveInstanceState 함수에서 관련 정보 (OOS

데이터 읽기, 백그라운드 처리, 이런 저속한 녀석들은 당연히 스레드의 참여를 빼놓을 수 없다. Android 코어의 일정 수준에서 스레드를 고려하지 않습니다. 프로세스에만 초점을 맞추고 각 구성 요소의 구성 및 처리는 프로세스의 주 스레드에서 수행되므로 논리가 충분히 단순함을 보장할 수 있습니다. 멀티 스레딩은 일반적으로 개발자가 해야 할 일이다.

Android 의 스레드도 Java 를 파생하는 스레드 객체를 통해 Run 메소드를 구현함으로써 구현됩니다. 그러나 사용자가 메시지 루프가 있는 스레드를 실행해야 하는 경우 Android 는 Handler 와 Looper 에서 더 잘 지원됩니다. Handler 는 메시지 전송 및 배포를 수행하고, win 개발처럼 수신된 다양한 메시지를 처리할 수 있는 handleMessage 함수를 파생합니다. Looper 의 임무는 루프를 만들고 종료 또는 기타 메시지가 오기를 기다리는 것입니다. Looper 의 SDK 페이지에는 메시지 루프 스레드 구현의 표준 예가 있습니다. 물론 더 표준적인 방법은 HandlerThread 스레드를 구성하고 Looper 를 처리기에 전달하는 것입니다.

Android 에서 컨텐츠 제공자의 사용은 일반적으로 스레드와 관련이 있으므로 데이터와 관련이 있습니다. 앞서 언급했듯이 컨텐츠 제공자 자체는 더 많은 유연성을 유지하기 위해 동기 호출 인터페이스를 하나만 제공하며, 비동기 추가, 삭제, 수정, 쿼리 컨텐츠 제공자는 일반적인 작업이므로 Android 는 AsyncQueryHandler 객체를 통해 비동기 인터페이스를 제공합니다. 이것은 Handler 의 하위 클래스입니다. 개발자는 startXXX 메서드를 호출하여 작업을 시작할 수 있습니다. onXXXComplete 메서드를 실행하고 실행 후 콜백을 기다리므로 전체 비동기 호출 프로세스를 쉽게 완료할 수 있습니다.

실현

전체 작업 및 프로세스 관리의 핵심 구현은 ActivityManagerService 에 있습니다. 이전 문장 에서 언급했듯이 의도 해결은 이 ActivityManagerService 의 책임입니다. 실제로 이 클래스는 활동의 관리자 서비스라고 하지만 관리 범위에는 활동뿐만 아니라 다른 세 가지 유형의 구성 요소와 해당 프로세스도 포함되기 때문에 명실상부한 클래스입니다. (데이비드 아셀, Northern Exposure (미국 TV 드라마), 활동명언)

ActivityManagerService 에서 가장 눈에 띄는 두 가지 데이터 구조, 즉 ArrayList 와 HashMap 이 있습니다. ActivityManagerService 에는 많은 ArrayList 가 있으며 각 구성 요소에는 여러 ArrayList 가 서로 다른 상태로 저장됩니다. 스케쥴링 작업은 종종 한 배열 목록에서 꺼내서 조정할 방법을 강구하여 다른 배열 목록에 던지는 경우가 많다. 이 구성 요소에 해당하는 ArrayList 가 없으면 죽음에서 멀지 않은 것입니다. HashMap 는 일부 구성 요소가 이름 또는 의도 정보 (예: 컨텐츠 제공자) 를 통해 찾아야 하기 때문에 Uri 를 기반으로 검색이 이루어지기 때문입니다. HashMap 으로, 모든 것이 논리적이다.

ActivityManagerService 는 xxxRecord 라는 데이터 구조를 사용하여 나머지 구성 요소를 나타냅니다. 그래서, HistoryRecord (활동 정보 저장, 그래서 역사, 작업 스택과 관련된 ...), ServiceRecord, BroadcastRecord, ContentProviderRecord, Tata

주목할 만한 것은 TaskRecord 입니다. 우리는 항상 임무 스택의 개념을 말했지만, 실제 밑바닥은 태스크 레드에서 활동 스택을 유지하지 않는다. ActivityManagerService 에서 각 작업의 활동은 ArrayList 에 HistoryRecord 로 저장되고 각 HistoryRecord 는 해당 TaskRecord 에 대한 참조를 저장합니다. 활동이 실행되어 개념 임무 스택을 종료할 때 현재 HistoryRecord 위치에서 동일한 TaskRecord 의 HistoryRecord 를 스캔하여 Android 를 완료합니다. 이러한 설계는 많은 상층 논리가 복잡한 임무 시스템을 통일하고 간결하게 만들어 주며, 매우 귀중한 것이다. (윌리엄 셰익스피어, 윈스턴, 과학명언)

ProcessRecord 는 전체 프로세스 호스팅 구현의 핵심이며 이 프로세스에서 실행되는 모든 구성 요소에 대한 정보를 포함합니다. 이 정보에 따르면, 시스템은 이 과정을 어떻게 처리할지 결정하는 알고리즘을 가지고 있다. 재활용 알고리즘에 관심이 있으면 ActivityManagerService 의 trimApplications 함수로 시작할 수 있습니다.

개발자에게 이 부분의 구현을 이해하면 전체 프로세스와 작업의 개념을 이해하는 데 도움이 됩니다. 만약 당신이 이 이해가 분명하다고 생각한다면, 그 거대한 물건인 ActivityManagerService 를 만질 필요가 없습니다.

= = = = = = = = = = = = = = = = = = =

이것은 복제되어 1 층보다 기분이 좋다.

= = = = = = = = = = = = = = = =

너 자신이야.

서비스를 사용하기 전에 구성해야 합니다.

먼저 스레드 사용을 말하지 않습니다.

Hanler 는 메시지 큐에 사용되는 것으로, handler 는 컨트롤의 표시와 스레드 간의 통신을 업데이트하는 데 사용할 수 있습니다.

서비스는 백그라운드에서만 시작할 수 있으며 응용 프로그램 구성 요소 중 하나에 속합니다.