Perbedaan antara onStart () dan onResume ()

176

Saya tidak bisa mendapatkan arti dari onStart()kondisi transisi. The onResume()Metode selalu disebut setelah onStart(). Mengapa tidak dapat onResume()dipanggil setelah onRestart()dan onCreate()metode hanya mengecualikan onStart()? Apa tujuannya?

Mengapa kita tidak bisa hidup tanpanya onStart(). Saya masih menganggapnya berlebihan (mungkin karena tidak mengerti artinya sepenuhnya).

Eugene
sumber
Lihat di sini untuk daur hidup aplikasi: d.android.com/guide/topics/fundamentals.html
ykatchou
Hal ini mudah. Cobalah menjelaskan DENGAN Fragmen ini, sekarang bahwa ini android pemrograman untuk ya!
Scott Biggs
Jawaban di bawah ini tidak memiliki kode aktual dengan penjelasan. Ini adalah kode yang menjelaskannya dengan fragmen.
Atul

Jawaban:

306

Mengapa tidak bisa onResume () dipanggil setelah metode onRestart () dan onCreate () tidak termasuk onStart ()? Apa tujuannya?

OK, karena jawaban pertama saya cukup panjang, saya tidak akan memperpanjang lebih jauh jadi mari kita coba ini ...

public DriveToWorkActivity extends Activity
    implements onReachedGroceryStoreListener {
}

public GroceryStoreActivity extends Activity {}

TOLONG DICATAT: Saya sengaja mengabaikan panggilan untuk hal-hal seperti super.onCreate(...)dll. Ini adalah kode semu jadi beri saya beberapa lisensi artistik di sini. ;)

Metode untuk DriveToWorkActivitymengikuti ...

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

OK, jadi satu lagi (maaf orang). Tapi inilah penjelasan saya ...

onResume()adalah saat saya mulai mengemudi dan onPause()saat saya berhenti sementara. Jadi saya mengemudi kemudian mencapai lampu merah jadi saya berhenti ... lampu menjadi hijau dan saya melanjutkan. Lampu merah lain dan saya berhenti, lalu hijau jadi saya melanjutkan. The onPause() -> onResume() -> onPause() -> onResume()Loop adalah satu ketat dan terjadi berkali-kali melalui perjalanan saya.

Putaran dari dihentikan kembali melalui restart (bersiap untuk melanjutkan perjalanan saya) untuk memulai lagi mungkin kurang umum. Dalam satu kasus, saya melihat Toko Kelontong dan GroceryStoreActivitymulai (memaksa saya DriveToWorkActivityke titik onStop()). Ketika saya kembali dari toko, saya pergi onRestart()dan onStart()melanjutkan perjalanan.

Saya bisa memasukkan kode yang ada di onStart()keduanya onCreate()dan onRestart()dan tidak repot-repot menimpa onStart()sama sekali tetapi semakin banyak yang perlu dilakukan antara onCreate() -> onResume()dan onRestart() -> onResume(), semakin saya menduplikasi hal-hal.

Jadi, untuk mengutip kembali sekali lagi ...

Mengapa tidak bisa onResume () dipanggil setelah metode onRestart () dan onCreate () tidak termasuk onStart ()?

Jika Anda tidak menimpa onStart()maka inilah yang terjadi secara efektif. Meskipun onStart()metode Activityakan dipanggil secara implisit, efek dalam kode Anda efektif onCreate() -> onResume()atau onRestart() -> onResume().

