2013-01-10 3 views
25

안드로이드에서 "Setting"-> "App"을 살펴보면 "running"탭 아래에서 메모리가 "used memory"와 "memory free"부분으로 나뉘어져 있음을 알 수 있습니다. "used memory"또는 "memory free"중 하나에 넣습니다. "메모리가없는"부분의 응용 프로그램은 "캐시 된 백그라운드 프로세스"로 표시됩니다.Android에서 실행중인 프로세스와 캐시 된 백그라운드 프로세스의 차이점은 무엇입니까?

"캐시 된 백그라운드 프로세스"란 무엇입니까? 그들은 여전히 ​​"디스크"(데스크톱/랩톱처럼)로 전환하기보다는 메모리에 있습니다. 맞습니까? 사용자가 이러한 "캐시 된 백그라운드 프로세스"중 하나를 탭하면 실행중인 프로세스와 마찬가지로 여전히 메모리에 그대로 표시됩니다.

Android는 애플리케이션을 "캐시"할 때 무엇을합니까?

답변

40

"캐시 된 백그라운드 프로세스"란 무엇입니까?

기기 UI에 나열된 항목에 대한 기술적 인 해석을 요청하는 경우 기기 제조업체가 설정 앱을 사용하도록 선택한 경우 기기에 따라 정의가 다를 수 있습니다.

"캐시 된 백그라운드 프로세스"는 일반적으로 전경 활동이없고 실행중인 서비스가없는 프로세스를 나타냅니다. 이러한 프로세스는 메모리가 충분하기 때문에 단순히 메모리에 저장되므로 사용자는 이러한 프로세스로 신속하게 전환 할 수 있습니다. 안드로이드는 아직 다른 프로세스를 위해 더 많은 시스템 RAM을 필요로하기 때문에 캐시 된 백그라운드 프로세스는 시스템 RAM을 확보하기 위해 종료되는 프로세스 인 경향이 있습니다.

"캐시 된 백그라운드 프로세스"의 탁월한 예는 사용자가 앱을 시작한 후 앱을 잠깐 찔렀다가 홈을 눌러 홈 화면으로 돌아가는 앱입니다. 프로세스에 실행중인 서비스가 없으면 "캐시 된 백그라운드 프로세스"로 나열됩니다.

그들은 여전히 ​​"디스크"(데스크톱/랩톱처럼)로 전환하지 않고 메모리에 남아 있습니다. 맞습니까?

수정. Android 기기는 스왑 공간을 사용하지 않습니다.

+0

좋은 설명! 또한 응용 프로그램에서 사용하는 일부 데이터가 응용 프로그램을 캐싱 할 때 손실 될 수 있음을 확인했습니다. 예 : Youbute 비디오를 본 다음 "Home"버튼을 누른 다음 비디오로 다시 전환하여 처음부터로드가 시작되었음을 알았습니다. 이 말이 맞습니까? – JackWM

+0

@JackWM : 그것은 앱과 작성 방법에 따라 다릅니다. – CommonsWare

+0

좋아요,이 말은 앱 작성자가 지정 했습니까? "onPause()"함수를 통해? 캐시되는 동안 앱이 유지할 수있는 데이터 크기에 대한 요구 사항이 있습니까? – JackWM

17

"Setting" app's source code을 살펴 보지 않겠습니까?

Nexus 4에서 '설정'-> '앱'-> '실행 중'은 다음과 같습니다. 시작하기 전에 enter image description here


enter image description here

, 안드로이드 프로세스의 중요성 계층 구조의 다섯 단계가 있습니다.이 있습니다

1) 전경 과정,
2) 눈에 보이는 과정,
3) 서비스 프로세스,
4) 배경 과정,
5) 빈 과정

당신은 찾을 수 있습니다 더 "Processes and Threads" document in Android Developer site의 세부 정보

