Görevin etkinlik yığınını görüntüleme


138

Hala platformu öğrenirken basit bir Android uygulaması geliştirmeye başladım.

Eclipse IDE 0.9.6 ADT eklentisi ile kullanıyorum.

ActivityBir Görev ile ilişkili yığını görüntülemek mümkün olup olmadığını bilmek gerekir ?

DDMS aracıyla veya başka bir teknikle herhangi bir yolu var mı?

Aslında ihtiyacım olan şey, uygulamanın beklendiği gibi davrandığından emin olmak için bir görevin yığın etkinliğini görebilmektir.

Görev davranışını bir dereceye kadar Intentnesnede bayraklar kullanarak ve <activity>elementin bazı nitelikleri ile kontrol etmenin mümkün olduğunu biliyorum .

Bununla birlikte, geliştiricilerin Activityyığını doğrudan görmelerine izin verecek bir tür araca (özellikle hata ayıklama modunda) sahip olmak güzel olurdu .


Android Studio kullanıyorsanız [burada] [1] bir çözüm gönderdim. [1]: stackoverflow.com/a/22392616/1798991
Nebu

Yanıtlar:


164

Komut satırından şunları kullanabilirsiniz: adb shell dumpsys activity

Bu, etkinlik yöneticisinden geçerli durumunun bir dökümünü yazdırmasını ister. Bunun ilk kısmı, göreve göre düzenlenen tam etkinlik geçmişidir. Bundan sonra basılan çok fazla şey var, bu yüzden istediğinizi bulmak için biraz yukarı kaydırmanız gerekebilir.

İşte çıktısının bir örneği (tam içerikler platform sürümlerine göre değişir), en üstteki görev iki etkinlikle temas olduğunu ve bunun arkasında bir etkinliğe sahip başlatıcıyı gösterir:

Mevcut Etkinlik Yöneticisi Durumundaki Faaliyetler:
  * Görev Kaydı {44d07218 # 4 A android.task.contacts}
    clearOnBackground = true numActivities = 2 rootWasReset = true
    afinite = android.task.contacts
    intent = {act = android.intent.action.MAIN cat = [android.intent.category.LAUNCHER] flg = 0x10600000 cmp = com.android.contacts / .DialtactsActivity bnds = [125,688]}
    origActivity = com.android.contacts / .DialtactsContactsEntryActivity
    realActivity = com.android.contacts / .DialtactsActivity
    lastActiveTime = 288203177 (14 saniye boyunca etkin değil)
    * Hist # 8: Geçmiş Kaydı {44b87a30 com.android.contacts / .ViewContactActivity}
        packageName = com.android.contacts süreçAdı = android.process.acore
        launchFromUid = 10004 app = ProcessRecord {44c4f348 1168: android.process.acore / 10004}
        Amaç {act = android.intent.action.VIEW dat = içerik: //com.android.contacts/contacts/lookup/144i148.144i461a29500afc8eeb/1927 cmp = com.android.contacts / .ViewContactActivity}
        frontOfTask = yanlış görev = Görev Kaydı {44d07218 # 4 Bir android.task.contacts}
        taskAffinity = android.task.contacts
        realActivity = com.android.contacts / .ViewContactActivity
        base = / system / app / Contacts.apk / system / app / Contacts.apk verileri = / data / data / com.android.contacts
        labelRes = 0x7f090012 simge = 0x7f02006b tema = 0x7f0e0004
        stateNotNeeded = false componentSpecified = false isHomeActivity = false
        configuration = {scale = 1.0 imsi = 310/4 loc = tr_TR dokunmatik = 3 tuş = 2/1 / 2 gezinme = 2/2 orien = 1 düzen = 34}
        resultTo = HistoryRecord {44d174d0 com.android.contacts / .DialtactsContactsEntryActivity} sonuçWho = sık sonuç sonucuKod = 2
        launchFailed = false haveState = yanlış buz saçağı = boş
        state = RESUMED stop = false delayedResume = yanlış sonlandırma = yanlış
        keysPaused = false inHistory = gerçek sürekli = yanlış launchMode = 0
        fullscreen = true visible = true frozenBeforeDestroy = yanlış küçük resim Gerekli = yanlış boşta = doğru
        beklemeVisible = şimdi yanlışVisible = true
    * Hist # 7: HistoryRecord {44d174d0 com.android.contacts / .Dialtactsİletişim bilgileriEntriAktivite}
        packageName = com.android.contacts süreçAdı = android.process.acore
        launchFromUid = 10004 app = ProcessRecord {44c4f348 1168: android.process.acore / 10004}
        Niyet {act = android.intent.action.MAIN cat = [android.intent.category.LAUNCHER] flg = 0x10200000 cmp = com.android.contacts / .DialtactsContactsEntryActivity bnds = [125.640] [235,758]}
        frontOfTask = gerçek görev = Görev Kaydı {44d07218 # 4 Bir android.task.contacts}
        taskAffinity = android.task.contacts
        realActivity = com.android.contacts / .DialtactsActivity
        base = / system / app / Contacts.apk / system / app / Contacts.apk verileri = / data / data / com.android.contacts
        labelRes = 0x7f090007 simge = 0x7f02006b tema = 0x7f0e0000
        stateNotNeeded = false componentSpecified = true isHomeActivity = false
        configuration = {scale = 1.0 imsi = 310/4 loc = tr_TR dokunmatik = 3 tuş = 2/1 / 2 gezinme = 2/2 orien = 1 düzen = 34}
        launchFailed = false haveState = gerçek buz saçağı = Paket [mParcelledData.dataSize = 4196]
        state = STOPPED durdu = true delayedResume = yanlış sonlandırma = yanlış
        keysPaused = false inHistory = gerçek sürekli = yanlış launchMode = 2
        fullscreen = gerçek görünür = yanlış dondurulmuşBeforeDestroy = yanlış küçük resim Gerekli = yanlış boşta = doğru
  * Görev Kaydı {44c4ee90 # 2 A com.android.launcher}
    clearOnBackground = true numActivities = 1 rootWasReset = true
    afinite = com.android.launcher
    intent = {act = android.intent.action.MAIN cat = [android.intent.category.HOME] flg = 0x10600000 cmp = com.android.launcher / .Launcher}
    realActivity = com.android.launcher / .Launcher
    lastActiveTime = 214734838 (73483s için etkin değil)
    * Tarih # 6: Tarih Kaydı {44c4d988 com.android.launcher / .Launcher}
        packageName = com.android.launcher süreciAdı = android.process.acore
        launchFromUid = 0 app = ProcessRecord {44c4f348 1168: android.process.acore / 10004}
        Amaç {act = android.intent.action.MAIN cat = [android.intent.category.HOME] flg = 0x10000000 cmp = com.android.launcher / .Launcher}
        frontOfTask = true task = Görev Kaydı {44c4ee90 # 2 A com.android.launcher}
        taskAffinity = com.android.launcher
        realActivity = com.android.launcher / .Launcher
        base = / system / app / Launcher.apk / system / app / Launcher.apk veri = / veri / veri / com.android.launcher
        labelRes = 0x7f0a0000 simge = 0x7f020015 tema = 0x103005f
        stateNotNeeded = true componentSpecified = false isHomeActivity = true
        configuration = {scale = 1.0 imsi = 310/4 loc = tr_TR dokunmatik = 3 tuş = 2/1 / 2 gezinme = 2/2 orien = 1 düzen = 34}
        launchFailed = false haveState = gerçek buz saçağı = Paket [mParcelledData.dataSize = 5964]
        state = STOPPED durdu = true delayedResume = yanlış sonlandırma = yanlış
        keysPaused = false inHistory = gerçek sürekli = yanlış launchMode = 2
        fullscreen = gerçek görünür = yanlış dondurulmuşBeforeDestroy = yanlış küçük resim Gerekli = yanlış boşta = doğru

geçerli uygulamanın tüm görevler ve etkinlikler yığını logcat aracılığıyla göstermek için güzel bir yolu var mı? gerçekten adb komutunu ayrıştırmamız gerekiyor mu?
android geliştirici

85
Ayrıca, yalnızca yığında etkinliklerin adını görmek istiyorsanız bunu yapabilirsiniz: adb shell <enter> dumpsys activity | grep -i run .
Surya Wijaya Madjid

6
Mükemmel cevap! Belirli bir paket için görevleri / faaliyetleri almak için çıktı filtreler bir kolaylık komut dosyası yazdım .
sschuberth

5
buna ek olarak adb shell dmpsys activity, her liste için örneğin adb shell dmpsys activity activitiesana yığını, Çalışan aktiviteleri ve Son görevleri içeren FAALİYET MÜDÜRÜ AKTİVİTELERİ için alabilirsiniz . dumpsys activity intentsbekleyen hedefler için; dumpsys activity broadcastsyayın durumu için; dumpsys activity providersiçerik sağlayıcılar için; dumpsys activity serviceshizmetler için; dumpsys activity processesçalışan işlemler için.
Fredrick Gauss

1
@ SuryaWijayaMadjid'in komutu tek bir satırda yapılabilir: adb shell dumpsys activity | grep -i runveya adb shell dumpsys activity activities | grep -i runbiraz daha temiz çıktı için.
vaughandroid

58

Sistemdeki görevleri ve backstacks'ı görmek için komut satırınızda aşağıdaki komutu kullanabilirsiniz:

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

Yoksa deneyebilirsiniz TaskLogger gerçek zamanlı olarak LogCat içinde, senin App tüm faaliyet ve görevleri izleyebilen oluşturulan basit bir aracı ve çıkış onları.


+1 .... Ben TaskLogger denedim iyi bir araçtır ve bana çok yardımcı olur, ancak istenmeyen günlükleri çığ yazdırır.
ThinkDeep

34

Bunun eski bir soru olduğunu biliyorum, ancak bu işlevsellik şimdi Android Studio'ya dönüştürüldü:

android studio ekran görüntüsü

Ardından, elde edilen metin dosyasında ACTIVITY(tümü büyük harf) arayın :

android studio metin dosyası ekran görüntüsü


20
Android Studio 3.0'daki yeni Android Profiler penceresi Android Monitor araçlarının yerini aldığından bu seçeneğin artık mevcut olmadığını düşünüyorum.
Meyve

5
Bu eksik işlev için sorun oluşturdum: issuetracker.google.com/issues/77944626 bu yüzden lütfen oy verin. Teşekkürler
mtrakal

27

Belirli bir paketin görev yığınını incelemek isterseniz, aşağıdaki komut yapılır:

adb shell dumpsys activity activities | grep PACKAGE_NAME | grep Hist

12

Uzun döküm mesajlarının bu kısmını her zaman kontrol ederim.

  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}

Not: Run # 4, şu anda ekranda gördüğünüz etkinliktir. :)


2
"Uzun döküm mesajları" nedir?
Marian Paździoch

2
@ MarianPaździoch "adb shell dumpsys etkinliği" bize çok uzun mesajlar gösteriyor. Yukarıdaki bu mesajlar biraz. Bu arada, bunu önleyebilecek bir ipucu var. Bunu çalıştırın, "adb shell dumpsys etkinlik faaliyetleri" Daha kısa mesaj görebilirsiniz ve etkinlik yığını hakkında daha kolay okuyabilirsiniz. :)
cmcromance

1
... ve bu liste hala çok uzunsa, Son Uygulamalar listesini açın ve bazı görevleri hızlıca kaydırın.
Barry Fruitman

10

Hierarchyviewer.bat aracını kullanabilirsiniz. Android SDK'nın bir parçasıdır. Sadece emülatör ile çalışır. Ama çok daha konforlu ve net.

Düzenleme: Sadece Eclipse içinde Hiyerarşi Görüntüleyicisi buldum! Ve gerçek cihazlarla da çalışır. Pencereyi açmanız yeterlidir Windows-> Perspektifi Aç-> Hiyerarşi Görünümü Listede, bağlı tüm aygıtları ve emülatörleri ve etkinlik yığınını görebilirsiniz. Ayrıca ağaç görünümünde, görünümün kendisi hakkında çok daha fazla bilgi görebilirsiniz.

Düzenleme: Hiyerarşi Görüntüleyicisi yalnızca geliştirici cihazlarıyla çalışır. Üretim cihazları güvenlik nedeniyle yapamaz. Daha fazla bilgi için lütfen aşağıdaki cevaba bakınız.


4
Hiyerarşi Görüntüleyicisi, bir etkinliğin Görünüm hiyerarşisini görüntülemek içindir. Soru, görev / etkinlik yığını ile ilgiliydi .
Jeremy Logan

8

Son görevlerin listesi için

adb shell dumpsys activity recents

Çalışan Hizmetlerin listesi için

adb shell dumpsys activity services

Mevcut İçerik Sağlayıcıların listesi için

adb shell dumpsys activity providers

Yayın durumu listesi için

adb shell dumpsys activity broadcasts

Bekleyen Amaçlar listesi için

adb shell dumpsys activity intents

İzin listesi için

adb shell dumpsys activity permissions

Daha fazla GUI-sh yolunu seviyorsanız, AdbCommandereklentiyi kullanabilir ve bu komutları macrossekmeye ekleyebilirsiniz
prot0n


1

Çözüm: 'adb shell dumpsys etkinliği' TabActivity ile çalışmaz. Her sekme öğesi seçildiğinde, karşılık gelen etkinlik başlatılır. Ancak 'adb shell dumpsys etkinliği' kullanıldığında Her zaman 'ana' etkinliği döndürür:

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);

    }
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.