Setiap kali siaran saya dieksekusi, saya ingin menunjukkan peringatan untuk aktivitas foreground.
android
android-activity
Deepali
sumber
sumber
Jawaban:
Mengetahui bahwa ActivityManager mengelola Activity , sehingga kami dapat memperoleh informasi dari ActivityManager . Kami mendapatkan foreground running Activity saat ini oleh
PEMBARUAN 2018/10/03
getRunningTasks () DIHAPUSKAN. lihat solusi di bawah ini.
Metode ini sudah tidak digunakan lagi di API level 21. Pada Build.VERSION_CODES.LOLLIPOP, metode ini tidak lagi tersedia untuk aplikasi pihak ketiga: pengenalan terbaru dokumen-sentris berarti dapat membocorkan informasi orang ke pemanggil. Untuk kompatibilitas mundur, masih akan mengembalikan sebagian kecil dari datanya: setidaknya tugas-tugas pemanggil sendiri, dan mungkin beberapa tugas lain seperti rumah yang diketahui tidak sensitif.
sumber
( Catatan: API resmi ditambahkan di API 14: Lihat jawaban ini https://stackoverflow.com/a/29786451/119733 )
JANGAN GUNAKAN jawaban SEBELUMNYA (waqas716).
Anda akan memiliki masalah kebocoran memori, karena referensi statis untuk aktivitas tersebut. Untuk detail lebih lanjut lihat tautan berikut http://android-developers.blogspot.fr/2009/01/avoiding-memory-leaks.html
Untuk menghindari hal ini, Anda harus mengelola referensi kegiatan. Tambahkan nama aplikasi dalam file manifes:
Kelas aplikasi Anda:
Buat Aktivitas baru:
Jadi, sekarang alih-alih memperluas kelas Aktivitas untuk aktivitas Anda, cukup rentangkan MyBaseActivity. Sekarang, Anda bisa mendapatkan aktivitas Anda saat ini dari aplikasi atau konteks Aktivitas seperti itu:
sumber
WeakReferences
di Android GC mengumpulkan mereka lebih cepat dari yang Anda pikirkan.WeakReference
tidak disarankan untuk caching, ini bukan caching, yaitumCurrentActivity
hanya akan memiliki referensi untuk itu ketika masih hidup sehinggaWeakReference
tidak akan pernah dikumpulkan saatActivity
berada di atas. Namun apa yang @NachoColoma sarankan salah karenaWeakReference
masih dapat merujuk aktivitas yang tidak dilanjutkan (tidak hidup / tidak di atas) jika variabel tidak dihapus!Application .ActivityLifecycleCallbacks
, yang akan lebih sentral dan Anda tidak perlu menambahkan kode manajemen dalam semua aktivitas Anda. Lihat juga developer.android.com/reference/android/app/…Saya memperluas bagian atas jawaban @ gezdy.
Di setiap Kegiatan, alih-alih harus "mendaftar" sendiri dengan
Application
pengkodean manual, kita dapat menggunakan API berikut sejak level 14, untuk membantu kami mencapai tujuan yang sama dengan pengkodean manual yang lebih sedikit.http://developer.android.com/reference/android/app/Application.html#registerActivityLifecycleCallbacks%28android.app.Application.ActivityLifecycleCallbacks%29
Di
Application.ActivityLifecycleCallbacks
, Anda bisa mendapatkan yangActivity
"terlampir" atau "terlepas" dari iniApplication
.Namun, teknik ini hanya tersedia sejak API level 14.
sumber
implements Application.ActivityLifecycleCallbacks
, dan menambahkan metode untuk mengimplementasikannya. Kemudian di konstruktor kelas itu (atau onCreate atau init atau metode lain yang berjalan ketika instance menjadi aktif / siap), masukkangetApplication().registerActivityLifecycleCallbacks(this);
sebagai baris terakhir.Pembaruan 2 : Ada api resmi yang ditambahkan untuk ini, silakan gunakan ActivityLifecycleCallbacks sebagai gantinya.
MEMPERBARUI:
Seperti yang ditunjukkan oleh @gezdy, dan saya bersyukur untuk itu. atur referensi ke nol juga untuk aktivitas saat ini, alih-alih memutakhirkan pada setiap onResume atur menjadi nol pada onDestroy setiap Aktivitas untuk menghindari masalah kebocoran memori.
Beberapa waktu yang lalu saya membutuhkan fungsi yang sama dan di sini adalah metode bagaimana saya mencapai ini. Dalam setiap aktivitas Anda, ganti metode-metode siklus hidup ini.
Sekarang di kelas siaran Anda, Anda dapat mengakses aktivitas saat ini untuk menunjukkan peringatan padanya.
sumber
Application
hanya dibuat sekali dan tidak pernah sampah dikumpulkan persis seperti variabel statis.clearReferences()
menjadi(this.equals(currActivity))
.@lockwobr Terima kasih telah memperbarui
Memiliki akses ke arus
Activity
sangat berguna. Bukankah lebih baik memilikigetActivity
metode statis mengembalikan Kegiatan saat ini tanpa pertanyaan yang tidak perlu?The
Activity
kelas sangat berguna. Ini memberi akses ke utas UI aplikasi, tampilan, sumber daya, dan banyak lagi. Banyak metode membutuhkanContext
, tetapi bagaimana cara mendapatkan pointer? Berikut ini beberapa cara:ActivityThread
. Kelas ini memiliki akses ke semua Kegiatan dan, apa yang lebih baik, memiliki metode statis untuk mendapatkan arusActivityThread
. Hanya ada satu masalah kecil - daftar Aktivitas memiliki akses paket.Mudah dipecahkan menggunakan refleksi:
Metode seperti itu dapat digunakan di mana saja di aplikasi dan itu jauh lebih nyaman daripada semua pendekatan yang disebutkan. Selain itu, sepertinya itu tidak seaman kelihatannya. Itu tidak memperkenalkan potensi kebocoran baru atau null pointer.
Cuplikan kode di atas tidak memiliki penanganan pengecualian dan secara naif mengasumsikan bahwa Aktivitas berjalan pertama adalah yang kami cari. Anda mungkin ingin menambahkan beberapa cek tambahan.
Posting Blog
sumber
Map
antarmukaHashMap
atauArrayMap
. Saya sudah mengedit jawaban @AZ_.Saya melakukan Mengikuti di Kotlin
Edit Kelas Aplikasi sebagai Berikut
Buat kelas ActivityLifecycleCallbacks
Anda sekarang dapat menggunakannya di kelas apa pun dengan memanggil yang berikut:
FTApplication.currentActivity()
sumber
getCurrentActivity () juga ada di ReactContextBaseJavaModule.
(Karena pertanyaan ini awalnya ditanyakan, banyak aplikasi Android juga memiliki komponen ReactNative - aplikasi hybrid.)
class ReactContext di ReactNative memiliki seluruh rangkaian logika untuk mempertahankan mCurrentActivity yang dikembalikan di getCurrentActivity ().
Catatan: Saya berharap getCurrentActivity () diimplementasikan di kelas Aplikasi Android.
sumber
Saya tidak dapat menemukan solusi yang akan membuat tim kami senang, jadi kami menggulung sendiri. Kami menggunakan
ActivityLifecycleCallbacks
untuk melacak aktivitas saat ini dan kemudian mengeksposnya melalui layanan. Lebih detail di sini: https://stackoverflow.com/a/38650587/10793sumber
Untuk kompatibilitas mundur:
sumber
WeakReference
pegangan dariApplication
kelas - sementaraComponentName
diperlukan untuk menentukan apakah yang diinginkanActivity
ada di atas daftar tugas yang sedang berjalan. Dan jika ini tidak sepenuhnya menjawab pertanyaan, jawaban yang diterima juga tidak.topActivity
hanya tersedia dari Android QSecara pribadi saya melakukan apa yang dikatakan "Cheok Yan Cheng", tetapi saya menggunakan "Daftar" untuk memiliki "Backstack" dari semua kegiatan saya.
Buat aplikasi yang memperluas "Aplikasi" dan lakukan ini:
Dalam kasus saya, saya menggunakan "Application.ActivityLifecycleCallbacks" untuk:
Bind / Unbind Merlin Instance (digunakan untuk mendapatkan acara ketika aplikasi kehilangan atau mendapatkan koneksi, misalnya ketika Anda menutup data seluler atau ketika Anda membukanya). Ini berguna setelah tindakan niat "OnConnectivityChanged" dinonaktifkan. Untuk info lebih lanjut tentang MERLIN, lihat: Tautan INFO MERLIN
Tutup Instansi Realm saya yang terakhir ketika aplikasi ditutup; Saya akan memasukkannya ke dalam BaseActivity yang diperluas dari semua kegiatan lainnya dan yang memiliki Instance RealmHelper pribadi. Untuk info lebih lanjut tentang REALM, lihat: REALM INFO LINK Misalnya saya punya contoh "RealmHelper" statis di dalam kelas "RealmHelper" saya yang dipakai di dalam aplikasi saya "onCreate". Saya memiliki layanan sinkronisasi tempat saya membuat "RealmHelper" yang baru karena Realm "Linked-Linked" dan Realm Instance tidak dapat bekerja di dalam Thread yang berbeda. Jadi untuk mengikuti Dokumentasi Realm "Anda Harus Menutup Semua Instansi Realm Terbuka untuk menghindari Kebocoran Sumber Daya Sistem", untuk mencapai hal ini saya menggunakan "Application.ActivityLifecycleCallbacks" seperti yang dapat Anda lihat.
Akhirnya saya memiliki penerima yang dipicu ketika saya selesai menyinkronkan aplikasi saya, kemudian ketika sinkronisasi berakhir itu akan memanggil metode "IEndSyncCallback" "onEndSync" di mana saya melihat jika saya memiliki Kelas Aktivitas tertentu di dalam daftar ActivitiesBackStack saya karena saya perlu untuk memperbarui data pada tampilan jika sinkronisasi memperbaruinya dan saya perlu melakukan operasi orang lain setelah sinkronisasi aplikasi.
Itu saja, semoga ini membantu. Sampai jumpa :)
sumber
Jawaban oleh waqas716 baik. Saya membuat solusi untuk kasus tertentu yang menuntut lebih sedikit kode dan pemeliharaan.
Saya menemukan pekerjaan khusus sekitar dengan memiliki metode statis mengambil pandangan dari aktivitas yang saya curigai berada di latar depan. Anda dapat mengulangi semua aktivitas dan memeriksa apakah Anda menginginkan atau mendapatkan nama aktivitas dari jawaban martin
Saya kemudian memeriksa apakah tampilan tidak nol dan mendapatkan konteksnya melalui getContext ().
sumber
getRunningTasks
:"Note: this method is only intended for debugging and presenting task management user interfaces. This should never be used for core logic in an application, ..."
di developer.android.com/reference/android/app/...Saya tidak suka jawaban yang lain. ActivityManager tidak dimaksudkan untuk digunakan untuk mendapatkan aktivitas saat ini. Super classing dan bergantung pada onDestroy juga rapuh dan bukan desain terbaik.
Jujur, yang terbaik yang saya hasilkan sejauh ini hanya mempertahankan enum di Aplikasi saya, yang akan ditetapkan ketika suatu aktivitas dibuat.
Rekomendasi lain mungkin untuk menghindari menggunakan beberapa kegiatan jika memungkinkan. Ini dapat dilakukan dengan menggunakan fragmen, atau dalam tampilan khusus preferensi saya.
sumber
Solusi yang agak sederhana adalah membuat kelas manajer tunggal, di mana Anda dapat menyimpan referensi ke satu atau lebih Kegiatan, atau apa pun yang Anda ingin akses ke seluruh aplikasi.
Panggilan
UberManager.getInstance().setMainActivity( activity );
onCreate aktivitas utama.Panggil
UberManager.getInstance().getMainActivity();
di mana saja di aplikasi Anda untuk mengambilnya. (Saya menggunakan ini untuk dapat menggunakan Toast dari utas non UI.)Pastikan Anda menambahkan panggilan
UberManager.getInstance().cleanup();
saat aplikasi Anda dihancurkan.sumber
Saya terlambat 3 tahun tetapi saya tetap akan menjawabnya kalau-kalau ada orang yang menemukan saya seperti ini.
Saya memecahkan ini dengan hanya menggunakan ini:
Perhatikan bahwa "getIntent (). ToString ()" mencakup banyak teks lain seperti nama paket Anda dan filter maksud apa pun untuk aktivitas Anda. Secara teknis kami memeriksa maksud saat ini, bukan aktivitas, tetapi hasilnya sama. Cukup gunakan misalnya Log.d ("test", getIntent (). ToString ()); jika Anda ingin melihat semua teks. Solusi ini agak hacky tetapi jauh lebih bersih dalam kode Anda dan fungsinya sama.
sumber