Apa perbedaan antara onPause () dan onStop () dari Android Activites?

149

Dari doc android di sini http://developer.android.com/reference/android/app/Activity.html , dikatakan 'Aktivitas masuk ke latar depan' akan memanggil onPause(), dan 'Aktivitas tidak lagi terlihat' akan memanggil onStop().

Bukankah 'Aktivitas muncul di depan' sama dengan 'Aktivitas tidak lagi terlihat'? Bisakah Anda memberi tahu saya apa perbedaan di antara mereka?

michael
sumber
17
+1 untuk pertanyaan yang sangat bagus. Juga, suatu pausedkegiatan benar - benar hidup (itu memelihara semua informasi negara dan anggota dan tetap melekat pada manajer jendela). Suatu stoppedkegiatan juga menyimpan semua informasi negara dan anggota, tetapi tidak lagi dilampirkan pada window manager.
ateiob

Jawaban:

107

Tidak, jika beberapa aktivitas muncul di latar depan, itu tidak berarti bahwa aktivitas lain sama sekali tidak terlihat. Pertimbangkan kasus berikut:

Aktivitas dengan tema Tema. Dialog

Di sini kita melihat kedua kegiatan pada saat bersamaan. Aktivitas pertama dengan bidang dikaburkan oleh aktivitas lain, dan pengguna tidak lagi dapat berinteraksi dengannya. Namun, masih terlihat dengan semua konsekuensi yang dihasilkan.

Itu menyisakan pertanyaan kegiatan mana yang dianggap sepenuhnya buram dan menutupi seluruh layar dan mana yang tidak. Keputusan ini didasarkan pada jendela yang berisi aktivitas. Jika jendela memiliki bendera windowIsFloatingatau windowIsTranslucent, maka dianggap bahwa aktivitas tersebut tidak membuat hal-hal yang mendasarinya tidak terlihat, jika tidak maka akan menyebabkan onStop()dipanggil. Kode yang relevan dapat ditemukan di com.android.server.am.ActivityRecord:

fullscreen = ent != null && !ent.array.getBoolean(
        com.android.internal.R.styleable.Window_windowIsFloating, false)
        && !ent.array.getBoolean(
        com.android.internal.R.styleable.Window_windowIsTranslucent, false);
Malcolm
sumber
10
+1 untuk penjelasan yang bagus, dengan fokus pada visibilitas sebagian vs. total (dalam). Akan menarik untuk mengetahui persentase ambang layar yang membuat Android memutuskan antara onPause()dan onStop(). Apakah 100%? Jika hanya satu piksel dari aktivitas sebelumnya yang terlihat, apakah masih onPause()?
ateiob
3
@ateiob Tidak dikatakan di mana pun, tapi saya pikir begitu. Namun, biasanya jelas karena sebagian besar kegiatan yang tidak mengisi seluruh layar cukup gunakan salah satu gaya yang disediakan sistem untuk dialog.
Malcolm
1
Aneh, tetapi dalam aplikasi saya onPause()tidak dipanggil sama sekali ketika dialog ditampilkan. onPause()hanya dipanggil ketika saya menekan tombol beranda . Bagaimana ini mungkin?
ateiob
Ini seharusnya jawaban yang benar. Ngomong-ngomong, latar depan adalah dialog atau aktivitas?
GMsoF
3
@ GMsoF Suatu kegiatan. Itulah poin utamanya: tidak semua dialog sebenarnya dialog. Anda dapat membuat aktivitas terlihat seperti dialog, jadi sebenarnya lebih kecil dari seluruh layar.
Malcolm
38

Jika Anda masih dapat melihat bagiannya ( Activitydatang ke latar depan tidak menempati seluruh layar, atau agak transparan), onPause()akan dipanggil. Jika Anda tidak dapat melihat bagiannya, onStop()akan dipanggil.

Dialog **, misalnya, mungkin tidak mencakup keseluruhan sebelumnya Activity, dan ini akan menjadi waktu untuk onPause()dipanggil.

** Saya tidak merujuk ke Dialog Android di sini, melainkan ide konseptual dari sesuatu yang muncul dan hanya mengaburkan bagian dari layar pengguna. Catatan ini ditambahkan untuk mengklarifikasi berdasarkan komentar dari @GMsoF di bawah ini

