OnStart () ve onResume () arasındaki fark


176

onStart()Geçiş halinin anlamını anlayamıyorum. onResume()Yöntem her zaman sonra çağrılır onStart(). Neden onResume()çağrılan onRestart()ve onCreate()sadece dışlama yöntemleri olamaz onStart()? Amacı nedir?

Neden onsuz yaşayamayız onStart(). Hala gereksiz olarak görüyorum (muhtemelen anlamını tam olarak anlamadığınız için).


Uygulama yaşam döngüsü için buraya bakın: d.android.com/guide/topics/fundamentals.html
ykatchou

Bu şeyler kolaydır. Şimdi, bu İLE Fragments açıklayan deneyin en o senin için programlama android!
Scott Biggs

Aşağıdaki cevapların açıklamalı gerçek kodu yok. Bu , onu parça ile açıklayan koddur.
Atul

Yanıtlar:


306

Neden onRestts () ve onCreate () yöntemlerinden sonra onStart () dışında onResume () çağrılmıyor? Amacı nedir?

Tamam, ilk cevabım oldukça uzun olduğu için daha fazla genişletmeyeceğim, hadi bunu deneyelim ...

public DriveToWorkActivity extends Activity
    implements onReachedGroceryStoreListener {
}

public GroceryStoreActivity extends Activity {}

LÜTFEN AKLINIZDA BULUNDURUN: Kasıtlı olarak super.onCreate(...)vb. ;)

Aşağıdaki yöntemler DriveToWorkActivity...

protected void onCreate(...) {
    openGarageDoor();
    unlockCarAndGetIn();
    closeCarDoorAndPutOnSeatBelt();
    putKeyInIgnition();
}

protected void onStart() {
    startEngine();
    changeRadioStation();
    switchOnLightsIfNeeded();
    switchOnWipersIfNeeded();
}

protected void onResume() {
    applyFootbrake();
    releaseHandbrake();
    putCarInGear();
    drive();
}

protected void onPause() {
    putCarInNeutral();
    applyHandbrake();
}

protected void onStop() {
    switchEveryThingOff();
    turnOffEngine();
    removeSeatBeltAndGetOutOfCar();
    lockCar();
}

protected void onDestroy() {
    enterOfficeBuilding();
}

protected void onReachedGroceryStore(...) {
    Intent i = new Intent(ACTION_GET_GROCERIES, ...,  this, GroceryStoreActivity.class);
}

protected void onRestart() {
    unlockCarAndGetIn();
    closeDoorAndPutOnSeatBelt();
    putKeyInIgnition();
}

Tamam, bu yüzden başka bir uzun (üzgünüm millet). Ama işte benim açıklamam ...

onResume()sürüşe başladığım ve onPause()geçici olarak durduğum zamandır. Bu yüzden sürüyorum ve sonra kırmızı bir ışığa ulaşıyorum, duraklıyorum ... Işık yeşil oluyor ve devam ediyorum. Başka bir kırmızı ışık ve ben duruyorum, sonra yeşil, bu yüzden devam ediyorum. onPause() -> onResume() -> onPause() -> onResume()Döngü sıkı biridir ve benim yolculuk boyunca birçok kez meydana gelir.

Yeniden başlatma ile (yolculuğuma devam etmeye hazırlanıyoruz) tekrar tekrar başlatılmaya başlayan döngü belki daha az yaygındır. Bir durumda, Market'i görüyorum ve GroceryStoreActivitybaşlatıldı (benim DriveToWorkActivityiçin zorla onStop()). Mağazadan döndüğümde, devam onRestart()edip onStart()yolculuğuma devam ediyorum.

Ben öyle kodu koyabilirsiniz onStart()hem içine onCreate()ve onRestart()ve geçersiz kılmak rahatsız onStart()ihtiyaçları arasında yapılacak o daha hiç ama onCreate() -> onResume()ve onRestart() -> onResume()daha ben çoğaltarak ediyorum şeyler.

Yani, bir kez daha talep etmek ...

Neden onRestts () ve onCreate () yöntemlerinden sonra onStart () dışında onResume () çağrılmıyor?

Geçersiz kılmazsanız onStart(), etkili olan budur. Her ne kadar onStart()yöntemi Activitydolaylı olarak çağrılsa da, kodunuzdaki etki etkili onCreate() -> onResume()veya onRestart() -> onResume().


Bu, hem ima onCreate()ve onRestart()sağ, ortak bir sürü kod paylaşayım?
Dheeraj Vepakomma

