Apa yang sebenarnya terjadi ketika Anda menggesek aplikasi dari daftar aplikasi terbaru?

147

Daftar aplikasi terbaru di Ice Cream Sandwich menambahkan kemampuan untuk menghapus aplikasi dari daftar, sehingga mengabaikannya secara permanen (dan sejauh yang saya tahu ini adalah fungsi vanilla, bukan CM / custom ROM). Dokumentasi dan sorotan platform tampaknya tidak mencakup pekerjaan di bawah kap fungsi ini, tapi saya ingin tahu apa yang sebenarnya dilakukan sistem.

Lebih lanjut menambah rasa ingin tahu saya, saya memutuskan untuk melakukan tes cepat: Saya memulai Musik pada instalasi CM9, kemudian mundur. Saya kemudian memeriksa daftar aplikasi terbaru dan melihatnya memang ada di sana (dan dalam kondisi yang tepat, berdasarkan thumbnail). Saya kemudian masuk Settings->Applicationsdan paksa menghentikan aplikasi Musik, tetapi itu masih terdaftar di daftar baru-baru ini, membuat saya percaya itu tidak terhubung ke proses berlama-lama di latar belakang.

Menyadari sekarang bahwa Musik mungkin merupakan pilihan yang buruk, saya juga menguji dengan aplikasi USA Today. Ini pada dasarnya menunjukkan perilaku yang sama, dan sepertinya dipaksa untuk "meluncurkan kembali" setelah kekuatan berhenti (yang masuk akal) meskipun thumbnail dalam daftar aplikasi terbaru tidak mencerminkan hal ini (dalam cache, saya tebak?).

Jadi, apa yang sebenarnya terjadi pada level OS ketika Anda menggesek aplikasi dari daftar terakhir? Apakah itu hanya menghapus data aplikasi dari RAM dan sampah mengumpulkannya, menghancurkan keadaan yang disimpan?

eldarerathis
sumber

Jawaban:

68

Menggesek aplikasi dari daftar aplikasi terbaru adalah vanilla, dan ya, tidak didokumentasikan dengan baik. Ini telah menjadi topik diskusi yang layak di berbagai forum Android ... konsensus tampaknya paling baik dijelaskan di sini dalam beberapa komentar : bahwa perilakunya mirip dengan tetapi tidak persis sama dengan menutup aplikasi - secara umum ( untuk aplikasi yang tidak mendefinisikan penanganan tombol kembali secara eksplisit) itu sama dengan menekan kembali cukup kali dari dalam aplikasi yang Anda keluar dari itu.

Tautan ini memiliki beberapa detail lebih lanjut tentang spesifikasinya, tetapi secara keseluruhan Anda dapat menganggapnya sebagai berhenti dari aplikasi.

Khusus untuk aplikasi Musik, saya percaya ini memulai layanan, jadi sementara tugas itu sendiri (aplikasi Musik / UI) mungkin ditutup, layanan terus berjalan di latar belakang sehingga musik Anda tidak tiba-tiba berhenti hanya karena tugas dibersihkan karena alasan manajemen memori. Itu mungkin memengaruhi apa yang Anda lihat.

Austin Mills
sumber
1
Terima kasih, tautan itu memiliki banyak diskusi yang bagus. Anda juga mungkin benar: Musik, yang mungkin merupakan ujian yang buruk. Saya akan mencoba aplikasi lain, hanya untuk iseng.
eldarerathis
2
Pergi ke depan dan menerima ini karena diskusi reddit membantu saya menemukan beberapa istilah pencarian yang lebih baik, dan tampaknya dikuatkan oleh beberapa posting oleh Dianne Hackborn yang saya catat dalam jawaban saya . Terima kasih!
eldarerathis
1
Sempurna, terima kasih! Bagi saya postingan ini membantu saya: reddit.com/r/Android/comments/mpevh/…
Boris Strandjev
Pemutar musik pihak ketiga seperti Rocket Player menghentikan musik ketika Anda menggesek aplikasi dari daftar Terkini bahkan jika layanan berjalan di latar belakang dan Anda perlu membuka aplikasi atau bermain di widget lagi untuk memulai musik.
Lucky
78

Tampaknya saya telah menemukan istilah pencarian ajaib yang mengarah pada beberapa penjelasan dari karyawan Google. Secara khusus, saya menemukan beberapa tempat berbeda di mana Dianne Hackborn menjelaskan apa yang terjadi ketika Anda menggesek sesuatu dari daftar terakhir. Yang pertama adalah komentar pada salah satu pos Google+nya :