Squonk
sumber
Ini menyiratkan bahwa keduanya onCreate()dan onRestart()akan berbagi banyak kode umum, bukan?
Dheeraj Vepakomma
1
@ Heeraj: Tidak belum tentu. Ini adalah kode semu dan dimaksudkan untuk menggambarkan bagaimana setiap tahap Activitysiklus hidup dapat digunakan. Tahap pembuatan onCreate(...)mungkin dapat melakukan banyak hal ketika datang untuk membuat instance anggota (elemen UI dll) tetapi 'restart' tidak perlu melakukan itu. Pada kenyataannya banyak Activitiesyang tidak benar-benar perlu menerapkan lebih dari onCreate(...), onResume()dan onPause()metode lain tersedia untuk kasus-kasus di mana Anda mungkin perlu melakukan hal-hal lain dan kuncinya adalah memahami di mana harus meletakkan kode.
Squonk
1
Inilah sebabnya saya membenci API Android dibandingkan dengan iOS dan bahkan WP7 ... Saya telah membuat game yang berjalan pada ketiganya di C # dan saya harus mengatakan saya sangat kecewa dengan Google dan Android. Mereka tampaknya kurang di departemen desain Bahasa / API. Saya harap beberapa OS ponsel linux lainnya mengambil alih, karena saya memilih Open Source secara umum ...
zezba9000
2
@Tim: Oke, buat desain yang lebih baik. Bagaimana Anda menghadapi skenario di ponsel ketika seseorang menggunakan aplikasi (aplikasi Anda) dan mereka tiba-tiba mendapat panggilan telepon? Perancang aplikasi tidak secara eksplisit menyebut Activitymetode siklus hidup - ini adalah OS Android yang melakukannya dan melakukannya dengan sangat efisien (dengan asumsi pengembang aplikasi tahu apa yang mereka lakukan dan juga kode secara efisien). Jika Anda melakukan banyak pengembangan Android, Anda akan menyadari mengapa segala sesuatunya berjalan sebagaimana mestinya - itu tidak 100% sempurna tetapi cukup bagus.
Squonk
9
Saya pikir jawaban Nilesh di bawah ini jauh lebih jelas. Perbedaan utama antara onStartdan onResumeadalah 'visibilitas' dan 'interaksi pengguna'. Metafora mengendarai mobil ini membingungkan dan tidak terlalu membantu.
KJ
142

Jawaban singkat:

Kita tidak dapat hidup tanpa onStart karena itu adalah keadaan ketika aktivitas menjadi "terlihat" oleh pengguna, tetapi pengguna tidak dapat "berinteraksi" dengannya namun mungkin menyebabkannya tumpang tindih dengan beberapa dialog kecil lainnya. Kemampuan untuk berinteraksi dengan pengguna ini adalah yang membedakan onStart dan onResume. Anggap saja orang di balik pintu kaca. Anda dapat melihat orang itu tetapi Anda tidak dapat berinteraksi (berbicara / mendengarkan / berjabat tangan) dengannya. OnResume seperti pembuka pintu, setelah itu Anda dapat memulai interaksi.

Selain itu onRestart () adalah yang paling sedikit dipahami. Kita dapat mengajukan pertanyaan mengapa tidak langsung menuju ke onStart () atau onResume () setelah onStop () alih-alih onRestart (). Menjadi lebih mudah untuk dipahami jika kita perhatikan bahwa onRestart () sebagian setara dengan onCreate () jika bagian pembuatan dihilangkan. Pada dasarnya kedua status mengarah ke onStart () (yaitu Aktivitas menjadi terlihat). Jadi kedua negara harus "menyiapkan" barang yang akan ditampilkan. OnCreate memiliki tanggung jawab tambahan untuk "membuat" barang yang akan ditampilkan

Jadi struktur kode mereka mungkin cocok dengan sesuatu seperti:

onCreate()
{
     createNecessaryObjects();

     prepareObjectsForDisplay();
}


onRestart()
{
     prepareObjectsForDisplay();

}

Seluruh kebingungan disebabkan karena Google memilih nama yang tidak intuitif dan bukan sesuatu sebagai berikut:

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] 

Diagram Aktivitas dapat ditafsirkan sebagai:

Siklus Hidup Aktivitas Android

