Adakah cara sederhana untuk menentukan apakah suatu kegiatan tertentu aktif atau tidak? Saya ingin melakukan hal-hal tertentu tergantung pada aktivitas mana yang aktif. misalnya:
if(activityrunning == activity1)
//do this
else if (activityrunning == activity2)
//do something else
android
android-activity
pengguna560571
sumber
sumber
Jawaban:
Anda dapat menggunakan
static
variabel dalam aktivitas.Satu-satunya Gotcha adalah bahwa jika Anda menggunakannya dalam dua kegiatan yang menghubungkan satu sama lain maka
onStop
pada yang pertama kadang-kadang disebut setelahonStart
di kedua. Jadi keduanya mungkin benar secara singkat.Bergantung pada apa yang Anda coba lakukan (perbarui aktivitas saat ini dari layanan?). Anda bisa mendaftarkan pendengar statis di layanan dalam
onStart
metode aktivitas Anda maka pendengar yang benar akan tersedia ketika layanan Anda ingin memperbarui UI.sumber
MyActivity
denganMyChildactivity
dan ingin memeriksa apakah anak tersebut aktif?Saya menyadari masalah ini cukup lama, tetapi saya pikir masih ada baiknya membagikan solusi saya karena mungkin bermanfaat bagi orang lain.
Solusi ini tidak tersedia sebelum Komponen Arsitektur Android dirilis.
Aktivitas setidaknya terlihat sebagian
Aktivitas ada di latar depan
sumber
Saya pikir lebih jelas seperti itu:
sumber
Opsi tanpa menggunakan variabel bantu apa pun adalah:
di mana aktivitas adalah fe: this or getActivity ().
Nilai yang dikembalikan oleh ekspresi ini berubah di onStart () / onStop (), yang merupakan peristiwa yang mulai / berhenti menunjukkan tata letak aktivitas di telepon.
sumber
Activity#getWindow().getDecorView().isShown()
?Saya menggunakan metode MyActivity.class dan getCanonicalName dan saya mendapat jawaban.
sumber
getRunningTasks()
karena sudah tidak digunakan lagi: androidxref.com/9.0.0_r3/xref/frameworks/base/core/java/android/…Cara yang jauh lebih baik daripada menggunakan variabel statis dan mengikuti OOP
Shared Preferences
dapat digunakan untuk berbagi variabel dengan lainnyaactivities
dan layanan dari satuapplication
Gunakan preferensi bersama. Ia memiliki informasi keadaan paling dapat diandalkan, lebih sedikit masalah peralihan / penghancuran aplikasi, menyelamatkan kami untuk meminta izin lagi dan memberi kami lebih banyak kontrol untuk memutuskan kapan aktivitas kami sebenarnya paling atas. melihat rincian di sini abd sini juga
sumber
onStop()
Ini adalah kode untuk memeriksa apakah suatu layanan tertentu sedang berjalan. Saya cukup yakin itu dapat bekerja untuk suatu aktivitas juga selama Anda mengubah getRunningServices dengan getRunningAppProcesses () atau getRunningTasks (). Lihat di sini http://developer.android.com/reference/android/app/ActivityManager.html#getRunningAppProcesses ()
Ubah Constants.PACKAGE dan Constants.BACKGROUND_SERVICE_CLASS sesuai
sumber
Ada cara yang jauh lebih mudah daripada segala sesuatu di atas dan pendekatan ini tidak memerlukan penggunaan
android.permission.GET_TASKS
dalam manifes, atau memiliki masalah kondisi balapan atau kebocoran memori yang ditunjukkan dalam jawaban yang diterima.Buat variabel STATIC dalam Kegiatan utama. Statis memungkinkan kegiatan lain untuk menerima data dari kegiatan lain.
onPause()
setel variabel ini salah ,onResume
danonCreate()
setel variabel ini benar .Tetapkan getter dan setter dari variabel ini.
Dan kemudian dari aktivitas atau Layanan lain
sumber
Dari dokumen resmi:
Activity # isFinishing ()
Activity # isDestroyed ()
sumber
terima kasih kkudi! Saya dapat menyesuaikan jawaban Anda untuk bekerja untuk suatu kegiatan ... inilah yang bekerja di aplikasi saya ..
contoh ini akan memberi Anda benar atau salah jika topActivity cocok dengan apa yang dilakukan pengguna. Jadi, jika aktivitas yang Anda periksa tidak ditampilkan (yaitu onPause) maka Anda tidak akan mendapatkan kecocokan. Juga, untuk melakukan ini, Anda perlu menambahkan izin ke manifes Anda ..
Saya harap ini membantu!
sumber
Saya pikir jawaban yang diterima adalah cara yang buruk untuk menangani ini.
Saya tidak tahu apa itu use case, tapi tolong pertimbangkan metode yang dilindungi di kelas dasar
dan menimpanya di kelas turunan.
Ketika acara tersebut terjadi, panggil saja metode ini di kelas dasar. Kelas 'aktif' yang benar akan menanganinya kemudian. Kelas itu sendiri kemudian dapat memeriksa apakah tidak
Paused()
.Lebih baik lagi, gunakan bus acara seperti GreenRobot's , Square's , tetapi yang sudah usang dan menyarankan menggunakan RxJava
sumber
Saya menggunakan cek
if (!a.isFinishing())
dan sepertinya melakukan apa yang saya butuhkan.a
adalah contoh aktivitas. Apakah ini salah? Kenapa tidak ada yang mencoba ini?sumber
bagaimana dengan
activity.isFinishing()
sumber
ActivityLifecycleCallbacks adalah cara yang bagus untuk melacak semua aktivitas di App:
Status Kegiatan:
Perpanjang kelas Aplikasi dan berikan rujukannya dalam file Android Manifest:
Klik di mana saja dari Aktivitas untuk status aktivitas lain:
https://developer.android.com/reference/android/app/Application.ActivityLifecycleCallbacks.html
sumber
Tidak yakin itu adalah cara yang "tepat" untuk "melakukan sesuatu".
Jika tidak ada cara API untuk menyelesaikan (atau a) pertanyaan daripada yang seharusnya Anda pikirkan sedikit, mungkin Anda melakukan sesuatu yang salah dan membaca lebih banyak dokumen, dll.
(Seperti yang saya pahami variabel statis adalah cara yang umumnya salah di android. Penyebabnya itu bisa bekerja, tetapi pasti akan ada kasus ketika itu tidak akan berhasil [misalnya, dalam produksi, pada jutaan perangkat]).
Tepat dalam kasus Anda, saya sarankan untuk berpikir mengapa Anda perlu tahu apakah ada aktivitas lain yang masih hidup? .. Anda dapat memulai aktivitas lain untuk mendapatkan fungsionalitasnya. Atau Anda dapat menurunkan kelas untuk mendapatkan fungsionalitasnya dan sebagainya.
Salam Hormat.
sumber
Jika Anda tertarik pada siklus hidup dari instance spesifik aktivitas, solusi siliconeagle terlihat benar kecuali bahwa variabel "aktif" yang baru harus menjadi variabel instan, bukan statis.
sumber
Gunakan siaran yang dipesan. Lihat http://android-developers.blogspot.nl/2011/01/processing-ordered-broadcasts.html
Dalam aktivitas Anda, daftarkan penerima di onStart, batalkan pendaftaran di onStop. Sekarang ketika misalnya suatu layanan perlu menangani sesuatu yang aktivitasnya mungkin dapat melakukan lebih baik, mengirim siaran yang dipesan dari layanan (dengan penangan default di layanan itu sendiri). Anda sekarang dapat merespons dalam aktivitas saat sedang berjalan. Layanan dapat memeriksa data hasil untuk melihat apakah siaran ditangani, dan jika tidak mengambil tindakan yang sesuai.
sumber
Selain jawaban yang diterima , jika Anda memiliki beberapa contoh aktivitas, Anda dapat menggunakan penghitung sebagai gantinya:
sumber
Sudahkah Anda mencoba ..
sumber
Menemukan solusi yang mudah dengan kode berikut
sumber
Gunakan variabel isActivity untuk memeriksa apakah aktivitas hidup atau tidak.
Lalu periksa
sumber
Jika Anda ingin memeriksa apakah aktivitas di tumpukan belakang ikuti saja langkah selanjutnya. 1. Mengumumkan ArrayList di kelas Aplikasi Anda [Kelas aplikasi didefinisikan dalam file mainfest Anda di tag aplikasi]
Dan tambahkan metode publik berikut untuk mengakses dan memodifikasi daftar ini.
Di BaseActivity Anda, tempat semua aktivitas memperluasnya, timpa metode onCreate dan onDestroy sehingga Anda bisa menambah dan menghapus aktivitas dari back stack sebagai berikut.
Akhirnya jika Anda ingin memeriksa apakah aktivitas ada di tumpukan belakang atau tidak, panggil saja fungsi ini isActivityInBackStack.
Mis: Saya ingin memeriksa apakah HomeActivityis ada di tumpukan belakang atau tidak:
sumber
sumber
Ini berfungsi jika Anda tidak memiliki aktivitas yang sama di latar depan. Jika Anda buka dari notifikasi tidak berfungsi saya membuat beberapa penyesuaian dan datang dengan ini:
Itu bekerja untuk saya dengan beberapa kegiatan terbuka pada saat yang sama.
sumber