[Secara khusus] terjadi ketika Anda menghapus tugas baru-baru ini: (1) membunuh semua latar belakang atau proses aplikasi yang kosong (lihat http://developer.android.com/guide/topics/fundamentals/fundamentals/processes-and- threads.html # Siklus Hidup untuk artinya ini), dan (2) menggunakan http://developer.android.com/reference/android/app/Service.html#onTaskRemoved(android.content.Intent) API baru untuk memberitahu layanan aplikasi tentang tugas yang dihapus sehingga dapat melakukan apa pun yang menurutnya sesuai.

Dia juga mencatat dalam komentar blog :

Sebenarnya, menghapus entri dalam tugas terbaru akan mematikan proses latar belakang yang ada untuk proses tersebut. Itu tidak akan secara langsung menyebabkan layanan berhenti, namun ada API bagi mereka untuk mengetahui tugas itu dihapus untuk memutuskan apakah mereka ingin ini berarti mereka harus berhenti. Ini dimaksudkan agar menghapus mengatakan tugas terbaru dari aplikasi email tidak akan menyebabkannya berhenti memeriksa email.

Jika Anda benar-benar ingin menghentikan aplikasi sepenuhnya, Anda dapat menekan lama pada tugas-tugas terbaru untuk pergi ke info aplikasi, dan tekan paksa berhenti di sana. Untuk berhenti adalah penghentian total aplikasi - semua proses terbunuh, semua layanan terhenti, semua pemberitahuan dihapus, semua alarm dihapus, dll. Aplikasi tidak diizinkan untuk diluncurkan lagi sampai diminta secara eksplisit.

Jadi, sepertinya ringkasannya adalah bahwa menggesek aplikasi dari daftar terlebih dahulu akan membunuh semua proses latar belakang untuk aplikasi, kemudian gunakan onTaskRemoveduntuk memberi tahu aplikasi bahwa tugas latar belakang telah dihapus. Pada saat itu sepertinya tergantung pada aplikasi untuk memutuskan apa yang terjadi, jadi saya kira secara teknis tidak ada aturan yang sulit dan cepat tentang apa yang terjadi pada aplikasi di luar titik itu.

eldarerathis
sumber
Itu perilaku yang tidak jelas, sangat menarik!
Matius Baca
"Matikan semua proses latar belakang yang ada untuk proses tersebut. Ini tidak akan secara langsung menyebabkan layanan berhenti". Apakah ini masih benar? Saya menjalankan tes kemarin. Kemarin, saya menghapus aplikasi dengan layanan latar belakang dalam proses utama. Aplikasi => menjalankan UI menunjukkan 0 proses dan 0 layanan. Kemudian saya menghapus aplikasi yang sama dengan proses yang berjalan dalam proses spesifik aplikasi terpisah. Aplikasi => menjalankan UI mengatakan saya memiliki 0 proses dan 1 layanan. Itu di Moto X (2014) dengan Android 4.4.4.
Steven Wexler
@StevenWexler: Bisa jadi layanan berakhir dengan sendirinya dalam kasus pertama tetapi bukan yang kedua, atau bisa juga dalam skenario kedua proses utama ditentukan (karena alasan tertentu) bahwa ia tidak ingin menghentikan layanan. Sulit diketahui dengan pasti.
eldarerathis
layanan mulai dimulai lagi secara otomatis setelah dihapus dari daftar terbaru, onCreate-nya dipanggil lagi. tetapi dalam beberapa aplikasi onCreate dipanggil sebelum onTaskRemoved dan dalam beberapa aplikasi disebut onTaskRemoved. lalu mengapa perilaku ini?
umesh
21

Ada beberapa info dalam kode sumber di kelas com.android.internal.policy.impl.RecentApplicationsBackground dan com.android.internal.policy.impl.RecentApplicationsDialog .

Jika saya membaca ini dengan benar, ada penangan khusus untuk memilih aplikasi tetapi tidak ada yang khusus untuk menggeseknya kecuali onDetachedFromWindow(), yang memanggil com.android.View.onDetachedFromWindow()yang pada dasarnya menyembunyikan elemen dan membersihkan data itu. Ini akan mengisyaratkan fakta bahwa tidak ada yang istimewa terjadi pada menggesek aplikasi, yang sesuai dengan jawaban Austin Mills, karena karena daftar tersebut tidak menunjukkan aplikasi aktif, onPause()panggilan sistem dan lainnya yang dilakukan ketika "berhenti" dari suatu aplikasi memiliki sudah terjadi.

onik
sumber
10

Saya pikir itu akan melakukan hal yang sama seperti tombol kembali. Kecuali satu perubahan kecil. Itu akan finish()semua aktivitas / fragmen dalam aplikasi.

Baru saja melakukan sedikit pengujian dengan aplikasi selfbuild kecil. Anda dapat menguji juga. Inilah aplikasi pengujian saya: https://bitbucket.org/Leandros99/lifecycletest (unduh juga tersedia. Bagi mereka yang tidak dapat membangun.)
Di setiap metode siklus aktivitas ( http://developer.android.com/reference/android/app) /Activity.html#ActivityLifecycle ) cetak aplikasi log. Anda dapat melihatnya dengan adb logcat (instal Android SDK, cd ke platform-tools dalam cmd / shell dan ketik adb logcat. Sekarang Anda akan melihat, setiap kali Anda melakukan sesuatu seperti menekan kembali atau tombol home, aplikasi mencetak metode siklus hidup, yang disebutkan di atas. )

Pertanyaan Anda: Jika saya menggesek aplikasi dari laci aplikasi terbaru, onDestroymetode akan dipanggil. Itu hampir sama dengan tombol kembali.
Semoga saya sedikit membantu. Jika ada pertanyaan, tanyakan saja.

Leandros
sumber
3

Ini menutup aplikasi, dan datanya yang disimpan dalam RAM. Dengan demikian, memberi Anda lebih banyak ruang RAM sehingga Anda dapat menjalankan aplikasi lain. Namun, layanan latar belakang TIDAK secara otomatis ditutup paksa sebagai akibat dari penutupan aplikasi yang menggunakan.

pengguna3067986
sumber
1
Meskipun ditulis dalam bahasa sehari-hari, ini sebenarnya jawaban yang cukup akurat - ini menangkap fakta bahwa proses tersebut dibuang, sesuatu yang banyak jawaban lainnya (yang secara keliru membandingkannya dengan tombol kembali) tidak ada. Namun, yang hilang di sini adalah kesadaran bahwa Android akan membuang proses ketika diperlukan untuk mendapatkan memori, jadi sementara itu melakukan beberapa pembersihan memori, itu akan terjadi secara otomatis jika diperlukan.
Chris Stratton