Xem ngăn xếp hoạt động của Nhiệm vụ


138

Tôi mới bắt đầu phát triển một ứng dụng Android đơn giản trong khi tôi vẫn đang học nền tảng này.

Tôi đang sử dụng IDE Eclipse với plugin ADT 0.9.6.

Tôi cần biết liệu có thể xem Activityngăn xếp được liên kết với Nhiệm vụ không?

Có cách nào thông qua công cụ DDMS hoặc thông qua bất kỳ kỹ thuật nào khác không?

Về cơ bản, điều tôi cần là có thể thấy hoạt động ngăn xếp của một tác vụ để đảm bảo rằng ứng dụng hoạt động như mong đợi.

Tôi biết rằng có thể kiểm soát hành vi tác vụ trong một chừng mực nào đó thông qua việc sử dụng cờ trong Intentđối tượng và thông qua một số thuộc tính của <activity>phần tử.

Tuy nhiên, thật tuyệt khi có một loại công cụ - đặc biệt là trong chế độ gỡ lỗi hoặc tương tự - điều đó sẽ cho phép các nhà phát triển nhìn thấy Activityngăn xếp thẳng về phía trước.


Nếu bạn đang sử dụng Android Studio, tôi đã đăng một giải pháp [tại đây] [1]. [1]: stackoverflow.com/a/22392616/1798991
Nebu

Câu trả lời:


164

Từ dòng lệnh, bạn có thể sử dụng: adb shell dumpsys activity

Điều này yêu cầu người quản lý hoạt động in một bãi chứa trạng thái hiện tại của nó. Phần đầu tiên là lịch sử hoạt động hoàn chỉnh, được tổ chức theo nhiệm vụ. Sau đó cũng có rất nhiều thứ được in, vì vậy bạn có thể cần phải cuộn lên một chút để tìm thấy những gì bạn muốn.

Dưới đây là một ví dụ về đầu ra của nó (nội dung chính xác thay đổi theo các phiên bản nền tảng), cho thấy nhiệm vụ hàng đầu là các liên hệ có hai hoạt động và đằng sau đó là trình khởi chạy với một hoạt động:

