2013-08-21 14 views
8

Kullanıcılarımın çok azı için çok kafa karıştırıcı bir sorunla karşı karşıyayım. Hata, bir Parçanın içine başka bir Parçalı Etkinlik başlatan bir düğmeye basıldığında oluşur. Nedeniyle hata bu çizgiyeParça Etkinliği - uygulama öldü, kaydedilmiş durum yok

I/20:22:23.901 ActivityManager(1668) 
Start proc com.brandall.nutter for activity com.brandall.nutter/.ActivityHomeFragment: pid=8956 uid=10125 gids={50125, 3003, 3001, 3002, 1015, 1023, 1006, 1028} 
I/20:22:23.881 WindowState(1668) 
WIN DEATH: Window{41ed1948 u0 com.brandall.nutter/com.brandall.nutter.ActivityLinkAppsFragment} 
W/20:22:23.881 ActivityManager(1668) 
Force removing ActivityRecord{411c4188 u0 com.brandall.nutter/.ActivityLinkAppsFragment}: app died, no saved state 
I/20:22:23.881 WindowState(1668) 
WIN DEATH: Window{41b6a178 u0 Toast EXITING} 
W/20:22:23.881 InputDispatcher(1668) 
Attempted to unregister already unregistered input channel '41ed1948 com.brandall.nutter/com.brandall.nutter.ActivityLinkAppsFragment (server)' 
W/20:22:23.871 ActivityManager(1668) 
Scheduling restart of crashed service com.brandall.nutter/.TTSS in 80000ms 
I/20:22:23.871 ActivityManager(1668) 
Process com.brandall.nutter (pid 8907) has died. 
I/20:22:23.871 WindowState(1668) 
WIN DEATH: Window{411d4ff0 u0 com.brandall.nutter/com.brandall.nutter.ActivityHomeFragment} 
E/20:22:23.871 InputDispatcher(1668) 
channel '41ed1948 com.brandall.nutter/com.brandall.nutter.ActivityLinkAppsFragment (server)' ~ Channel is unrecoverably broken and will be disposed! 
W/20:22:23.871 InputDispatcher(1668) 
channel '41ed1948 com.brandall.nutter/com.brandall.nutter.ActivityLinkAppsFragment (server)' ~ Consumer closed input channel or an error occurred. events=0x9 

: Burada yığın izlemesi

com.brandall.nutter/.ActivityLinkAppsFragment}: app died, no saved state 

Ben Fragment kaydedilen durumları hakkında birçok mesaj okuma oldum, ama hiçbiri daha doğrusu, benim koşullarda uygulamak gibi görünüyor Yığın izinde belirtilmeyen Fragmentlerin kendilerine. Diğer mesajlar her Fragment eklemenizi öneririz:

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setRetainInstance(true); 
} 

Şu anda benim Fragments hiçbirinde onCreate yöntemini geçersiz kılmaz.

Ben de her Fragment bu ekleyerek önerdi gördüm: Bunun dışında sadece kullanıcıların çok az sayıda oluyor olmasından

@Override 
public void onSaveInstanceState(Bundle outState) { 
    super.onSaveInstanceState(outState); 
    setUserVisibleHint(true); 
} 

, en şaşırtıcı konu kullanılan Bağlam ile geçerli:

final Intent sa = new Intent(getActivity(), ActivityLinkAppsFragment.class); 
getActivity().startActivity(sa); 

Benim uygulamanın ön plan hizmeti vardır ve bunun yerine yukarıda Niyet içinde (statik getServiceContext() yöntemi yoluyla) o statik Bağlam kullanırsanız, sorun artık Fragment Etkinliği doğru açılır kullanıcılar ve için oluşur .

Başka bir Bağlamın kullanılmasının neden sorunun olmasını önlemesi gerektiğini anlamıyorum, ancak sağladığım bilgilerle ilgili olarak birilerinin mantıklı olacağını umuyorum!

FragmentPagerAdapter kodunu, ilgili olduğunu kanıtlıyorsa kullanıyorum, ancak oldukça standart bir şekilde sağlayabilirim. Ben eklemek unuttum çok önemli bir şey -

önceden

DÜZENLEME teşekkür ederiz. Bu, uygulamanın çökmesine neden olmaz. Bunun yerine, Parçanın bulunduğu Etkinlik, hemen yeniden başlatılır.

CEVAP - Kullanıcı uygulamanın 'floş' bellek kullanımı istediğinde beni şartlar altında System.exit(0) çağrılmasına sadece olası düşünce nedeniyle bu neden oldu. Yanlışydım ve kullanıcının cihazının düşük bellek koşullarına sahip olduğunda da çağrılabilir. @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

+1

Eğer 'Aktivite' içinde bir dinleyicinin kaydedilmesi ve orada 'startActivity' işleminin yapılması için önerilen deseni kullanırsanız, bu hala devam ediyor mu?'Fragmanlar' hiçbir zaman kendi aktivitelerine başlamamalıdır çünkü bir Aktivitenin başlatılıp başlatılmayacağını veya bir Parçanın eklenip eklenmeyeceğini bilmeleri için bir yol yoktur. Ayrıca, neden burada Intent.FLAG_ACTIVITY_NEW_TASK kullanılıyor? –

+0

@PaulBurke Bayrak orada olmamalı - Yanıltıcı olduğum için üzgünüm, testlerimde kaldığı için sorudan kaldırırım. Faaliyetlerimi çok basit bir yığın olarak ele aldığımda, asla 'başlatılmaları' gerekip gerekmediğini düşünmek zorunda kalmamıştım. Açıkladığınız dinleyici yaklaşımını arayacağım. Teşekkür ederim. – brandall

+0

@brandall, Fragment'ın onClick() 've yaşam döngüsü yöntemlerini paylaşabilir misiniz? –

cevap

10

Yığın izlemede iletinin Android kaynak kodunu inceledim ve bunun ActivityManagerService.handleAppDiedLocked() yönteminden geldiğini öğrendim. Bu yöntemin açıklamaları, "Bu işlemin bir sonucu olarak etkinlik yöneticisinden mevcut bir işlemi kaldırmak için Ana işlev." Diyor. İşlemin tüm bağlantılarını temizler. " Bu, uygulama öldüğünde gerçekleşir. Sistem tarafından, başka bir uygulama (ör., Bir görev yöneticisi uygulaması) tarafından veya uygulama kendi kendine bittiğinde (ör. System.exit(0)) öldürülür.

+0

İlginç - bu çok az sayıdaki sorunu açıklıyor! Şimdi okuyacağım ve kullanıcılarımla kontrol edeceğim! Teşekkürler. – brandall

+0

Kullanıcılarımdan bir kaçını bu sorunla kontrol ettim ve bir görevli katil yüklü değiller ... Gerçekten de haklı olduğunuzu umuyordum! – brandall

+0

Haklıydınız - Kullanıcı açısından değil, uygulamadaki uygulamamdan. System.exit (0) çağırıyordum; hiçbir zaman idam edilmeyeceğini düşündüğüm belirli şartlar altında - yanılmışım, ağır bellek yükünün altında olduğunu sanıyorum. Bu cevabı ikiye bağladı - http://stackoverflow.com/a/14756126/1256219 Cevabınızı o gönderiye bir referansla güncellemek istiyorsanız ve bunun ActivityManagerService.handleAppDiedLocked() ile ilgili olduğunu nasıl bildiniz? Doğru olarak işaretleyiniz. Teşekkür ederim! – brandall

İlgili konular