Android 프로세스 및 스레드 상세 정보

5526 단어
프로그램 구성 요소가 시작되고 프로그램이 다른 구성 요소가 실행되지 않을 때, 안드로이드 시스템은 이 프로그램에 새로운 리눅스 프로세스를 시작하고 메인 라인을 실행합니다.기본적으로 같은 프로그램의 모든 구성 요소는 같은 프로세스의 주 라인에서 실행됩니다.프로그램 구성 요소가 시작되고 프로그램의 프로세스가 이미 존재하면 (프로그램의 다른 구성 요소가 시작되었기 때문에) 구성 요소는 이 프로세스에서 시작되고 같은 주 루트를 사용합니다.단, 프로그램의 다른 구성 요소를 각각 다른 프로세스에서 실행할 수 있도록 설정하고, 모든 프로세스에 다른 루트를 만들 수 있습니다.이 문서에서는 Android 응용 프로그램에서 프로세스와 스레드가 어떻게 작동하는지 설명합니다.
Processes
기본적으로 같은 프로그램의 모든 구성 요소가 같은 프로세스에서 실행되며, 대부분의 프로그램은 이 설정을 변경할 필요가 없습니다.단, 특정한 프로세스에 구성 요소를 설정하려면 manfest 파일에서 실행할 수 있습니다.
모든 구성 요소 요소 (activity, 서비스,receiver,provider) 는android:process 속성을 지원하며, 이 구성 요소가 어느 프로세스에서 실행되는지 지정합니다.이 속성을 설정하면 모든 구성 요소가 자신의 프로세스에서 실행되거나, 일부 구성 요소는 프로세스를 공유하지만, 다른 구성 요소는 프로세스를 공유하지 않습니다.다른 프로그램의 구성 요소가 같은 프로세스에서 실행될 수 있도록 android:process를 설정할 수 있습니다. 전제는 프로그램이 같은 Linuxuser ID를 공유하고 같은 인증서를 사용하여 서명하는 것입니다.요소도android:process 속성을 지원하며 모든 구성 요소에 적용되는 기본값을 설정합니다.
메모리가 부족할 때, 안드로이드 시스템은 어느 때kill 프로세스를 통해 사용자에게 더 직접적인 서비스를 제공하는 다른 프로세스가 정상적으로 실행될 수 있도록 할 수 있습니다.kill 프로세스에서 실행된 프로그램 구성 요소가 삭제되었습니다.어셈블리가 다시 작동하면 새 프로세스가 다시 시작됩니다.
Android 시스템은 사용자에 비해 프로세스의 중요성을 따져 어떤 프로세스를 죽일지 결정합니다.예를 들어, Activity 프로세스는 화면에 표시되는 것보다 화면에 표시되지 않는 Activity 프로세스를 닫기 쉽습니다.따라서 프로세스를 종료할지 여부는 프로세스에서 실행되는 어셈블리의 상태에 따라 달라집니다.프로세스 라이프 사이클과 APP 상태 관계에 대한 자세한 내용은 Processes and Application Lifecycle을 참조하십시오.
라인
응용 프로그램이 시작될 때, 시스템은 응용 프로그램의 주 라인을 만듭니다.이 라인은 이벤트를 분배하는widgets를 책임지기 때문에 매우 중요합니다.응용 프로그램과 UI 구성 요소 교환도 주로 주 스레드에서 이루어지기 때문에 주 스레드도 UI 스레드라고 부른다.그러나 특수한 상황에서 프로그램의 주 루틴은 UI 루틴이 아닐 수도 있습니다.자세한 내용은 Thread annotations 를 참조하십시오.
시스템은 구성 요소의 모든 실례에 대해 단독 라인을 만들지 않습니다.같은 프로세스에서 실행되는 모든 구성 요소는 프로세스의 UI 스레드에서 실례화되고 시스템은 UI 스레드에서 각 구성 요소에 대한 호출을 보냅니다.따라서 응답 시스템의 리셋 함수 (예를 들어 onkeydown () 이나 onCreate () 는 프로세스의 UI 라인에서 항상 실행됩니다.예를 들어 사용자가 화면의 버튼을 터치할 때 프로그램의 UI 스레드는 터치 이벤트를 UI 컨트롤에 나누어 주고, 후자는 누르는 상태를 순서대로 설정하고 이벤트 대기열에 잘못된 요청을 보낸다.UI 스레드 체크 아웃 요청 및 UI 컨트롤 다시 그리기 알림
UI 스레드에서 모든 작업을 수행하는 경우 네트워크 액세스나 데이터베이스 조회와 같은 많은 시간이 소요되는 작업을 수행하면 UI 전체가 차단됩니다.라인이 막혔을 때, 그림 그리기 이벤트를 포함한 이벤트를 보낼 수 없습니다.사용자의 입장에서 볼 때 응용 프로그램은 렉이 걸릴 것이다.더 심각한 것은 UI 스레드가 몇 초 이상 막히면 (현재 약 5초) 사용자에게 '프로그램이 응답하지 않음' (ANR) 이라는 대화상자가 팝업된다는 것이다.그리고 사용자는 프로그램을 종료하거나 마운트 해제할 수도 있습니다.
또한 안드로이드 UI toolkit은 스레드가 안전하지 않습니다.따라서 UI는 작업 스레드에서 사용할 수 없으며 UI 스레드에서 사용자 인터페이스를 조작해야 합니다.따라서 Android의 단일 스레드 모델에는 두 가지 규칙이 있다. 첫째, UI 스레드를 막지 말고, 비 UI 스레드에서 UI 컨트롤을 조작하지 마라.
작업 스레드
위에서 설명한 단일 스레드 모델 때문에 UI 스레드를 차단하지 않는 것이 애플리케이션에 매우 중요합니다.만약 실행할 작업이 순간적이지 않다면, 단독 스레드 ('백엔드 스레드' 또는 '작업 스레드') 에서 실행해야 합니다.그러나 UI 스레드 또는 마스터 스레드 이외의 스레드에서는 UI를 업데이트할 수 없습니다.Android는 이 문제를 해결하기 위해 UI 스레드를 다른 스레드에서 액세스하는 몇 가지 방법을 제공합니다.\Activity.runOnUiThread(Runnable) View.post(Runnable) View.postDelayed(Runnable, long)
public void onClick(View v) {
    new Thread(new Runnable() {
        public void run() {
            // a potentially  time consuming task
            final Bitmap bitmap =
                    processBitMap("image.png");
            mImageView.post(new Runnable() {
                public void run() {
                    mImageView.setImageBitmap(bitmap);
                }
            });
        }
    }).start();
}

이 구현은 스레드가 안전합니다. 백엔드는 하나의 단독 스레드에서 작동하고 ImageView는 항상 UI 스레드를 조종합니다.
그러나 조작의 복잡도가 증가함에 따라 이런 코드는 복잡하고 유지하기 어려워질 것이다.UI 스레드와 작업 스레드의 더 복잡한 상호작용을 처리하기 위해서, 작업 스레드에서Handler를 사용하여 UI 스레드에서 전달된 메시지를 처리하는 것을 고려할 수 있습니다.또는 AsyncTask를 사용하여 백그라운드 작업을 수행하고 UI를 업데이트합니다.
AsyncTask 사용
AsyncTask에서는 사용자 인터페이스에서 비동기식 작업을 수행할 수 있습니다.작업 스레드에서 시간이 많이 걸리는 작업을 수행한 다음 UI를 업데이트합니다. 스레드나Handler를 직접 처리할 필요가 없습니다.AsyncTask를 확장하고 DoInBackground () 리셋 방법을 실행해야 합니다. 시작하는 루틴은 백엔드 루틴 풀에서 실행됩니다.UI를 업데이트하려면 onPostExecute () 를 실행해야 합니다.DoInBackground()에서 반환된 결과를 가져오고 UI 스레드에서 UI를 업데이트합니다.그런 다음 UI 스레드에서 excute()를 호출하여 작업을 실행할 수 있습니다.AsyncTask에 대한 자세한 내용은 AsyncTask를 참조하십시오.
스레드 보안 방법
어떤 경우, 당신이 실현하는 방법은 여러 라인에서 호출될 수 있기 때문에, 반드시 라인이 안전하도록 작성해야 합니다.몇몇 방법은 바운드 서비스와 같은 원격 호출이 가능하다.Ibinder가 실행하는 프로세스에서 Ibinder가 실행하는 방법을 호출하면, 방법은 호출자의 라인에서 실행됩니다.그러나 다른 프로세스에서 Ibinder가 실행하는 방법을 호출하면 방법이 실행되는 루틴은 시스템이 유지하는 루틴 탱크에서 만들어지고 Ibinder와 같은 프로세스에 있습니다.예를 들어 서비스의 onBind () 방법은 서비스의 UI 라인에서 호출되고, onBind () 가 되돌아오는 대상의 방법은 라인 풀에서 만든 라인에서 호출됩니다.서비스는 여러 개의 클라이언트가 있고 여러 개의 라인이 같은 Ibinder 방법을 동시에 사용할 수 있기 때문에 Ibinder 방법은 라인이 안전해야 한다.
이와 유사하게 콘텐츠 공급자는 다른 프로세스로부터 데이터 요청을 받을 수 있습니다.Content Resolver와 Content Provider 클래스는 프로세스 간의 통신을 어떻게 관리하는지 숨기지만, Content Provider의query (), insert (), delete (), update (), get Type () 등 방법은 content provider가 있는 프로세스의 스레드 탱크에서 호출됩니다.이러한 방법은 임의의 수량의 라인에서 동시에 호출할 수 있기 때문에 그것들도 반드시 라인이 안전하도록 실현해야 한다.
프로세스 간 통신
Android는 원격 프로세스 호출(RPC)을 사용하여 프로세스 간 통신 메커니즘(IPC),Activity 또는 다른 응용 프로그램 구성 요소 호출 방법을 제공하지만 다른 프로세스에서 실행하고 실행한 후에 결과를 호출자에게 되돌려줍니다.운영체제가 이해하고 로컬 프로세스와 주소 공간에서 원격 프로세스와 주소 공간으로 전달할 수 있도록 분해 방법과 데이터가 필요합니다.값을 되돌려서 반대 방향으로 전송합니다.안드로이드는 IPC를 실현하는 모든 코드를 제공하기 때문에 RPC 프로그래밍 인터페이스를 정의하고 실현하는 데 중점을 둘 수 있습니다.IPC를 실행하려면, 응용 프로그램이bindService () 를 사용하여 서비스에 연결되고, bind 서비스 () 를 사용해야 합니다. 더 많은 정보는 서비스 개발 안내서를 참고하십시오.

좋은 웹페이지 즐겨찾기