1
@Dheeraj: Hayır, ille de değil. Bu sahte koddur ve sadece Activityyaşam döngüsünün her aşamasının nasıl kullanılabileceğini göstermek içindir. Oluşturma aşaması onCreate(...), örnek üyelerini (UI öğeleri vb.) Somutlaştırmak söz konusu olduğunda çok işe yarayabilir, ancak bir 'yeniden başlatma'nın bunu yapması gerekmez. Gerçekte birçok Activitiesgerçekten fazla uygulamak gerekmez onCreate(...), onResume()ve onPause()diğer yöntemler size başka şeyler yapmak gerekebilir durumlar için kullanılabilir ve anahtar nerede kodu koymak anlamaktır.
Squonk

1
Bu yüzden Android API'sinden iOS ve hatta WP7'ye kıyasla nefret etmeye geldim ... C # 'da üçünde de çalışan bir oyun yapıyorum ve Google ve Android ile çok hayal kırıklığına uğradığımı söylemeliyim. Dil / API tasarım bölümünde eksik görünüyorlar. Ben diğer bazı linux telefon işletim sistemi devralır umarım, çünkü genel olarak Açık Kaynak için oy ...
zezba9000

2
@Tim: Tamam, daha iyi bir tasarım bul. Birisi bir uygulamayı (uygulamanızı) kullandığında ve aniden bir telefon çağrısı aldığında cep telefonunda bir senaryo ile nasıl başa çıkacaksınız? Uygulama tasarımcısı Activityyaşam döngüsü yöntemlerini açıkça çağırmaz - bunu yapan Android işletim sistemidir ve çok verimli bir şekilde yapar (uygulama geliştiricisinin ne yaptığını bildiği ve aynı zamanda verimli bir şekilde kodladığı varsayılarak). Çok fazla Android geliştirme yaparsanız, şeylerin neden olduğu gibi çalıştığını anlayacaksınız -% 100 mükemmel değil ama oldukça iyi.
Squonk

9
Bence Nilesh'in aşağıdaki cevabı çok daha açık. Arasındaki temel fark, onStartve onResumebu görünürlüğü 've 'kullanıcı etkileşimi' taşımaktadır. Bu araba kullanmak metafor kafa karıştırıcı ve gerçekten yararlı değil.
KJ

142

Kısa cevap:

OnStart olmadan yaşayamayız çünkü bu etkinlik kullanıcının "görünür" hale geldiği durumdur, ancak kullanıcı onunla "etkileşime giremez" ancak başka bir küçük iletişim kutusuyla çakışmasına neden olabilir. Bu kullanıcı ile etkileşime girme yeteneği, onStart ve onResume'u farklı kılar. Bunu cam kapının arkasındaki bir kişi olarak düşünün. Kişiyi görebilirsiniz, ancak onunla etkileşim kuramazsınız (konuşun / dinleyin / el sıkışmayın). OnResume, daha sonra etkileşime başlayabileceğiniz kapı açıcı gibidir.

Ayrıca onRestart () en az anlaşılan olandır. Neden onRestart () yerine onStop () öğesinden sonra doğrudan onStart () veya onResume () öğesine gitmeme sorusunu sorabiliriz. Oluşturma kısmı atlanırsa, onRestart () öğesinin onCreate () işlevine kısmen eşdeğer olup olmadığını anlamak daha kolay olur. Temel olarak her iki durum da onStart () öğesine yol açar (yani Etkinlik görünür hale gelir). Yani her iki devlet de gösterilecek şeyleri "hazırlamalıdır". OnCreate, görüntülenecek şeyleri "oluşturmak" için ek sorumluluğa sahiptir

Kod yapıları şöyle olabilir:

onCreate()
{
     createNecessaryObjects();

     prepareObjectsForDisplay();
}


onRestart()
{
     prepareObjectsForDisplay();

}

Tüm karışıklık, Google'ın aşağıdaki gibi bir şey yerine sezgisel olmayan adlar seçmesi nedeniyle ortaya çıkar:

onCreateAndPrepareToDisplay()   [instead of onCreate() ]
onPrepareToDisplay()            [instead of onRestart() ]
onVisible()                     [instead of onStart() ]
onBeginInteraction()            [instead of onResume() ]
onPauseInteraction()            [instead of onPause() ]
onInvisible()                   [instead of onStop]
onDestroy()                     [no change] 

Etkinlik Şeması şu şekilde yorumlanabilir:

Android Etkinlik Yaşam Döngüsü


