2012-03-05 18 views
6

Yönelim değişikliği konusunda uygulamamda garip bir davranışı var.Yönlendirmeden sonraki ikinci aktivite örneği

normal davranışı: Ben uygulamasını açtığınızda
benim ev etkinliği başlatır. Bir sonraki etkinliğe (bir galeriye) gittiğimde, normal olarak başlatılır (sürgülü animasyon ile sağdan sola). Geri tuşu kullanarak geri döndüğümde, geçerli etkinlik (galeri) bitiyor (soldan sağa kaydırmalı bir animasyonla).

tuhaf davranış: Ben dikey modda uygulamayı başlatma ve yatay yönünü değiştirmek ediyorum

  • . Sonra ev aktivitesinin ikinci bir örneği gibi bir şey var. Ardından, yatay modda geri düğmesine basmak, uygulamayı yönlendirme değişikliği olmadan yapacağı gibi kapatmaz (ev etkinliği benim uygulamasındaki ilk etkinliktir) ancak daha soldan sağa kayma animasyonu yapar (yeni bir etkinlik başlatmak gibi) ve ev aktivitesini (ama bence başka bir örneği) tekrar gösterir. Geri düğmesine ikinci kez basmak uygulamayı kapatır.
  • Uygulamayı yatay modda başlattığımda ve yönlendirmeyi dikey moda geçirdiğimde, geri düğmesine basıp sağdan sola slayt animasyonu (bir etkinliği kapama gibi) elde edersiniz ve ev etkinliğini tekrar gösterir.
  • Uygulamayı başlattığımda ve portre yönünü değiştirmek için iki yönlendirme yaptığımda, geri düğmesi uygulamayı gerektiği gibi kapatır.

Yani manzara gibi ve portre modu iki farklı etkinlik gibi ele alınır.

android:configChanges="orientation|keyboardHidden|screenSize" kullanmayın, bu nedenle bir yön değişikliği normal android etkinlik yaşam döngüsünü takip etmeli ve etkinliğin "eski" portre (veya manzara) sürümünü yok etmelidir.
Etkinliklerim FragmentActivity'dan devralınır. onSaveInstanceState kullanıyorum, parceable (etkinlik için herhangi bir başvuru içermiyor) geçiriyorum ve onRetainCustomNonConfigurationInstance (read here) kullanarak çeşitli AsyncTask s geçmek için kullanıyorum. Ancak bu görevlerdeki tüm başvurular (varsa) onRetainCustomNonConfigurationInstance'da yok edilir ve getLastCustomNonConfigurationInstance'dan sonra (yeni oluşturulan etkinlikle) geri yüklenir.

Bu davranışa neyin neden olabileceği hakkında bir fikrin var mı?

DÜZENLEME: Manifest-Dosya
Eylem Deklarasyonu:
<activity android:name=".activities.smartphone.HomeSmartphone" android:label="@string/app_name"></activity>

HomeSmartphone Ev uzanır
Ev MyFragmentActivity
MyFragmentActivity uzanır

yılında android.support.v4.app.FragmentActivity uzanır MyFragmentActivity sadece onCreate, onRestart, onStart, onSaveInstanceState, onPause, onResu'da bazı günlük oluşturma/izleme şeyler yapıyorum Ben sadece, uygulama içeriğine bir referans tutan bir izleme sınıfının bazı statik yöntemlerini çağırarak, OnStop, onDestroy. Faaliyet bağlamına değil.

Home, HomeSmartphone ve HomeTablet tarafından genişletilen soyut bir sınıftır.Bu iki sınıf, farklı düzenlerde sadece bazı özel yükleme/ferahlatıcı/inisiyasyon yapar.

En çok görev soyut Home sınıfında yapılır.



    public HomeRetainedObjects retained = new HomeRetainedObjects(); 

    public boolean adIsShown = false; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     this.setContentView(R.layout.home); 

     Log.i("DEBUG", "onCreate(Home)"); 

     if (savedInstanceState != null) { 
      this.adIsShown = savedInstanceState.getBoolean("adIsShown"); 
     } 

    // write/update values in shared preferences 
     this.initPreferences(); 

    // recover retained objects (mostly AsyncTasks) 
     this.recoverRetained(); 

    // show content/refresh content 
     this.init(); 
    } 

    @Override 
    protected void onSaveInstanceState(Bundle outState) { 
     super.onSaveInstanceState(outState); 

     outState.putBoolean("adIsShown", this.adIsShown); 

     Log.i("DEBUG", "onSaveInstanceState(Home)"); 
    } 

    public void recoverRetained() { 
     Object retained = this.getLastCustomNonConfigurationInstance(); 
     if (retained instanceof HomeRetainedObjects) { 
      this.retained = (HomeRetainedObjects) retained; 

      if (this.retained.loadMessageTask != null) { 
       this.retained.loadMessageTask.restoreContext(this); 
      } 
     } 
    } 

    @Override 
    public Object onRetainCustomNonConfigurationInstance() { 
     if (this.retained.loadMessageTask != null) { 
      this.retained.loadMessageTask.destroyContext(); 
     } 

     return this.retained; 
    } 

Umarım bu yardımcı olur mu ?!

+0

kodunuzu bize göster ... –

+0

... manifestosunda faaliyet beyanı, plz. Bize çabalarınızı gösteren iyi bir soru için – Turnsole

+3

+1 –

cevap

0

Benzer bir sorunla karşılaştım ve sorunlarınızın nedeni onRetainCustomNonConfigurationInstance()'u geçersiz kılıyor.

Saklama durumu nesnesini inceledim ve bir Context referansını tuttuğunu öğrendim. Bir WeakReference içinde sardım ve normal davranış geri döndü ve hiçbir garip çift örnekle ilgili değildi.

Belki de tutma durumunuz Context numaralı başvuruya da bakıyor?