내가 코드에보고했고,이 "SHOW 캐시 된 프로세스를"밝혀졌다 그 과정을 보여줍니다 그 중요성 계층 구조 "백그라운드 프로세스" 같거나 낮은 . 한편 "SHOW RUNNING SERVICES"은 중요도 계층이 "Visible process"이상인 또는 그 이상의 값인을 보여줍니다. 나는 요점을 명확하게 보여주기 위해 세부 사항을 생략했다. 이 부분의 전체 소스 코드는 here입니다. 그래서, 다시 질문
try { 
     final int numProc = mAllProcessItems.size(); 
     int[] pids = new int[numProc]; 
     for (int i=0; i<numProc; i++) { 
      pids[i] = mAllProcessItems.get(i).mPid; 
     } 

     ... 

     for (int i=0; i<pids.length; i++) { 
      ProcessItem proc = mAllProcessItems.get(i); 
      changed |= proc.updateSize(context, pss[i], mSequence); 
      if (proc.mCurSeq == mSequence) { 
       serviceProcessMemory += proc.mSize; 
      } else if (proc.mRunningProcessInfo.importance >= 
        ActivityManager.RunningAppProcessInfo.IMPORTANCE_BACKGROUND) { 
       backgroundProcessMemory += proc.mSize; 
       MergedItem mergedItem; 
       if (newBackgroundItems != null) { 
        mergedItem = proc.mMergedItem = new MergedItem(proc.mUserId); 
        proc.mMergedItem.mProcess = proc; 
        diffUsers |= mergedItem.mUserId != mMyUserId; 
        newBackgroundItems.add(mergedItem); 
       } else { 
        ... 
       } 

       ... 

      } else if (proc.mRunningProcessInfo.importance <= 
        ActivityManager.RunningAppProcessInfo.IMPORTANCE_VISIBLE) { 
       foregroundProcessMemory += proc.mSize; 
      } 
     } 
    } catch (RemoteException e) { 
    } 


,

그들은 여전히 ​​메모리에보다는 "디스크"로 전환 (데스크탑/노트북처럼), 맞죠?

예, 그들은 메모리 여전히 있지만, 결국 안드로이드 시스템은 신규 또는 더 중요 프로세스에 대한 메모리를 회수하는 오래된 프로세스를 제거해야 할 수 있습니다. 유지할 프로세스와 종료 할 프로세스를 결정하기 위해 시스템은 각 프로세스를 "중요도 계층 구조"에 배치합니다.

"캐시 된 백그라운드 프로세스"중 하나를 탭하면 실행중인 프로세스와 마찬가지로 여전히 메모리에 그대로 표시됩니다. 맞습니까?

오른쪽. 예 : the only reason to keep "Empty process" alive is to improve startup time the next time a component needs to run in it.

Android는 애플리케이션을 "캐시"할 때 무엇을합니까?

AFAIK, 은 단순히 프로세스를 종료하고 그/그녀가 돌아 오면 즉시 사용자에 대응하는 자원을 보관하지 않습니다.

+4

설정 소스 코드를 파고 주셔서 감사합니다 :) – Cong

+2

와우, 놀라운, 고마워! :) – Javatar

+0

내가 청소기 애플 리케이션을 가지고 그 프로세스를 실행하는 방법의 캐시를 공개하는 방법을 어떻게 할 수 있습니다 당신은 내가 말할 수있는 pls는 내가 캐시 크기를 프로세스 및 릴리스 캐시 크기를 찾을 수 있습니까? @ Javatar @ congliu – Erum

1

프로세스는 안드로이드 운영 체제가 가능한 한 오래 을 위해 실행되는 응용 프로그램을 유지하려고

위, 그러나 사용 가능한 메모리가 부족하면, 그것은을 죽이는하여 시스템의 리소스를 시도 할 것이다 중요도가 낮은 프로세스 frst.

이것은 프로세스 순위가 그림에 올 때입니다. 안드로이드 프로세스 는 낮은 우선 순위에 더 높은 우선 순위에서 다음 FVE 부문에서 순위가 ​​결정됩니다 :

  • 전경 과정 : 이것은 사용자가 현재와 상호 작용 활동 또는 서비스를 호스팅하는 프로세스입니다 서비스는 포 그라운드에서 시작하거나 서비스는 라이프 사이클 콜백
  • 보이는 과정
  • 을 실행 :이 눈에 띄는 활동에 경계를 일시 중지 활동이나 서비스 를 호스팅하는 과정이다
  • 서비스 프로세스 : 이것은 가시적 인 활동 인 에 바인딩되지 않은 서비스를 호스트하는 프로세스입니다.
  • 백그라운드 프로세스 : 보이지 않는 작업을 호스팅하는 프로세스입니다. 모든 백그라운드 프로세스 따라서, 가장 최근에 사용 된 프로세스가 마지막으로 살해 과정이며, 최소 - 최근에 사용한 (LRU)리스트를 분류 할 때 그들은
  • 빈 과정 :이 비활성 캐시하는 데 사용하는 과정이다 안드로이드 구성 요소 및 시스템이 리소스를 해제 할 필요가있는 지점에 도달하면 모든 구성 요소 시작 시간

을 개선하기 위해 사용할 수 계정 프로세스 순위를 고려하여 정렬됩니다 살해되는 과정은, 지난 을 사용 프로세스 및 실행중인 구성 요소.

소스 :

비동기 안드로이드 프로그래밍 - 두 번째 에디션 - 헬더 바스 콘셀 로스 - 2016년 7월

관련 문제