4
Öğrencilere açıkladığımda, onStop () yerine maybeOnInvisible () kullanıyorum. Ve onDestroy () yerine maybeOnDestroy () kullanın. Bu isimler bulduğum açıklamalar kadar iyi çalışıyor. Düşünce, Google'ın aslında bu adlara geçmesini istemem.
Stephan Branczyk

Senin önerilen isimleri gibi, onlar olmasına yardımcı bazı saçma Android API bu bölümünde duygusunu. Genel olarak yaşam döngüsü hakkında hala bir sorum var. Tüm diyagramlarda, onPause ile doğrudan onResume arasında bir yol olduğunu gösterir. Bu yolun hiçbir durumda gerçekten izlediğimi hiç sanmıyorum. Her zaman onStop'tan onStart'a giden yolu alır. Diğer yolu ne tetikleyebilir?
Dewey Vozel

@StephanBranczyk neden belki ... () kullanıyorsunuz? Neden belki"?
Marian Paździoch

1
@Damnum, Etkinlik yaşam döngüsünün en son açıklaması için Google tarafından oluşturulan ara Android Udacity kursuna göz atmanızı öneririm. Deneme düğmesine (ne de nanodegree düğmesine) değil, malzemelerine ücretsiz olarak erişmek için mavi düğmeyi tıkladığınızı varsayarsak ücretsizdir. udacity.com/course/developing-android-apps--ud853
Stephan Branczyk

1
@Damnum, izlediğiniz videoyla ilgili udacity forumunda bu soruyu sormanızı öneririm. Ancak temelde, kullanılan iletişim kutusuna, yalnızca bir iletişim etkinliği veya yalnızca bir iletişim kutusuna bağlı olduğunu düşünüyorum.
Stephan Branczyk

29

onStart()etkinliğin kullanıcı tarafından görülebilir hale gelmesi durumunda çağrılır. onResume()etkinliğin kullanıcıyla etkileşime girmeye başladığı zaman çağrılır. Bu durumlarda farklı şeyler yapmak isteyebilirsiniz.

Referans için bu bağlantıya bakın .



10

"Merhaba, Android, Google'ın Mobil Geliştirme Platformu Tanıtımı" kitabı, android uygulamalarının yaşam döngüsünün güzel bir açıklamasını verir. Neyse ki belirli bir bölümü çevrimiçi olarak bir alıntı olarak var. Http://media.pragprog.com/titles/eband3/concepts.pdf adresindeki 39. sayfadaki grafiğe bakın.

Bu arada, bu kitap android yeni başlayanlar için son derece tavsiye edilir!


2
Güzel görüntü ve iyi bir kitap, ama yine de neden onStart () yöntemine gerçekten ihtiyacımız olduğunu ve onResume () 'de yapamayacağımız özel şeyleri cevaplayamıyoruz.
Eugene

8
Uygulama duraklatılmışsa onStart () çağrılmaz. Başka bir uygulama odağı kazanır, ancak uygulamanızı tamamen örtmezse uygulamanız "duraklatılır". Yani "duraklatıldı" durumunda "Durduruldu" durumundakinden farklı şeyler yapabilirsiniz. Dolayısıyla, uygulamanız duraklatılmış durumdan "devam ettirilirse", uygulamanız durdurulmuş durumdan veya tam başlangıçtan "başlatılmışsa" yaptığınızdan farklı şeyler yapabilirsiniz. Bu yardımcı olur mu?
Martin Booka Weser

7