nicholas.hauschild
sumber
33
TIDAK. Ini menyesatkan. Dialog yang ditampilkan tidak akan memanggil onPause () karena dialog menggunakan konteks aktivitas saat ini, pertimbangkan aktivitas yang hidup.
GMsoF
6
@ GMsoF Kedengarannya seperti ketika saya mengatakan dialog, Anda pikir saya maksudkan Dialog, seperti di kelas Android. Apa yang saya maksudkan adalah sesuatu yang sebagian mengaburkan yang pertama Activityuntuk menggambarkan gagasan bahwa semua yang baru Activitytidak perlu sepenuhnya menutupi yang sebelumnya.
nicholas.hauschild
11

Berada di latar depan berarti bahwa aktivitas memiliki fokus input. Misalnya, suatu kegiatan dapat terlihat tetapi sebagian dikaburkan oleh dialog yang memiliki fokus. Dalam hal ini, onPause()akan dipanggil, tetapi tidak onStop(). Ketika dialog hilang, metode aktivitas onResume()akan dipanggil (tetapi tidak onStart()).

Ted Hopp
sumber
5
Hal dialog bisa menyesatkan. Mari dialog peringatan muncul dari utas utama UI aktivitas ini, onPause () tidak akan dipanggil dalam kasus ini. Hanya jika dialog ini muncul dari Aktivitas lain atau Aplikasi lain.
Sam003
1
@Zhisheng - Saya setuju dengan komentar Anda. Saya hanya parafrase topik panduan Aktivitas : " onPause()dipanggil saat perangkat tidur atau saat dialog muncul" . Karena utas ini memperjelas, suatu dialog tidak selalu berarti bahwa suatu kegiatan dijeda (walaupun itu untuk, katakanlah, suatu kegiatan yang ditampilkan sebagai dialog ).
Ted Hopp
9

Secara praktis , seseorang harus mempertimbangkan perbedaan antara "onPause ()" dan "onPause () + onStop ()".

Setiap kali beberapa aktivitas baru terjadi dan menempati sebagian ruang Layar. Jadi aktivitas Anda yang sebelumnya berjalan masih terlihat sampai batas tertentu. Dalam hal ini, aktivitas yang berjalan sebelumnya tidak didorong ke Back Stack. Jadi, di sini hanya metode onPause () yang dipanggil .

Di sisi lain, jika beberapa Kegiatan baru terjadi dan menempati layar penuh sehingga aktivitas yang sebelumnya Anda jalankan menghilang. Dalam hal ini, aktivitas Anda yang sebelumnya berjalan dipindahkan ke Back Stack. Di sini, onPause () + onStop () dipanggil.

Untuk Ringkasan-

onPause () - Layar sebagian dicakup oleh aktivitas baru lainnya. Aktivitas tidak dipindahkan ke Back Stack.

onPause () + onStop () - Layar sepenuhnya tercakup oleh aktivitas baru lainnya. Aktivitas dipindahkan ke Back Stack.

Tahu lebih banyak tentang- Back Stack .

Yash
sumber
0

Dengan kata-kata singkat:

onStop()metode siklus hidup aktivitas sebelumnya dipanggil ketika aktivitas lain ditampilkan. Ketika Anda memiliki Dialog di atas aktivitas, di sanaonPause() dipanggil.

Catatan : Aktivitas adalah komponen yang memenuhi seluruh layar Anda.

Catatan : Dialog bukan Kegiatan karena tidak sepenuhnya mengisi layar.

Uddhav Gautam
sumber
0

Saya menghadapi banyak masalah dengan metode onPause dan onStop dan karenanya saya akan menghapus tiga skenario yang saya temui -
1. Ketika Anda mengklik tombol aplikasi baru-baru ini, tidak ada metode siklus hidup yang dipanggil tetapi onWindowFocusChanged (boolean hasFocus) dipanggil dengan nilai hasFocus dianggap salah. Dalam versi android sebelum 5, metode onPause digunakan untuk dipanggil, dengan menekan tombol aplikasi baru-baru ini.

