乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      android 查看 當(dāng)前activity

       WindySky 2016-03-01

      談起Android程序開發(fā),就需要了解其四個(gè)主要的部件ActivityService、ContentProvider、 BroadcastReceiver。而其中Activity是唯一直接控制程序界面呈現(xiàn),直面用戶操作的部件(當(dāng)然BrowadCastReceiver也能通過桌面控件(App Widgets)來呈現(xiàn)有限的操作界面)。Android對(duì)于Activity有嚴(yán)格的生命周期控制,以限制開發(fā)者在適當(dāng)?shù)幕卣{(diào)函數(shù)里的放上合適的代碼。對(duì)于多個(gè)Activity的轉(zhuǎn)換,Android也有非常好的管理和流暢的切換,對(duì)此Android還引入了任務(wù)棧(Task Stack)的概念,這個(gè)概念對(duì)于Android設(shè)備上得返回按鍵有極其重要的聯(lián)系。

      (大部分文檔都將其表述為Tasks and Back Stack,但從官方文檔的描述來看,Android的相對(duì)于Activity講到的Task都視為一個(gè)存放Activities的Stack,所以將其稱為Task Stack也不為過。)

      在AndroidManifest中申明所要用到的Activity時(shí)可以設(shè)置不同的launchMode來得到不同的Activity“啟動(dòng)”效果。在使用startActivity開啟新的Activity時(shí),傳入的Intent也可以設(shè)置不同的Flag來達(dá)到不同的效果。另一方面,在Activity啟動(dòng)時(shí)它可能又開啟了另一個(gè)Activity,或者調(diào)用了finish()函數(shù)終結(jié)了Activity。

      這使得Activity棧變得無法掌握,有時(shí)候按下返回按鈕或者點(diǎn)擊關(guān)閉當(dāng)前Activity的操作,都不知道Android系統(tǒng)會(huì)把程序帶到那個(gè)Activity,不確定這是否是最后一個(gè)Activity以致退出了整個(gè)程序。亦或者一些按鈕和操作循環(huán)產(chǎn)生Activity而造成內(nèi)存膨脹。對(duì)于這些問題,如果能夠在調(diào)試期間知道當(dāng)前任務(wù)棧的情況,就能很方便的觀察和發(fā)現(xiàn)問題存在的原因,進(jìn)而選擇正確的launchMode,設(shè)置恰當(dāng)IntentFlag來使程序達(dá)到預(yù)期的效果。

       

      通過ActivityManager獲取狀態(tài)

      Android提供了ActivityManger來幫助開發(fā)者了解運(yùn)行期間的狀態(tài),通過調(diào)用getRunningTasks(int)方法,就可以在得到RunningTaskInfo的列表,其代表著當(dāng)前Android設(shè)備正在運(yùn)行著的Task。從RunningTaskInfo中又可以進(jìn)一步得到更多的信息。

      1. ActivityManager am = (ActivityManager)getSystemService(Context.ACTIVITY_SERVICE);
      2. List<RunningTaskInfo> runningTaskInfoList = am.getRunningTasks(10);
      3. for (RunningTaskInfo runningTaskInfo : runningTaskInfoList) {
      4. log("id: " + runningTaskInfo.id);
      5. log("description: " + runningTaskInfo.description);
      6. log("number of activities: " + runningTaskInfo.numActivities);
      7. log("topActivity: " + runningTaskInfo.topActivity);
      8. log("baseActivity: " + runningTaskInfo.baseActivity.toString());
      9. }

      例如文中提供的示例程序中定義了4個(gè)具有不同launchMode的Activity,每點(diǎn)擊一次菜單欄上得選項(xiàng)就會(huì)彈出一個(gè)新的Activity(或者將指定Singleton的Activity置前)。
      技術(shù)分享
      Activity上顯示的數(shù)字則指示startActivity()被第幾次調(diào)用時(shí)開啟了這個(gè)Activity。有一些Singleton的會(huì)顯示多個(gè)數(shù)字,也表明它是被復(fù)用的。
      技術(shù)分享
      因?yàn)樵?code>onCreate()方法上放置了上述代碼,所以觀察log就能發(fā)現(xiàn)當(dāng)前有多少個(gè)Task在被執(zhí)行,每個(gè)Task又有多少個(gè)Activities。

      D/IDER    ( 3700): =====================
      D/IDER    ( 3700): ---------------------
      D/IDER    ( 3700): id: 25
      D/IDER    ( 3700): description: null
      D/IDER    ( 3700): number of activities: 4
      D/IDER    ( 3700): topActivity: ComponentInfo{com.iderzheng/com.iderzheng.StandardActivity}
      D/IDER    ( 3700): baseActivity: ComponentInfo{com.iderzheng/com.iderzheng.SingleTaskActivity}
      D/IDER    ( 3700): ---------------------
      D/IDER    ( 3700): id: 24
      D/IDER    ( 3700): description: null
      D/IDER    ( 3700): number of activities: 1
      D/IDER    ( 3700): topActivity: ComponentInfo{com.iderzheng/com.iderzheng.SingleInstanceActivity}
      D/IDER    ( 3700): baseActivity: ComponentInfo{com.iderzheng/com.iderzheng.SingleInstanceActivity}
      D/IDER    ( 3700): ---------------------
      D/IDER    ( 3700): id: 23
      D/IDER    ( 3700): description: null
      D/IDER    ( 3700): number of activities: 2
      D/IDER    ( 3700): topActivity: ComponentInfo{com.iderzheng/com.iderzheng.StandardActivity}
      D/IDER    ( 3700): baseActivity: ComponentInfo{com.iderzheng/com.iderzheng.MainActivity}
      D/IDER    ( 3700): ---------------------
      D/IDER    ( 3700): id: 1
      D/IDER    ( 3700): description: null
      D/IDER    ( 3700): number of activities: 1
      D/IDER    ( 3700): topActivity: ComponentInfo{com.android.launcher/com.android.launcher2.Launcher}
      D/IDER    ( 3700): baseActivity: ComponentInfo{com.android.launcher/com.android.launcher2.Launcher}

      缺點(diǎn)

      必須在程序中注入調(diào)試代碼,因?yàn)橐刂圃诎l(fā)布時(shí)代碼必須被清理了。RunningTaskInfo雖然能夠告訴我們有多少個(gè)Activity保存在其上,但是沒有提供完整的列表,只能看到頭尾兩個(gè)Activity。給出的兩個(gè)Activity的屬性:topActivity和baseActivity也只是ComponentName類型,并非真實(shí)的Activity對(duì)象,因此除了類的名字沒有其他更多信息。

      手動(dòng)記錄和管理Activities棧

      Activity的創(chuàng)建和銷毀都會(huì)有相應(yīng)的回調(diào)函數(shù):onCreate()onDestroy()。因此可以自建一個(gè)靜態(tài)全局Stack對(duì)象,在onCreate()時(shí)候講當(dāng)前Activity對(duì)象加入到Stack中,而在onDestroy()時(shí)把它從Stack中移除。這樣我們就隨時(shí)可以知道當(dāng)前Activity的詳細(xì)情況了。

      缺點(diǎn)

      要讓所有Activity的onCreate()onDestroy()方法上有對(duì)應(yīng)的進(jìn)出棧的方法,要么有統(tǒng)一的基類,要么強(qiáng)制每個(gè)Activity都加入這些代碼,但兩種方式都不完美。另外也很難模擬singleTask這類會(huì)創(chuàng)建出新的Task的情況,這時(shí)光使用一個(gè)Stack就不足夠了,要考慮所有的情況又不太可能。再者如同使用ActivityManager一樣這些代碼也應(yīng)該只出現(xiàn)在調(diào)試階段

      使用adb shell指令

      Android還為開發(fā)者提供了adb(Android Debug Bridge),這是非常強(qiáng)大的調(diào)試工具。最常用的自然是logcat來顯示日志記錄。另外一個(gè)很強(qiáng)大的指令就是這里要提到的dumpsysdumpsys還可以添加不同的參數(shù)來指示需要輸出哪一類Service的信息。對(duì)于本文提到的內(nèi)容,需要查看的就是activity,指令就是:

      adb shell dumpsys activity


      輸入上述指令,就能得到關(guān)于設(shè)備非常長的一段訊息,單是也能清晰看出它們比較詳細(xì)的分類

       

      ACTIVITY MANAGER PENDING INTENTS (dumpsys activity intents)
        * PendingIntentRecord{42b05f20 com.android.vending startService}
        ... ... ... ...
      
      ACTIVITY MANAGER BROADCAST STATE (dumpsys activity broadcasts)
        Historical broadcasts [foreground]:
        #0: BroadcastRecord{430d2fb8 u-1 android.intent.action.TIME_TICK}
          act=android.intent.action.TIME_TICK flg=0x50000014 (has extras)
          extras: Bundle[{android.intent.extra.ALARM_COUNT=1}]
        ... ... ... ...
      
      ACTIVITY MANAGER CONTENT PROVIDERS (dumpsys activity providers)
        Published single-user content providers (by class):
        * ContentProviderRecord{429d18a8 u0 com.android.phone/.IccProvider}
          proc=ProcessRecord{429765d8 858:com.android.phone/1001}
          singleton=true
          authority=icc
        ... ... ... ...
      
      ACTIVITY MANAGER SERVICES (dumpsys activity services)
        User 0 active services:
        * ServiceRecord{429f8668 u0 com.android.bluetooth/.hid.HidService}
          app=null
          created=-1h44m27s317ms started=false connections=0
        ... ... ... ...
      
      ACTIVITY MANAGER ACTIVITIES (dumpsys activity activities)
        Stack #0:
          Task id #28
            TaskRecord{43525058 #28 A=com.android.systemui U=0 sz=1}
            Intent { act=com.android.systemui.recent.action.TOGGLE_RECENTS flg=0x10c00000 cmp=com.android.systemui/.recent.RecentsActivity (has extras) }
              Hist #0: ActivityRecord{428d1ae8 u0 com.android.systemui/.recent.RecentsActivity t28}
                Intent { act=com.android.systemui.recent.action.TOGGLE_RECENTS flg=0x10800000 cmp=com.android.systemui/.recent.RecentsActivity bnds=[328,886][656,1176] }
                ProcessRecord{42968230 695:com.android.systemui/u0a12}
        ... ... ... ...
      
      ACTIVITY MANAGER RUNNING PROCESSES (dumpsys activity processes)
        Process LRU list (sorted by oom_adj, 28 total, non-act at 3, non-svc at 3):
          PERS #27: sys   F/ /P  trm: 0 605:system/1000 (fixed)
        ... ... ... ...
      

      每一個(gè)類別都有一個(gè)括號(hào)內(nèi)容,給出了更加詳細(xì)的指令來查看該類別下更多具體內(nèi)容。因此再來嘗試指令:

      db shell dumpsys activity activities

      就能看到下邊的結(jié)果

      CTIVITY MANAGER ACTIVITIES (dumpsys activity activities)
        Stack #0:
          Task id #28
          * TaskRecord{43525058 #28 A=com.android.systemui U=0 sz=1}
            ... ... ... ...
            * Hist #0: ActivityRecord{428d1ae8 u0 com.android.systemui/.recent.RecentsActivity t28}
                ... ... ... ...
          Task id #1
          * TaskRecord{429a35f8 #1 A=com.android.launcher U=0 sz=1}
            ... ... ... ...
            * Hist #0: ActivityRecord{429a1760 u0 com.android.launcher/com.android.launcher2.Launcher t1}
                ... ... ... ...
      
          Running activities (most recent first):
            TaskRecord{43525058 #28 A=com.android.systemui U=0 sz=1}
              Run #1: ActivityRecord{428d1ae8 u0 com.android.systemui/.recent.RecentsActivity t28}
            TaskRecord{429a35f8 #1 A=com.android.launcher U=0 sz=1}
              Run #0: ActivityRecord{429a1760 u0 com.android.launcher/com.android.launcher2.Launcher t1}
      
          mLastPausedActivity: ActivityRecord{428d1ae8 u0 com.android.systemui/.recent.RecentsActivity t28}
      
        Stack #1:
          Task id #25
          * TaskRecord{42b0ee20 #25 I=com.iderzheng/.SingleTaskActivity U=0 sz=5}
            numActivities=5 rootWasReset=false userId=0 mTaskType=0 numFullscreen=5 mOnTopOfHome=true
            intent={cmp=com.iderzheng/.SingleTaskActivity}
            realActivity=com.iderzheng/.SingleTaskActivity
            Activities=[ActivityRecord{42a7e160 u0 com.iderzheng/.SingleTaskActivity t25}, ActivityRecord{42bffdf0 u0 com.iderzheng/.StandardActivity t25}, ActivityRecord{42e9e8f8 u0 com.iderzheng/.SingleTopActivity t25}, ActivityRecord{434c2238 u0 com.iderzheng/.StandardActivity t25}, ActivityRecord{4279d2d8 u0 com.iderzheng/.SingleTopActivity t25}]
            askedCompatMode=false
            lastThumbnail=null lastDescription=null
            lastActiveTime=6229735 (inactive for 357s)
            * Hist #4: ActivityRecord{4279d2d8 u0 com.iderzheng/.SingleTopActivity t25}
                packageName=com.iderzheng processName=com.iderzheng
                launchedFromUid=10124 launchedFromPackage=com.iderzheng userId=0
                app=ProcessRecord{4312cbb0 3700:com.iderzheng/u0a124}
                Intent { cmp=com.iderzheng/.SingleTopActivity bnds=[328,580][656,870] }
                frontOfTask=false task=TaskRecord{42b0ee20 #25 I=com.iderzheng/.SingleTaskActivity U=0 sz=5}
                taskAffinity=com.iderzheng
                realActivity=com.iderzheng/.SingleTopActivity
                baseDir=/data/app/com.iderzheng-1.apk
                dataDir=/data/data/com.iderzheng
                stateNotNeeded=false componentSpecified=true mActivityType=0
                compat={320dpi} labelRes=0x7f0a0013 icon=0x7f020057 theme=0x7f0b0000
                config={1.0 310mcc?mnc en_US ldltr sw384dp w384dp h567dp 320dpi nrml port finger -keyb/v/h -nav/h s.7}
                launchFailed=false launchCount=0 lastLaunchTime=-1h40m33s397ms
                haveState=false icicle=null
                state=RESUMED stopped=false delayedResume=false finishing=false
                keysPaused=false inHistory=true visible=true sleeping=false idle=true
                fullscreen=true noDisplay=false immersive=false launchMode=1
                frozenBeforeDestroy=false thumbnailNeeded=false forceNewConfig=false
                mActivityType=APPLICATION_ACTIVITY_TYPE
                thumbHolder: 42b0ee20 bm=null desc=null
                waitingVisible=false nowVisible=true lastVisibleTime=-5m56s862ms
          ... ... ... ...
      
          Running activities (most recent first):
            TaskRecord{42b0ee20 #25 I=com.iderzheng/.SingleTaskActivity U=0 sz=5}
              Run #7: ActivityRecord{4279d2d8 u0 com.iderzheng/.SingleTopActivity t25}
            TaskRecord{429e9558 #24 A=com.iderzheng U=0 sz=1}
              Run #6: ActivityRecord{429d5408 u0 com.iderzheng/.SingleInstanceActivity t24}
            TaskRecord{42b0ee20 #25 I=com.iderzheng/.SingleTaskActivity U=0 sz=5}
              Run #5: ActivityRecord{434c2238 u0 com.iderzheng/.StandardActivity t25}
              Run #4: ActivityRecord{42e9e8f8 u0 com.iderzheng/.SingleTopActivity t25}
              Run #3: ActivityRecord{42bffdf0 u0 com.iderzheng/.StandardActivity t25}
              Run #2: ActivityRecord{42a7e160 u0 com.iderzheng/.SingleTaskActivity t25}
            TaskRecord{4282e508 #23 A=com.iderzheng U=0 sz=2}
              Run #1: ActivityRecord{429655d8 u0 com.iderzheng/.StandardActivity t23}
              Run #0: ActivityRecord{429564e0 u0 com.iderzheng/.MainActivity t23}
       
        ... ... ... ...
      
        Recent tasks:
        ... ... ... ...
      

      整個(gè)log顯示了當(dāng)前所有在運(yùn)行的任務(wù)棧,它們的id分別是什么。對(duì)于每個(gè)Task,也有Activity數(shù)量等信息,同時(shí)也列出了其中的Activity列表,并且對(duì)于每個(gè)Activity也有比較詳細(xì)的描述,比如啟動(dòng)它的Intent的內(nèi)容。

      如果覺得內(nèi)容過多,只想看看棧的內(nèi)容,也可以直接跳到”Running activities (most recent first)”那部分,比較簡潔而又明了的列出了棧中得Activity列表,就能知道當(dāng)按下返回鍵的時(shí)候會(huì)應(yīng)該會(huì)回到哪個(gè)Activity以后是要退出程序。

      對(duì)于”Running activitie”s的內(nèi)容在dumpsys activity中就有,并不需要dumpsys activity activities,也可以用下邊的指令來限制僅輸出”Running activities”列表:

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

      缺點(diǎn)

      很明顯的看出,使用adb shell的相對(duì)于之前的方式的明顯好處就是不需要添加額外的代碼,而且任務(wù)棧的信息也更加詳盡。但是同樣的它只能輸出Activity的類名,對(duì)于具體屬性沒有記錄。

       

      adb shell對(duì)于調(diào)試Android程序有很多的幫助,可惜對(duì)于adb指令都沒有比較全面詳細(xì)而又系統(tǒng)的教程。只能靠在實(shí)踐中慢慢摸索,從網(wǎng)上零星介紹中獲得。

      Download Source Code for Testing

        本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評(píng)論

        發(fā)表

        請(qǐng)遵守用戶 評(píng)論公約

        類似文章 更多