Özellikle alıngan bir örnek, bir Etkinliği kullanarak yönetilen bir İletişim Kutusu göstermeye karar verdiğiniz zamandır showDialog(). Eğer kullanıcı diyalog açıkken ekranı döndürürse (buna "konfigürasyon değişikliği" diyoruz), o zaman ana Aktivite bitene kadar tüm son yaşam döngüsü çağrılarından onDestroy()geçecek, yeniden yaratılacak ve yaşam döngülerine geri dönecektir. Ancak, beklemeyeceğiniz şey, onCreateDialog()ve onPrepareDialog()((yaptığınız zaman showDialog()ve şimdi tekrar otomatik olarak iletişim kutusunu yeniden oluşturmak için çağrılan yöntemler - yönetilen bir iletişim kutusu olduğu için otomatik olarak) ve arasındadır . Buradaki nokta, iletişim kutusunun tam ekranı kapsamaması ve bu nedenle ana etkinliğin bir kısmını görünür kılmasıdır. Bu bir detay ama önemli!onStart()onResume()


7

onStart()

  1. OnCreate (Paket) ya da onRestart sonra (), ardından sonra adlandırılan onResume () .
  2. onStart()UI'nizi etkileyen değişiklikleri izlemek için bir BroadcastReceiver kaydedebilirsiniz , onStop () 'da kaydını silmelisiniz.
  3. Türetilmiş sınıflar, süper sınıfın bu yöntemi uygulamasına başvurmalıdır. Eğer yapmazlarsa, bir istisna atılır.

onResume()

  1. OnRestoreInstanceState (Bundle), onRestart () veya onPause () öğesinden sonra çağrılır
  2. Animasyonlara başlayın, özel erişim cihazlarını açın (kamera gibi)

onStart() normalde işi, dönüş değerleri olan bir arka plan iş parçacığına gönderir:

  • START_STICKY öldürüldüğünde otomatik olarak yeniden başlatmak ve etkin kalmasını sağlamak için.

  • START_REDELIVER_INTENT otomatik olarak yeniden başlatma ve stopSelf () öğesinden önce hizmetin öldürülmesi durumunda yeniden deneyin.

onResume()cihaz uyku moduna geçtikten sonra veya bir Uyarı veya başka bir kısmi ekran alt etkinliği önceki pencerenin bir kısmını görünür bıraktığından işletim sistemi tarafından çağrılır, böylece bir yöntemi alanların yeniden başlatılması gerekir (bir istisnalar içeren bir deneme yapısında) ). Böyle bir durum onStop()çocuk kapandığında çağrılmaya neden olmaz .

onResume()onStart()etkinlik arka plandan devam ettiğinde çağrılmaz

Daha fazla ayrıntı için Android_activity_lifecycle_gotcha ve Etkinlik Yaşam Döngüsünü ziyaret edebilirsiniz.


aslında benim app arka plana gittiğinde başladım
deadfish

5

Umarım basit bir açıklama: -

onStart () -> etkinlik görünür hale geldiğinde çağrılır, ancak ön planda olmayabilir (ör. AlertFragment üstte veya olası başka herhangi bir kullanım durumunda).

onResume () -> etkinlik ön planda olduğunda çağrılır veya kullanıcı Etkinlik ile etkileşime girebilir.


4

onStart()Activitygörünür duruma girilmiş ve düzen oluşturulmuş ancak bu etkinlik düzeniyle etkileşime girilemez anlamına gelir .

Resume() artık etkinlik düzeniyle etkileşimde bulunabileceğiniz anlamına gelir.


1

OnStart () ve onResume () çağrıları arasında gerçekleşen şeyler olduğunu unutmayın. Yani, acı içinde bulduğum onNewIntent ().

Eğer SINGLE_TOP işareti kullanıyorsunuz ve niyet ekstralar kullanarak, etkinlik için bazı veri göndermek, yalnızca denir onNewIntent (), bunu erişmek mümkün olacak sonra onStart () ve daha önce onResume (). Bu nedenle, genellikle yeni (belki sadece değiştirilmiş) verileri ekstralardan alır ve bazı sınıf üyelerine ayarlarsınız veya yeni amacı orijinal etkinlik hedefi olarak ayarlamak ve onResume () içindeki verileri işlemek için setIntent () öğesini kullanırsınız.


0

Http://developer.android.com/training/basics/activity-lifecycle/starting.html referansı

onResume()Etkinlik kullanıcıyla etkileşime girmeden hemen önce çağrılır. Bu noktada etkinlik, kullanıcı girdisine gidecek şekilde etkinlik yığınının en üstündedir. Daima takip eder onPause().

onPause()Sistem başka bir etkinliğe devam etmek üzereyken çağrılır. Bu yöntem genellikle kalıcı verilere kaydedilmemiş değişiklikler yapmak, animasyonları durdurmak ve CPU tüketebilecek diğer şeyler için kullanılır. Çok hızlı bir şekilde ne yaparsa yapsın, çünkü bir sonraki faaliyet geri dönene kadar sürdürülmeyecek. Bunu onResume(), etkinliğin öne geri dönmesi veya kullanıcı tarafından onStop()görünmez hale gelmesi izler.


0

Bunun bir cevap olarak kabul edilip edilmediğinden emin değilim - ama burada farkı açıklayan Google'ın Kursundan (Kotlin ile Android Uygulamaları Geliştirme) YouTube Videosu var .

  • Başlangıç görünürken etkinlik görünür hale gelir
  • Açık Duraklatma, etkinlik odağı kaybettiğinde çağrılır (bir iletişim kutusu açılır gibi)
  • Etkinliğe odaklanıldığında Özgeçmişte çağrılır (bir iletişim kutusu kaybolduğunda olduğu gibi)
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.