2. Ketika aktivitas yang muncul muncul di aktivitas Anda, seperti yang disebutkan oleh Malcolm , tombol onPause dipanggil. Jika aktivitas baru yang mengambil seluruh layar disebut, maka onStop dipanggil pada aktivitas sebelumnya. Dialog izin Android juga menyebabkan aktivitas Anda memanggil OnPause.

3.Jika layar habis pada aktivitas Anda, maka onPause dipanggil. Setelah beberapa saat jika Anda tidak akan membuka layar maka onStop akan dipanggil.

Juga satu hal penting yang disebutkan oleh ateiob yang melengkapi jawabannya

Aktivitas yang dijeda sepenuhnya hidup (itu mempertahankan semua informasi negara dan anggota dan tetap melekat pada manajer jendela). Aktivitas yang dihentikan juga menyimpan semua informasi status dan anggota, tetapi tidak lagi dilampirkan ke manajer jendela


Semoga ini bisa membantu.

royatirek
sumber
0

setiap kali AKTIFITAS baru memulai aktivitas sebelumnya onPause akan secara menantang dipanggil dalam keadaan apa pun.

sebenarnya akan ada dua keadaan:

1- bagian dari aktivitas sebelumnya terlihat atau aktivitas baru transparan: hanya onPause akan dipanggil.

2- aktivitas sebelumnya sepenuhnya tercakup oleh aktivitas baru: keduanya onPausedan onStopakan dipanggil

---- Baik untuk menyatakan beberapa catatan:

CATATAN 1: jika dialog dimulai di atas aktivitas, TIDAK ada onPauseatau onStopakan dipanggil.

CATATAN 2: jika suatu Aktivitas yang temanya disetel ke dialog, perilakunya akan seperti aktivitas normal.

CATATAN 3: tampaknya dialog sistem seperti dialog izin karena marshmallow akan menyebabkannya onPause.

Amir Ziarati
sumber
-5

Ya, saya mencoba memahami dan saya bisa menjelaskan ini di bawah ini:

Ada 2 kegiatan: ActivityA & ActivityB

public class ActivityA extends Activity implements OnClickListener {

// button
private Button mBtnChangeActivity;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_a);
    initialize();
    setEvent();
}

private void initialize() {
    Log.i("Activity A", "Initialize()");
    mBtnChangeActivity = (Button) findViewById(R.id.btn_change_activity);
}

private void setEvent() {
    Log.i("Activity A", "setEvent()");
    mBtnChangeActivity.setOnClickListener(this);
}

@Override
protected void onStart() {
    super.onStart();
    Log.i("Activity A", "onStart");
}

@Override
protected void onResume() {
    super.onResume();
    Log.i("Activity A", "onResume");
}

@Override
protected void onPause() {
    super.onPause();
    Log.i("Activity A", "onPause");
}

@Override
protected void onStop() {
    super.onStop();
    Log.i("Activity A", "onStop");
}

@Override
protected void onDestroy() {
    super.onDestroy();
    Log.i("Activity A", "onDestroy");
}

@Override
public void onClick(View v) {
    switch (v.getId()) {
    case R.id.btn_change_activity:
        Intent activityB = new Intent(this, ActivityB.class);
        startActivity(activityB);
        break;
    default:
        break;
    }
}

Ini aktivitas B. Ikuti komentar saya di kode

public class ActivityB extends Activity implements OnClickListener {

// button
private Button mBtnChangeActivity;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_a);
    initialize();
    setEvent();
    // if call finish() here, activityA will don't stop, just pause
    // Activity A will call onStop() when Activity B call onStart() method
    finish();
}

private void initialize() {
    Log.i("Activity B", "Initialize()");
    mBtnChangeActivity = (Button) findViewById(R.id.btn_change_activity);
}

private void setEvent() {
    Log.i("Activity B", "setEvent()");
    mBtnChangeActivity.setOnClickListener(this);
}

@Override
protected void onStart() {
    super.onStart();
    Log.i("Activity B", "onStart");
}

@Override
protected void onResume() {
    super.onResume();
    Log.i("Activity B", "onResume");
}


@Override
public void onClick(View v) {
    switch (v.getId()) {
    case R.id.btn_change_activity:
        finish();
        break;
    default:
        break;
    }
}
}

Saya harap ini jelas

Lê Quốc Tiến
sumber
selalu, coba jelaskan itu masuk akal
Alexander Zaldostanov