Android2011. 9. 22. 23:28

Activity를 이것 저것 띄우고 닫고 하다보면, 과연 내가 잘 하고 있나? 불안할 때가 있다.
더구나, 인텐트에 액티비티 관련 플래그를 사용하기 시작하면 그 불안감은 고조된다.

실제로 단 3개의 Activity가  destroy()되지 않은 채, 19개가 되는 현상을 겪었다. -0-a
물론, Activity의 생명주기를 로그로 찍어서 확인하는 것도 좋겠지만,
그래도 딱! Activity Stack의 모습을 볼 수 있으면 좋겠다는 생각에 방법을 찾아봤다.


* 방법 : 커멘드 창에서 "adb shell dumpsys activity" 실행

매우 긴 영문들이 뒤섞여 보인다.
처음에는 매우 난감했지만, Activity를 이래저래 띄우면서 테스트 한 결과에 의하면,
"Activity Stack"과 "Running Activities" 부분을 보면 된다.

"Activity Stack"에는 스택 순서대로 Hist #2, Hist #1, Hist #0 순으로 표기되어 있다.
즉, 단말기의 [이전]버튼을 누르면 ActivityA가 닫히고, 한 번 더 누르면 MainActivity가 닫힌다.

작업하는 중간중간에 다시 실행시켜보면, 정확히 화면에 보이는 Activity가 "Activity Stack" 로그의 최상위에 보여지게 된다.

Hist #0는 보통 안드로이드 런처(홈) Activity이다.



