onNewIntent () siklus hidup dan pendengar terdaftar

150

Saya menggunakan Aktivitas SingleTop untuk menerima maksud dari dialog pencarian via onNewIntent().

Apa yang saya perhatikan adalah yang onPause()dipanggil sebelumnya onNewIntent(), dan kemudian memanggilnya onResume(). Secara visual:

  • dialog pencarian dimulai
  • niat pencarian dipecat ke aktivitas
  • onPause()
  • onNewIntent()
  • onResume()

Masalahnya adalah bahwa saya memiliki pendengar terdaftar onResume()yang bisa dihapus onPause(), tetapi mereka diperlukan di dalam onNewIntent()panggilan. Apakah ada cara standar untuk membuat pendengar itu tersedia?

DJayC
sumber

Jawaban:

294

onNewIntent()dimaksudkan sebagai titik masuk untuk aktivitas singleTop yang sudah berjalan di tempat lain di tumpukan dan karenanya tidak dapat menelepon onCreate(). Oleh karena itu, dari sudut pandang siklus aktivitas, perlu menelepon onPause()sebelumnya onNewIntent(). Saya sarankan Anda untuk menulis ulang aktivitas Anda agar tidak menggunakan pendengar ini di dalamnya onNewIntent(). Misalnya sebagian besar waktu onNewIntent()metode saya hanya terlihat seperti ini:

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

Dengan semua logika pengaturan terjadi onResume()dengan memanfaatkan getIntent().

Rodja
sumber
@Rodja tolong komentar tentang stackoverflow.com/questions/19092631/... ini juga
Pengembang
3
Terkait dengan pertanyaan awal: perlu diingat jika Anda memindahkan kode untuk menangani pencarian Intentke dalam onResume(), Aktivitas Anda mungkin akan mencoba untuk mengeksekusi mencari setiap kali resume, mungkin bukan perilaku yang Anda inginkan.
Tony Chan
1
Rodja mengatakan: Dari sudut pandang siklus aktivitas, oleh karena itu diperlukan untuk memanggil onPause () sebelum onNewIntent () Android tidak PERLU untuk mendesainnya dengan cara ini. Aktivitas Anda telah melewati siklus hidupnya untuk melanjutkan (). Tidak perlu Android untuk memanggil onPause () lalu panggil onResume () lagi. Jika aplikasi dilanjutkan, os hanya dapat memanggil onNewIntent () dan tetap dalam status dilanjutkan.
Sani Elfishawy
Rodja mengatakan: Dari sudut pandang siklus aktivitas, oleh karena itu diperlukan untuk memanggil onPause () sebelum onNewIntent () Android tidak PERLU untuk mendesainnya. Aktivitas Anda telah melalui siklus hidupnya untuk melanjutkan. Jika tindakan dilanjutkan, mereka bisa memanggilNewIntent () dan tinggal di resume. Masalah dengan urutan Android adalah tidak memungkinkan untuk membedakan antara onPause karena tindakan pengguna vs onPause karena maksud latar belakang. Jika Anda ingin bertindak pada jeda hanya dalam kasus tindakan pengguna Anda kacau karena Anda tidak akan tahu sampai masa depan mengapa Anda pergi pada jeda ().
Sani Elfishawy
Poin penting yang perlu diperhatikan adalah getIntent () masih mengembalikan Intent asli. Anda dapat menggunakan setIntent (Intent) untuk memperbarui ke Intent baru.
linuxjava
15

Catatan: Memanggil metode siklus hidup dari yang lain bukanlah praktik yang baik. Dalam contoh di bawah ini saya mencoba untuk mencapai bahwa onNewIntent Anda akan selalu disebut terlepas dari jenis Aktivitas Anda.

OnNewIntent () selalu dipanggil untuk aktivitas SingleTop / Tugas kecuali untuk pertama kalinya ketika aktivitas dibuat. Pada saat itu onCreate disebut menyediakan solusi untuk beberapa pertanyaan yang diajukan pada utas ini.

Anda dapat memanggil onNewIntent selalu dengan memasukkannya ke metode onCreate seperti

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

@Override
protected void onNewIntent(Intent intent) {
  super.onNewIntent(intent);
  //code
}
Pawan Maheshwari
sumber
59
Biasanya bukan ide yang baik untuk memanggil metode siklus hidup secara langsung, bukan? Mungkin tidak berbahaya, atau mungkin beberapa implementasi dasar onNewIntent () mengasumsikan bahwa onPause () telah dipanggil? Agaknya lebih aman untuk merangkum kode aplikasi dalam metode yang dapat dipanggil dari kedua tempat.
BernalKC
12
Sepakat. Kami mengalami beberapa kasus tepi menggunakan pendekatan ini. Sebaiknya dihindari.
Saad Farooq
3
Ya .. saya juga setuju untuk menghindari ini ... ini adalah untuk mereka yang ingin meminta onNewIntent dari onCreate juga.
Pawan Maheshwari