Các hoạt động trong trạng thái Trình quản lý hoạt động hiện tại:
  * TaskRecord {44d07218 # 4 Một android.task.contacts}
    clearOnBackground = true numActivities = 2 rootWasReset = true
    ái lực = android.task.contacts
    aim = {act = android.intent.action.MAIN cat = [android.intent.c Category.LAUNCHER] flg = 0x10600000 cmp = com.android.contacts / .DialtactsActivity bnds = [125.640] [235,758]}
    origActivity = com.android.contacts / .DialtactsLinkEntryActivity
    realActivity = com.android.contacts / .DialtactsActivity
    lastActiveTime = 288203177 (không hoạt động trong 14 giây)
    * Lịch sử số 8: HistoryRecord {44b87a30 com.android.contacts / .ViewContactActivity}
        packName = com.android.contacts processName = android. process.acore
        launchFromUid = 10004 app = ProcessRecord {44c4f348 1168: android. process.acore / 10004}
        Ý định {act = android.intent.action.VIEW dat = content: //com.android.contacts/contacts/lookup/144i148.144i461a29500afc8eeb/1927 cmp = com.android.contacts / .ViewContactActivity}
        frontOfTask = false task = TaskRecord {44d07218 # 4 Một android.task.contacts}
        taskAffinity = android.task.contacts
        realActivity = com.android.contacts / .ViewContactActivity
        cơ sở = / system / app / Danh bạ.apk / system / app / Danh bạ.apk data = / data / data / com.android.contacts
        nhãnRes = 0x7f090012 icon = 0x7f02006b chủ đề = 0x7f0e0004
        stateNotNeeded = false thành phầnSpecified = false isHomeActivity = false
        cấu hình = {scale = 1.0 imsi = 310/4 loc = en_US touch = 3 phím = 2/1/2 nav = 2/2 orien = 1 layout = 34}
        resultTo = HistoryRecord {44d174d0 com.android.contacts / .DialtactsLinkEntryActivity} resultWho = Favorites resultCode = 2
        launchFails = false haveState = false icicle = null
        state = RESUMED dừng = false delayResume = false finish = false
        KeysPaused = false inHistory = true continent = false launchMode = 0
        toàn màn hình = true display = true FrozenB BeforeDestroy = false ThumbNeeded = false idle = true
        WaitVisible = false nowVisible = true
    * Lịch sử số 7: HistoryRecord {44d174d0 com.android.contacts / .DialtactsLinkEntryActivity}
        packName = com.android.contacts processName = android. process.acore
        launchFromUid = 10004 app = ProcessRecord {44c4f348 1168: android. process.acore / 10004}
        Ý định {act = android.intent.action.MAIN cat = [android.intent.c Category.LAUNCHER] flg = 0x10200000 cmp = com.android.contacts / .DialtactsLinkEntryActivity bnds = [125,640] [235,758]
        frontOfTask = true task = TaskRecord {44d07218 # 4 Một android.task.contacts}
        taskAffinity = android.task.contacts
        realActivity = com.android.contacts / .DialtactsActivity
        cơ sở = / system / app / Danh bạ.apk / system / app / Danh bạ.apk data = / data / data / com.android.contacts
        nhãnRes = 0x7f090007 icon = 0x7f02006b theme = 0x7f0e0000
        stateNotNeeded = false thành phầnSpecified = true isHomeActivity = false
        cấu hình = {scale = 1.0 imsi = 310/4 loc = en_US touch = 3 phím = 2/1/2 nav = 2/2 orien = 1 layout = 34}
        launchFails = false haveState = true icicle = Bundle [mParcelledData.dataSize = 4196]
        state = STOPPED dừng = true delayResume = false finish = false
        KeysPaused = false inHistory = true continent = false launchMode = 2
        toàn màn hình = true display = false FrozenB BeforeDestroy = false ThumbNeeded = false idle = true
  * TaskRecord {44c4ee90 # 2 Một com.android.launcher}
    clearOnBackground = true numActivities = 1 rootWasReset = true
    ái lực = com.android.launcher
    aim = {act = android.intent.action.MAIN cat = [android.intent.c Category.HOME] flg = 0x10600000 cmp = com.android.launcher / .Launcher}
    realActivity = com.android.launcher / .Launcher
    lastActiveTime = 214734838 (không hoạt động trong 73483 giây)
    * Lịch sử số 6: HistoryRecord {44c4d988 com.android.launcher / .Launcher}
        packName = com.android.launcher processName = android. process.acore
        LaunchFromUid = 0 app = ProcessRecord {44c4f348 1168: android. process.acore / 10004}
        Ý định {act = android.intent.action.MAIN cat = [android.intent.c Category.HOME] flg = 0x10000000 cmp = com.android.launcher / .Launcher}
        frontOfTask = true task = TaskRecord {44c4ee90 # 2 A com.android.launcher}
        taskAffinity = com.android.launcher
        realActivity = com.android.launcher / .Launcher
        cơ sở = / system / app / Launcher.apk / system / app / Launcher.apk data = / data / data / com.android.launcher
        nhãnRes = 0x7f0a0000 icon = 0x7f020015 theme = 0x103005f
        stateNotNeeded = true thành phầnSpecified = false isHomeActivity = true
        cấu hình = {scale = 1.0 imsi = 310/4 loc = en_US touch = 3 phím = 2/1/2 nav = 2/2 orien = 1 layout = 34}
        launchFails = false haveState = true icicle = Bundle [mParcelledData.dataSize = 5964]
        state = STOPPED dừng = true delayResume = false finish = false
        KeysPaused = false inHistory = true continent = false launchMode = 2
        toàn màn hình = true display = false FrozenB BeforeDestroy = false ThumbNeeded = false idle = true

Có cách nào hay để hiển thị tất cả ngăn xếp tác vụ và hoạt động của ứng dụng hiện tại qua logcat không? chúng ta có thực sự cần phân tích lệnh adb không?
nhà phát triển Android

85
Ngoài ra, nếu bạn chỉ muốn xem tên của các hoạt động trong ngăn xếp, bạn có thể thực hiện việc này: adb shell <enter> dumpsys activity | grep -i run .
Surya Wijaya Madjid

6
Câu trả lời chính xác! Tôi đã viết một tập lệnh tiện lợi để lọc đầu ra để nhận các tác vụ / hoạt động cho một gói nhất định.
sschuberth

5
ngoài ra adb shell dmpsys activitybạn có thể lấy cho mỗi danh sách, ví dụ như adb shell dmpsys activity activitiesHOẠT ĐỘNG QUẢN LÝ HOẠT ĐỘNG có chứa ngăn xếp chính, Hoạt động đang chạy và các tác vụ gần đây. dumpsys activity intentscho ý định chờ xử lý; dumpsys activity broadcastscho nhà nước phát sóng; dumpsys activity providersđối với người khiêu khích nội dung; dumpsys activity servicesCho dịch vụ; dumpsys activity processesđể chạy các quy trình.
Fredrick Gauss

1
Lệnh của @ SuryaWijayaMadjid có thể được thực hiện trong một dòng : adb shell dumpsys activity | grep -i run, hoặc adb shell dumpsys activity activities | grep -i runcho đầu ra sạch hơn một chút.
vaughandroid

58

Bạn có thể sử dụng lệnh sau trong dòng lệnh của mình để xem các tác vụ và backstacks trong hệ thống:

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

Hoặc bạn có thể dùng thử TaskLogger , một công cụ đơn giản mà tôi đã tạo có thể giám sát tất cả các hoạt động và tác vụ trong Ứng dụng của bạn và xuất chúng trong Logcat theo thời gian thực.


+1 .... Tôi đã dùng thử TaskLogger của bạn, đây là một công cụ tốt và giúp tôi rất nhiều, nhưng in ra các bản ghi không mong muốn.
ThinkDeep

34

Tôi biết đây là một câu hỏi cũ, nhưng chức năng này hiện đã được đưa vào Android Studio:

ảnh chụp màn hình studio android

Sau đó, trong tệp văn bản kết quả, tìm kiếm ACTIVITY(tất cả chữ hoa):

ảnh chụp màn hình tập tin android studio


20
Tôi nghĩ tùy chọn này không còn tồn tại do cửa sổ Android Profiler mới trong Android Studio 3.0 thay thế các công cụ Màn hình Android.
Trái cây

5
Tôi đã tạo ra vấn đề cho chức năng còn thiếu này: suetracker.google.com/issues/77944626 vì vậy hãy bỏ phiếu cho nó. Cảm ơn
mtrakal

27

Nếu bạn muốn kiểm tra ngăn xếp nhiệm vụ của một gói cụ thể, lệnh sau sẽ thực hiện:

adb shell dumpsys activity activities | grep PACKAGE_NAME | grep Hist

12

Tôi luôn kiểm tra phần này của tin nhắn kết xuất dài ..

  Running activities (most recent first):
TaskRecord{4307f828 #56 A com.demo.proj U 0}
  Run #4: ActivityRecord{425a6838 com.demo.proj/com.demo.proj.Activity2}
  Run #3: ActivityRecord{427dc860 com.demo.proj/com.demo.proj.Activity1}
  Run #2: ActivityRecord{420cba18 com.demo.proj/com.demo.proj.MainActivity}
TaskRecord{430341d0 #2 A com.lge.launcher2 U 0}
  Run #1: ActivityRecord{41e0af68 com.lge.launcher2/.Launcher}
TaskRecord{44e26ce0 #18 A com.lge.appbox.client U 0}
  Run #0: ActivityRecord{41e9dbe8 com.lge.appbox.client/.AppBoxClient}

Lưu ý: Chạy số 4 là hoạt động mà bạn thấy bây giờ trên màn hình. :)


2
"Tin nhắn dài" là gì?
Mary Paździoch

2
@ MarianPaździoch "hoạt động dumpsys vỏ adb" cho chúng ta thấy những thông điệp quá dài. Tin nhắn này, ở trên, là một chút trong số họ. Nhân tiện, tôi có một mẹo có thể tránh điều này. Chạy này, "adb shell dumpsys hoạt động hoạt động" Bạn có thể thấy tin nhắn ngắn hơn và có thể đọc dễ dàng hơn về ngăn xếp hoạt động. :)
cmcromance

1
... Và nếu danh sách đó vẫn còn quá dài, hãy mở danh sách Ứng dụng gần đây và vuốt một số tác vụ.
Barry Fruitman

10

Bạn có thể sử dụng công cụ phân cấp công cụ xem.bat. Nó là một phần của SDK Android. Nó chỉ hoạt động với trình giả lập. Nhưng nó dễ vỡ và rõ ràng hơn nhiều.

Chỉnh sửa: Tôi vừa tìm thấy Trình xem phân cấp trong Eclipse! Và nó hoạt động với các thiết bị thực sự là tốt. Chỉ cần mở phối cảnh Windows-> Mở phối cảnh-> Chế độ xem phân cấp Trong danh sách, bạn có thể thấy tất cả các thiết bị và trình giả lập được kết nối và ngăn xếp hoạt động. Và ngoài ra trong chế độ xem dạng cây, bạn có thể xem thêm nhiều thông tin về chế độ xem.

Chỉnh sửa: Trình xem phân cấp sẽ chỉ hoạt động với các thiết bị dành cho nhà phát triển. Thiết bị sản xuất không thể làm điều đó vì lý do bảo mật. Để biết thêm thông tin xin vui lòng xem câu trả lời sau đây


4
Trình xem phân cấp là để xem phân cấp Xem của một hoạt động. Câu hỏi là về ngăn xếp nhiệm vụ / hoạt động .
Jeremy Logan

8

Đối với danh sách các nhiệm vụ gần đây

adb shell dumpsys activity recents

Đối với danh sách Dịch vụ đang chạy

adb shell dumpsys activity services

Đối với danh sách các nhà cung cấp nội dung hiện tại

adb shell dumpsys activity providers

Đối với danh sách trạng thái phát sóng

adb shell dumpsys activity broadcasts

Đối với danh sách các ý định đang chờ xử lý

adb shell dumpsys activity intents

Đối với danh sách quyền

adb shell dumpsys activity permissions

Nếu bạn thích cách GUI-sh hơn, bạn có thể sử dụng AdbCommanderplugin và thêm các lệnh đó trong macrostab
prot0n


1

Giải pháp: 'hoạt động đổ vỏ adb' không hoạt động với TabActivity. Khi mỗi mục tab được chọn, hoạt động tương ứng sẽ được khởi chạy. Nhưng khi sử dụng 'adb shell dumpsys hoạt động' Nó luôn trả về hoạt động 'chính':

public class main extends TabActivity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        Log.e("xyz", "start main...............");
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        Resources res = getResources(); // Resource object to get Drawables
        TabHost tabHost = getTabHost();  // The activity TabHost
        TabHost.TabSpec spec;  // Resusable TabSpec for each tab
        Intent intent;  // Reusable Intent for each tab

        // Create an Intent to launch an Activity for the tab (to be reused)
        intent = new Intent().setClass(this, widgets.class);
        spec = tabHost.newTabSpec("Widgets").setIndicator("Widgets", res.getDrawable(R.drawable.tab1)).setContent(intent);
        tabHost.addTab(spec);

        intent = new Intent().setClass(this, layouts.class);
        spec = tabHost.newTabSpec("Layouts").setIndicator("Layouts",res.getDrawable(R.drawable.tab2)).setContent(intent);
        tabHost.addTab(spec);

        intent = new Intent().setClass(this, composite1.class);
        spec = tabHost.newTabSpec("Composite").setIndicator("Composite",res.getDrawable(R.drawable.tab3)).setContent(intent);
        tabHost.addTab(spec);

        intent = new Intent().setClass(this, imageMedia.class);
        spec = tabHost.newTabSpec("Image_Media").setIndicator("Image&Media",res.getDrawable(R.drawable.tab4)).setContent(intent);
        tabHost.addTab(spec);

        intent = new Intent().setClass(this, timeDate.class);
        spec = tabHost.newTabSpec("Time_Date").setIndicator("Time&Date",res.getDrawable(R.drawable.tab5)).setContent(intent);
        tabHost.addTab(spec);

        intent = new Intent().setClass(this, transitions.class);
        spec = tabHost.newTabSpec("Transitions").setIndicator("Transitions",res.getDrawable(R.drawable.tab6)).setContent(intent);
        tabHost.addTab(spec);

        intent = new Intent().setClass(this, advanced.class);
        spec = tabHost.newTabSpec("Advanced").setIndicator("Advanced",res.getDrawable(R.drawable.tab7)).setContent(intent);
        tabHost.addTab(spec);

        intent = new Intent().setClass(this, others.class);
        spec = tabHost.newTabSpec("Others").setIndicator("Others",res.getDrawable(R.drawable.tab8)).setContent(intent);
        tabHost.addTab(spec);

        intent = new Intent().setClass(this, Dynamic.class);
        spec = tabHost.newTabSpec("Dynamic").setIndicator("Dynamic",res.getDrawable(R.drawable.tab2)).setContent(intent);
        tabHost.addTab(spec);

        tabHost.setCurrentTab(0);

    }
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.