onNewIntent () yaşam döngüsü ve kayıtlı dinleyiciler


150

Bir arama iletişim kutusundan niyet almak için bir singleTop Etkinlik kullanıyorum onNewIntent().

Fark ettiğim şey, onPause()daha önce denironNewIntent() ve daha sonra çağırır onResume(). Görme:

  • arama iletişim kutusu başlatıldı
  • etkinliğe yapılan arama amacı
  • onPause()
  • onNewIntent()
  • onResume()

Sorun kayıtlı dinleyicileri olması onResume()çıkarıldı olsun onPause(), ancak içini ihtiyaç vardır onNewIntent()çağrı. Bu dinleyicileri erişilebilir hale getirmenin standart bir yolu var mı?

Yanıtlar:


294

onNewIntent(), yığın içinde zaten başka bir yerde çalışan ve bu nedenle çağıramayan singleTop etkinlikleri için giriş noktası anlamına gelir onCreate(). Bu nedenle faaliyetlerin yaşam döngüsü açısından daha onPause()önce aramak gerekir onNewIntent(). İçinde bu dinleyicileri kullanmamak için etkinliğinizi yeniden yazmanızı öneririm onNewIntent(). Örneğin çoğu zaman onNewIntent()yöntemlerim şöyle görünür:

@Override
protected void onNewIntent(Intent intent) {
    super.onNewIntent(intent);
    // getIntent() should always return the most recent
    setIntent(intent);
}

Tüm kurulum mantığı olup biten onResume()faydalanarak getIntent().


@Rodja bu konuda yorumunu memnun edecek stackoverflow.com/questions/19092631/... da
Geliştirici

3
Asıl soruya ilgili: Eğer arama işlemek için kod taşırsanız akılda tutmak Intentiçine onResume(), Etkinlik muhtemelen bir o devam eder her zaman arama yürütmek istediğiniz muhtemelen davranışı çalışacaktır.
Tony Chan

1
Rodja diyor ki: Etkinlikler yaşam döngüsü bakış açısından, onNewIntent () Android'in bu şekilde tasarlanması gerekmeden önce onPause () öğesini çağırmak gerekir. Etkinliğiniz, devam etmek için yaşam döngüsünün içinden geçti bile (). Android için onPause () öğesini çağırmak ve ardından onResume () öğesini tekrar aramak GEREKMEZ. Uygulama yeniden başlatılırsa işletim sistemi onNewIntent () öğesini çağırıp devam ettirilebilir durumda kalabilir.
Sani Elfishawy

Rodja diyor ki: Etkinlikler yaşam döngüsü bakış açısından, onNewIntent () Android'in bunu tasarlaması gerekmeden önce onPause () öğesini çağırmak gerekir. Etkinliğiniz devam etmek için yaşam döngüsüne girmiş durumda. Yasa devam ettirilirse, onNewIntent () yöntemini çağırıp devam ettirilebilirler. Android'in sıralamasındaki sorun, arka plan amacı nedeniyle onPause ile kullanıcı eylemi nedeniyle onPause'u ayırt etmeyi imkansız hale getirmesidir. OnPause'u yalnızca kullanıcı eylemi durumunda kullanmak istiyorsanız, vidalısınız çünkü onPause () 'a neden geleceğinizi bilmeyeceksiniz.
Sani Elfishawy

Dikkat edilmesi gereken önemli nokta, getIntent () öğesinin yine de orijinal Niyeti döndürmesidir. Yeni Niyeti güncellemek için setIntent (Niyet) kullanabilirsiniz.
linuxjava

15

Not: Yaşam döngüsü yöntemini başka bir yöntemden çağırmak iyi bir uygulama değildir. Aşağıdaki örnekte, Etkinlik türünüzden bağımsız olarak onNewIntent'inizin her zaman çağrılmasını sağlamaya çalıştım.

OnNewIntent (), etkinlik ilk kez oluşturulma durumu dışında her zaman singleTop / Task etkinlikleri için çağrılır. O zaman onCreate, bu iş parçacığında sorulan birkaç sorgunun çözümünü sağlamaya çağrılır.

OnNewIntent'i her zaman gibi onCreate yöntemine koyarak

@Override
public void onCreate(Bundle savedState){
    super.onCreate(savedState);
    onNewIntent(getIntent());
}

@Override
protected void onNewIntent(Intent intent) {
  super.onNewIntent(intent);
  //code
}

59
Genellikle yaşam döngüsü yöntemlerini doğrudan çağırmak iyi bir fikir değil, değil mi? OnNewIntent () 'in zararsız veya belki de bazı temel uygulamaları onPause ()' in zaten çağrıldığını varsayar? Her iki yerden de çağrılabilir bir yöntemde uygulama kodunu kapsüllemek büyük olasılıkla daha güvenlidir.
BernalKC

12
Kabul. Bu yaklaşımı kullanarak birkaç son durumla karşılaştık. En iyi kaçınılması.
Saad Farooq

3
Evet ... bundan kaçınmaya da katılıyorum ... Bu, onCreate'den NewIntent'i çağırmak isteyenler içindi.
Pawan Maheshwari
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.