Nilesh Pawar
sumber
4
Ketika saya menjelaskannya kepada siswa, saya menggunakan maybeOnInvisible () alih-alih onStop (). Dan gunakan maybeOnDestroy () alih-alih onDestroy (). Nama-nama ini bekerja dengan baik sebagai penjelasan yang saya temukan. Kupikir, aku tidak ingin Google benar-benar mengubah nama-nama ini.
Stephan Branczyk
Saya seperti nama Anda disarankan, mereka membantu membuat beberapa rasa ini bagian dari API Android konyol. Saya masih memiliki pertanyaan secara umum tentang siklus hidup. Di semua diagram itu menunjukkan ada jalan dari onPause langsung ke onResume. Saya tidak berpikir saya pernah melihat jalan yang benar-benar mengikuti dalam kasus apa pun. Selalu mengambil jalur dari onStop ke onStart. Apa yang akan memicu jalan lain?
Dewey Vozel
@StephanBranczyk mengapa Anda menggunakan mungkin ... ()? Kenapa mungkin"?
Marian Paździoch
1
@ Damnum, Untuk penjelasan terbaru dari siklus hidup Kegiatan, saya sarankan Anda memeriksa kursus Android Udacity antara yang dibuat oleh Google. Ini gratis, dengan asumsi Anda mengklik tombol biru untuk mengakses materi secara gratis, dan bukan tombol uji coba (atau tombol nanodegree). udacity.com/course/developing-android-apps--ud853
Stephan Branczyk
1
@ Damnum, saya sarankan Anda mengajukan pertanyaan itu di forum udacity terkait dengan video yang Anda tonton. Tetapi pada dasarnya, saya pikir itu tergantung pada dialog yang digunakan, apakah itu kegiatan dialog, atau hanya dialog.
Stephan Branczyk
29

onStart()dipanggil saat aktivitas menjadi terlihat oleh pengguna. onResume()dipanggil saat aktivitas akan mulai berinteraksi dengan pengguna. Anda mungkin ingin melakukan hal yang berbeda dalam kasus ini.

Lihat tautan ini untuk referensi.

Sergey Glotov
sumber
10

Buku "Halo, Android, Memperkenalkan Platform Pengembangan Seluler Google" memberikan penjelasan yang bagus tentang siklus hidup aplikasi android. Untungnya mereka memiliki bab khusus online sebagai kutipan. Lihat gambar di halaman 39 di http://media.pragprog.com/titles/eband3/concepts.pdf

Ngomong-ngomong, buku ini sangat direkomendasikan untuk pemula android!

Martin Booka Weser
sumber
2
Gambar yang bagus dan buku yang bagus, tetapi tetap saja tidak memberikan jawaban mengapa kita benar-benar membutuhkan metode onStart () dan hal-hal khusus apa yang dapat kita lakukan di dalamnya yang tidak dapat kita lakukan di onResume ().
Eugene
8
onStart () TIDAK dipanggil, jika aplikasi dijeda. Aplikasi Anda "dijeda" jika aplikasi lain mendapatkan fokus tetapi TIDAK mengaburkan aplikasi Anda sepenuhnya. Jadi, Anda dapat melakukan berbagai hal dalam kondisi "jeda" daripada yang Anda lakukan dalam kondisi "Berhenti". Dengan demikian, Anda dapat melakukan hal-hal yang berbeda jika aplikasi Anda hanya "dilanjutkan" dari keadaan dijeda daripada yang akan Anda lakukan jika aplikasi Anda "dimulai" dari keadaan berhenti atau dari awal sepenuhnya. Apakah itu membantu?
Martin Booka Weser
7

Contoh khusus yang penuh semangat adalah ketika Anda memutuskan untuk menampilkan Dialog yang dikelola dari suatu Aktivitas menggunakan showDialog(). Jika pengguna memutar layar saat dialog masih terbuka (kami menyebutnya "perubahan konfigurasi"), maka Aktivitas utama akan melewati semua panggilan siklus akhir hingga onDestroy(), akan diciptakan kembali, dan kembali melalui siklus hidup. Apa yang Anda mungkin tidak harapkan, adalah itu onCreateDialog()dan onPrepareDialog()(metode yang dipanggil ketika Anda lakukan showDialog()dan sekarang lagi secara otomatis untuk membuat ulang dialog - secara otomatis karena itu adalah dialog yang dikelola) dipanggil antara onStart() dan onResume(). Intinya di sini adalah bahwa dialog tidak mencakup layar penuh dan karenanya meninggalkan bagian dari kegiatan utama yang terlihat. Ini detail tapi itu penting!

pjv
sumber
7

onStart()

  1. Dipanggil setelah onCreate (Bundle) atau setelah onRestart () diikuti oleh onResume () .
  2. Anda dapat mendaftarkan BroadcastReceiver onStart()untuk memantau perubahan yang berdampak pada UI Anda, Anda harus membatalkan pendaftarannya di onStop ()
  3. Kelas turunan harus memanggil implementasi metode ini dari kelas super. Jika tidak, pengecualian akan dilemparkan.