C:\Users\Juno>adb shell dumpsys activity


   ... 중략 ...

  

  Activity stack:

  * TaskRecord{461e6d10 #42 A com.juno.activitytest}

    clearOnBackground=false numActivities=2 rootWasReset=false

    affinity=com.juno.activitytest

    intent={act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10000000 cmp=com.juno.activitytest/.MainActivity}

    realActivity=com.juno.activitytest/.MainActivity

    lastActiveTime=6762895 (inactive for 6s)

    * Hist #2: HistoryRecord{46096400 com.juno.activitytest/.ActivityA}

        packageName=com.juno.activitytest processName=com.juno.activitytest

        launchedFromUid=10026 app=ProcessRecord{461537b0 1050:com.juno.adpd.activitytest/10026}

        Intent { flg=0x20000000 cmp=com.juno.activitytest/.ActivityA (has extras) }

        frontOfTask=false task=TaskRecord{461e6d10 #42 A com.juno.livepoint}

        taskAffinity=com.juno.activitytest

        realActivity=com.juno.activitytest/.ActivityA

        base=/data/app/com.juno.activitytest-1.apk/data/app/com.juno.activitytest-1.apk data=/data/data/com.juno.activitytest

        labelRes=0x7f080000 icon=0x7f02000e theme=0x1030006

        stateNotNeeded=false componentSpecified=true isHomeActivity=false

        configuration={ scale=1.0 imsi=0/0 loc=ko_KR touch=3 keys=1/1/2 nav=2/1orien=2 layout=34 uiMode=17 seq=2}

        launchFailed=false haveState=false icicle=null

        state=RESUMED stopped=false delayedResume=false finishing=false

        keysPaused=false inHistory=true persistent=false launchMode=0

        fullscreen=true visible=true frozenBeforeDestroy=false thumbnailNeeded=false idle=true

    * Hist #1: HistoryRecord{46130618 com.juno.activitytest/.MainActivity}

        packageName=com.juno.activitytest processName=com.juno.activitytest

        launchedFromUid=2000 app=ProcessRecord{461537b0 1050:com.juno.activitytest/10026}

        Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10000000 cmp=com.juno.activitytest/.MainActivity }

        frontOfTask=true task=TaskRecord{461e6d10 #42 A com.juno.activitytest}

        taskAffinity=com.juno.activitytest

        realActivity=com.juno.activitytest/.MainActivity

        base=/data/app/com.juno.activitytest-1.apk/data/app/com.juno.activitytest-1.apk data=/data/data/com.juno.activitytest

        labelRes=0x7f080000 icon=0x7f02000e theme=0x1030006

        stateNotNeeded=false componentSpecified=true isHomeActivity=false

        configuration={ scale=1.0 imsi=0/0 loc=ko_KR touch=3 keys=1/1/2 nav=2/1orien=2 layout=34 uiMode=17 seq=2}

        launchFailed=false haveState=true icicle=Bundle[mParcelledData.dataSize=812]

        state=STOPPED stopped=true delayedResume=false finishing=false

        keysPaused=false inHistory=true persistent=false launchMode=0

        fullscreen=true visible=false frozenBeforeDestroy=false thumbnailNeeded=false idle=true

  * TaskRecord{461626c0 #2 A com.android.launcher}

    clearOnBackground=true numActivities=1 rootWasReset=true

    affinity=com.android.launcher

    intent={act=android.intent.action.MAIN cat=[android.intent.category.HOME] flg=0x10600000 cmp=com.android.launcher/com.android.launcher2.Launcher}

    realActivity=com.android.launcher/com.android.launcher2.Launcher

    lastActiveTime=6749602 (inactive for 19s)

    * Hist #0: HistoryRecord{4615d870 com.android.launcher/com.android.launcher2.Launcher}

        packageName=com.android.launcher processName=com.android.launcher

        launchedFromUid=0 app=ProcessRecord{46162bb0 2292:com.android.launcher/10012}

        Intent { act=android.intent.action.MAIN cat=[android.intent.category.HOME] flg=0x10000000 cmp=com.android.launcher/com.android.launcher2.Launcher }

        frontOfTask=true task=TaskRecord{461626c0 #2 A com.android.launcher}

        taskAffinity=com.android.launcher

        realActivity=com.android.launcher/com.android.launcher2.Launcher

        base=/system/app/Launcher2.apk/system/app/Launcher2.apk data=/data/data/com.android.launcher

        labelRes=0x7f0c0002 icon=0x7f02005a theme=0x7f0d0000

        stateNotNeeded=true componentSpecified=false isHomeActivity=true

        configuration={ scale=1.0 imsi=0/0 loc=ko_KR touch=3 keys=1/1/2 nav=2/1orien=2 layout=34 uiMode=17 seq=2}

        launchFailed=false haveState=true icicle=Bundle[mParcelledData.dataSize=4480]

        state=STOPPED stopped=true delayedResume=false finishing=false

        keysPaused=false inHistory=true persistent=false launchMode=2

        fullscreen=true visible=false frozenBeforeDestroy=false thumbnailNeeded=false idle=true



  Running activities (most recent first):

    TaskRecord{461e6d10 #42 A com.juno.activitytest}

      Run #2: HistoryRecord{46096400 com.juno.activitytest/.ActivityA}

      Run #1: HistoryRecord{46130618 com.juno.activitytest/.MainActivity}

    TaskRecord{461626c0 #2 A com.android.launcher}

      Run #0: HistoryRecord{4615d870 com.android.launcher/com.android.launcher2.Launcher}


  mPausingActivity: null

  mResumedActivity: HistoryRecord{46096400 com.juno.activitytest/.ActivityA}

  mFocusedActivity: HistoryRecord{46096400 com.juno.activitytest/.ActivityA}

  mLastPausedActivity: HistoryRecord{4614cb90 com.juno.activitytest/.DetailActivity}


  mCurTask: 42


   ... 중략 ...


C:\Users\Juno>



그림으로 그리면, 요런 모습이겠다.



[여담]
이런 로그 메시지를 분석하는 부분은 꽤 자신없는 부분이네요.
혹시나, 잘못된 내용은 가감없이 지적바랍니다.


Update #1

누군가 고맙게도 stack만 추려서 볼 수 있게, 만들어줬네요.

sed 명령어를 사용하려면 GnuWin32를 설치해야합니다.

http://sourceforge.net/projects/getgnuwin32/files/getgnuwin32/


  adb shell dumpsys activity activities | sed -En -e "/Stack #/p " -e "/Running activities/,/Run #0/p"

출처 : http://stackoverflow.com/a/31107447/536078



Posted by 데브로망스