Jika aplikasi saya berjalan dan saya menekan tombol beranda, aplikasi tersebut berjalan di latar belakang. Sekarang jika lama menekan tombol home dan mematikan aplikasi dengan menggeseknya dari daftar aplikasi terbaru, tidak ada kejadian seperti onPause()
, onStop()
atau onDestroy()
dipanggil sebaliknya proses dihentikan. Jadi, jika saya ingin layanan saya berhenti, mematikan notifikasi, dan membatalkan pendaftaran pendengar, bagaimana saya bisa melakukannya? Saya membaca beberapa artikel dan blog tetapi tidak mendapatkan informasi yang berguna dan saya belum menemukan dokumentasi apa pun tentangnya. Bantuan apa pun akan dihargai. Terima kasih sebelumnya.
104
Jawaban:
Saya baru saja menyelesaikan masalah serupa.
Inilah yang dapat Anda lakukan jika ini hanya tentang menghentikan layanan saat aplikasi dimatikan dengan menggesek dari daftar Aplikasi terbaru.
Di dalam file Manifest Anda, tetap bendera
stopWithTask
sebagaitrue
Jasa. Suka:Tetapi seperti yang Anda katakan Anda ingin membatalkan pendaftaran pendengar dan menghentikan pemberitahuan, dll., Saya menyarankan pendekatan ini:
Di dalam file Manifest Anda, tetap bendera
stopWithTask
sebagaifalse
Jasa. Suka:Sekarang di
MyService
layanan Anda , ganti metodeonTaskRemoved
. (Ini akan diaktifkan hanya jikastopWithTask
diatur kefalse
).Lihat pertanyaan saya untuk lebih jelasnya, yang juga berisi bagian lain dari kode.
Semoga ini membantu.
sumber
Menemukan satu cara untuk melakukan ini
buat satu layanan seperti ini
}
2) daftarkan layanan ini di manifest.xml
3) Kemudian mulai layanan ini pada aktivitas percikan Anda
Dan sekarang setiap kali Anda akan menghapus aplikasi Anda dari android recent maka metode ini onTaskRemoved () akan dijalankan.
sumber
Saya menyelesaikan masalah serupa. Jika Anda ingin setelah menggesek dari tugas terbaru dan pada peluncuran berikutnya untuk berperilaku dengan benar, ikuti langkah-langkah di bawah ini: -
1) Simpan ID proses dalam preferensi bersama:
SharedPreferencesUtils.getInstance().putInt(SharedPreferencesUtils.APP_PROCESS_ID, android.os.Process.myPid());
2) Saat aplikasi diluncurkan dari peluncur setelah menghapus dari tugas terbaru, lakukan:
sumber
Saat Anda menekan tombol home -
onPause
danonStop
Aktivitas Anda dipanggil, jadi saat ini Anda harus melakukan semua penghematan dan pembersihan, karena platform Android tidak lagi menjamin bahwaonDestroy
atau metode siklus hidup lainnya akan dipanggil, sehingga prosesnya dapat dihentikan tanpa pemberitahuan apapun.sumber
onPause()
danonstop()
mereka hanya perlu dimatikan ketika pengguna keluar dari aplikasi yaitu logout.Anda perlu menyimpan data Anda saat aktif
onPause()
dipanggil. Lihat diagram siklus hidup ini: Pengembang AndroidAnda dapat melihat bahwa aplikasi dapat dimatikan setelah
onPause()
atauonStop()
.Tangani data Anda di sana dan pulihkan di
onRestart()
\onCreate()
.semoga berhasil!
sumber
Anda tidak dapat menangani gesekan, karena sistem hanya menghapus proses Anda dari memori tanpa memanggil panggilan balik apa pun.
Saya telah memeriksa, bahwa sebelum pengguna memanggil layar "aplikasi terbaru", onPause () akan selalu dipanggil. Jadi, Anda perlu menyimpan semua data dalam metode onPause tanpa memeriksa isFinishing ().
Untuk memeriksa tombol kembali, gunakan metode onBackPressed.
sumber
ViewModel. [Beginilah awalnya saya sampai pada pertanyaan ini].
Aplikasi tidak mendapatkan notifikasi, dan Activity.onDestroy () dipanggil untuk perubahan konfigurasi seperti perubahan orientasi, jadi jawabannya tidak ada. Tapi ViewModel.onCleared dipanggil saat Aplikasi dihapus (serta saat pengguna mundur dari aktivitas). Jika sumber daya yang ingin Anda gunakan dikaitkan dengan lebih dari satu aktivitas dalam tumpukan, Anda dapat menambahkan jumlah referensi atau mekanisme lain untuk memutuskan apakah ViewModel.onClear harus merilis sumber daya.
Ini adalah satu lagi dari banyak alasan bagus untuk menggunakan ViewModel.
- Bob
sumber
Saya tidak begitu tahu mengapa pendekatan di atas tidak berfungsi pada kasus saya bahkan saya menetapkan
android:stopWithTask="false"
yangonTaskRemoved()
tidak dipanggil.Pendekatan bagus lainnya akan digunakan
AndroidViewModel
. Yang ini bahkan berfungsi pada kasus ketika pengguna keluar dari aplikasi dengan menekan tombol kembali.Cukup terikat
ViewModel
kelas ke AndaMainActivity
lalu lakukanonCleared()
panggilan balik tugas Anda .Contoh:
lalu ikat ke MainActivity Anda:
~ Voila!
sumber
Ini bekerja untuk saya di android 6,7,8,9.
Buat satu layanan seperti ini:
2) Daftarkan layanan ini di
manifest.xml
:3) Kemudian mulai layanan ini pada aktivitas percikan Anda
sumber
Seperti yang disebutkan Bob Cram dalam jawabannya, metode onCleared () View Model adalah jawabannya. Ini berfungsi dalam kedua kasus:
Layanan onTaskRemoved () akan berfungsi saat pengguna menggesek aplikasi dari latar belakang, tetapi tidak akan berfungsi saat aplikasi dihapus menggunakan tombol tutup semua.
Namun metode onCleared () viewModel berfungsi di kedua kasus. Anda dapat menggunakan if untuk menghentikan proses yang sedang berlangsung atau menghapus tugas apa pun di server jarak jauh.
sumber