onResume()

  1. Dipanggil setelah onRestoreInstanceState (Bundle), onRestart (), atau onPause ()
  2. Mulai animasi, buka perangkat akses-eksklusif (seperti kamera)

onStart() biasanya mengirimkan pekerjaan ke utas latar belakang, yang nilainya kembali adalah:

  • START_STICKY untuk memulai ulang secara otomatis jika terbunuh, agar tetap aktif.

  • START_REDELIVER_INTENT untuk restart otomatis dan coba lagi jika layanan mati sebelum stopSelf ().

onResume()dipanggil oleh OS setelah perangkat tidur atau setelah peringatan atau aktivitas anak layar parsial lainnya membuat sebagian dari jendela sebelumnya terlihat sehingga metode perlu menginisialisasi ulang bidang (dalam struktur percobaan dengan tangkapan pengecualian) ). Situasi seperti itu tidak menyebabkan onStop()dipanggil ketika anak ditutup.

onResume()dipanggil tanpa onStart()ketika aktivitas dilanjutkan dari latar belakang

Untuk lebih jelasnya Anda dapat mengunjungi Android_activity_lifecycle_gotcha Dan Siklus Hidup Aktivitas

IntelliJ Amiya
sumber
sebenarnya saya mendapat berhenti ketika aplikasi saya pergi ke latar belakang
ikan mati
5

Semoga penjelasan sederhana: -

onStart () -> dipanggil ketika aktivitas menjadi terlihat, tetapi mungkin tidak ada di latar depan (misalnya AlertFragment di atas atau case use lainnya yang mungkin).

onResume () -> dipanggil saat aktivitas di latar depan, atau pengguna dapat berinteraksi dengan Aktivitas.

aprofromindia
sumber
4

onStart()berarti Activitydimasukkan ke dalam keadaan terlihat dan tata letak dibuat tetapi tidak dapat berinteraksi dengan tata letak aktivitas ini.

Resume() artinya sekarang Anda dapat melakukan interaksi dengan tata letak aktivitas.

Abhi
sumber
1

Perhatikan bahwa ada hal-hal yang terjadi antara panggilan ke onStart () dan onResume (). Yaitu, onNewIntent (), yang saya temukan dengan menyakitkan.

Jika Anda menggunakan flag SINGLE_TOP, dan Anda mengirim beberapa data ke aktivitas Anda, menggunakan ekstra maksud, Anda akan dapat mengaksesnya hanya di onNewIntent (), yang dipanggil setelah onStart () dan sebelum onResume (). Jadi biasanya, Anda akan mengambil data baru (mungkin hanya dimodifikasi) dari ekstra dan mengaturnya ke beberapa anggota kelas, atau menggunakan setIntent () untuk mengatur maksud baru sebagai maksud aktivitas asli dan memproses data di onResume ().

Corneliu Dascălu
sumber
0

Referensi ke http://developer.android.com/training/basics/activity-lifecycle/starting.html

onResume()Disebut tepat sebelum aktivitas mulai berinteraksi dengan pengguna. Pada titik ini, aktivitas berada di atas tumpukan aktivitas, dengan input pengguna menuju ke sana. Selalu diikuti oleh onPause().

onPause()Disebut ketika sistem akan memulai kembali aktivitas lain. Metode ini biasanya digunakan untuk melakukan perubahan yang belum disimpan ke data persisten, menghentikan animasi dan hal-hal lain yang mungkin menghabiskan CPU, dan sebagainya. Ini harus melakukan apa pun yang dilakukannya dengan sangat cepat, karena aktivitas selanjutnya tidak akan dilanjutkan sampai kembali. Diikuti oleh onResume()jika aktivitas kembali ke depan, atau oleh onStop()jika menjadi tidak terlihat oleh pengguna.

androidwifi
sumber
0

Tidak yakin apakah ini dianggap sebagai jawaban - tetapi di sini ada Video YouTube Dari Google's Course (Mengembangkan Aplikasi Android dengan Kotlin) yang menjelaskan perbedaannya.

  • On Start disebut saat aktivitas menjadi terlihat
  • On Pause dipanggil ketika aktivitas kehilangan fokus (seperti dialog muncul)
  • On Resume dipanggil saat aktivitas memperoleh fokus (seperti saat dialog menghilang)
hba
sumber