Apakah berhenti dari aplikasi tidak disukai?

1153

Bergerak dalam upaya saya mempelajari Android, saya baru saja membaca yang berikut ini :

Pertanyaan: Apakah pengguna memiliki pilihan untuk mematikan aplikasi kecuali kita meletakkan opsi menu untuk mematikannya? Jika tidak ada opsi seperti itu, bagaimana cara pengguna menghentikan aplikasi?

Jawaban: (Romain Guy): Pengguna tidak, sistem menangani ini secara otomatis. Itulah gunanya siklus hidup aktivitas (terutama onPause / onStop / onDestroy). Apa pun yang Anda lakukan, jangan meletakkan tombol aplikasi "keluar" atau "keluar". Tidak ada gunanya dengan model aplikasi Android. Ini juga bertentangan dengan cara kerja aplikasi inti.

Hehe, untuk setiap langkah yang saya ambil di dunia Android, saya mengalami beberapa masalah = (

Tampaknya, Anda tidak dapat keluar dari aplikasi di Android (tetapi sistem Android dapat menghancurkan aplikasi Anda dengan sangat baik kapan pun rasanya). Ada apa dengan itu? Saya mulai berpikir bahwa tidak mungkin untuk menulis aplikasi yang berfungsi sebagai "aplikasi normal" - bahwa pengguna dapat keluar dari aplikasi ketika dia memutuskan untuk melakukannya. Itu bukan sesuatu yang harus diandalkan OS untuk dilakukan.

Aplikasi yang saya coba buat bukanlah aplikasi untuk Android Market. Ini bukan aplikasi untuk "digunakan luas" oleh masyarakat umum, ini adalah aplikasi bisnis yang akan digunakan dalam bidang bisnis yang sangat sempit.

Saya sebenarnya sangat menantikan untuk mengembangkan platform Android, karena ini membahas banyak masalah yang ada di Windows Mobile dan .NET. Namun, minggu terakhir ini sedikit mengganggu bagi saya ... Saya harap saya tidak harus meninggalkan Android, tapi itu tidak terlihat sangat baik sekarang = (

Apakah ada cara bagi saya untuk benar - benar keluar dari aplikasi?

Ted
sumber

Jawaban:

1286

Ini pada akhirnya akan sampai ke pertanyaan Anda, tetapi saya pertama-tama ingin membahas sejumlah masalah yang Anda ajukan dalam berbagai komentar Anda untuk berbagai jawaban yang sudah diberikan pada saat penulisan ini. Saya tidak punya niat mengubah pikiran Anda - melainkan, ini ada di sini untuk orang lain yang datang untuk membaca posting ini di masa depan.

Intinya adalah saya tidak bisa mengizinkan Android menentukan kapan aplikasi saya akan dihentikan. itu harus menjadi pilihan pengguna.

Jutaan orang sangat senang dengan model di mana lingkungan menutup aplikasi sesuai kebutuhan. Para pengguna itu tidak berpikir tentang "menghentikan" aplikasi Android, lebih dari yang mereka pikirkan tentang "mengakhiri" halaman Web atau "mengakhiri" termostat.

Pengguna iPhone memiliki cara yang sama, yaitu menekan tombol iPhone tidak selalu "terasa" seperti aplikasi dihentikan, karena banyak aplikasi iPhone mengambil di mana pengguna tinggalkan, bahkan jika aplikasi benar-benar ditutup (karena iPhone hanya memungkinkan satu aplikasi pihak ketiga pada suatu waktu, saat ini).

Seperti yang saya katakan di atas, ada banyak hal yang terjadi di aplikasi saya (data sedang PUSHed ke perangkat, daftar dengan tugas yang selalu ada di sana, dll.).

Saya tidak tahu apa artinya "daftar tugas yang selalu ada di sana", tetapi "data yang di-PUSHed ke perangkat" adalah fiksi yang menyenangkan dan tidak boleh dilakukan dengan aktivitas dalam kasus apa pun. Gunakan tugas yang dijadwalkan (via AlarmManager) untuk memperbarui data Anda untuk keandalan maksimum.

Pengguna kami masuk dan tidak bisa melakukan itu setiap kali mereka mendapat panggilan telepon dan Android memutuskan untuk mematikan aplikasi.

Ada banyak aplikasi iPhone dan Android yang berurusan dengan ini. Biasanya, itu karena mereka memegang kredensial masuk, alih-alih memaksa pengguna untuk masuk setiap kali secara manual.

Misalnya, kami ingin memeriksa pembaruan saat keluar dari aplikasi

Itu adalah kesalahan pada sistem operasi apa pun. Sejauh yang Anda tahu, alasan aplikasi Anda "keluar" adalah karena OS dimatikan, dan kemudian proses pembaruan Anda akan gagal di tengah-aliran. Secara umum, itu bukan hal yang baik. Baik memeriksa pembaruan saat memulai atau memeriksa pembaruan sama sekali tidak sinkron (misalnya, melalui tugas yang dijadwalkan), tidak pernah keluar.

Beberapa komentar menyarankan bahwa menekan tombol kembali sama sekali tidak mematikan aplikasi (lihat tautan di pertanyaan saya di atas).

Menekan tombol KEMBALI tidak "membunuh aplikasi". Ini menyelesaikan aktivitas yang ada di layar ketika pengguna menekan tombol BACK.

Seharusnya hanya berhenti ketika pengguna ingin menghentikannya - tidak pernah dengan cara lain. Jika Anda tidak dapat menulis aplikasi yang berperilaku seperti itu di Android, maka saya pikir Android tidak dapat digunakan untuk menulis aplikasi nyata = (

Maka aplikasi Web juga tidak. Atau WebOS , jika saya memahami model mereka dengan benar (belum memiliki kesempatan untuk bermain dengan salah satunya). Dalam semua itu, pengguna tidak "mengakhiri" apa pun - mereka pergi begitu saja. iPhone sedikit berbeda, karena saat ini hanya memungkinkan satu hal berjalan pada satu waktu (dengan beberapa pengecualian), sehingga tindakan meninggalkan menyiratkan penghentian aplikasi yang cukup cepat.

Apakah ada cara bagi saya untuk benar-benar keluar dari aplikasi?

Seperti yang dikatakan orang lain kepada Anda, pengguna (melalui BACK) atau kode Anda (via finish()) dapat menutup aktivitas yang sedang berjalan. Pengguna umumnya tidak memerlukan hal lain, untuk aplikasi yang ditulis dengan benar, tidak lebih dari yang mereka butuhkan opsi "keluar" untuk menggunakan aplikasi Web.


Tidak ada dua lingkungan aplikasi yang sama, menurut definisi. Ini berarti bahwa Anda dapat melihat tren di lingkungan saat yang baru muncul dan yang lain terkubur.

Misalnya, ada gerakan yang tumbuh untuk mencoba menghilangkan gagasan "file". Sebagian besar aplikasi Web tidak memaksa pengguna untuk memikirkan file. Aplikasi iPhone biasanya tidak memaksa pengguna untuk memikirkan file. Aplikasi Android umumnya tidak memaksa pengguna untuk memikirkan file. Dan seterusnya.

Demikian pula, ada gerakan yang tumbuh untuk mencoba menghilangkan gagasan "mengakhiri" aplikasi. Sebagian besar aplikasi Web tidak memaksa pengguna untuk keluar, tetapi secara implisit mengeluarkan pengguna setelah beberapa saat tidak aktif. Hal yang sama dengan Android, dan pada tingkat lebih rendah, iPhone (dan mungkin WebOS).

Ini membutuhkan lebih banyak penekanan pada desain aplikasi, fokus pada tujuan bisnis dan tidak bertahan dengan model implementasi yang terkait dengan lingkungan aplikasi sebelumnya. Pengembang yang tidak memiliki waktu atau kecenderungan untuk melakukan ini akan merasa frustrasi dengan lingkungan baru yang merusak model mental yang ada. Ini bukan kesalahan dari salah satu lingkungan, lebih dari itu adalah kesalahan gunung untuk badai yang mengalir di sekitarnya daripada melalui itu.

Sebagai contoh, beberapa lingkungan pengembangan, seperti Hypercard dan Smalltalk, memiliki aplikasi dan alat pengembangan berbaur dalam satu pengaturan. Konsep ini tidak menangkap banyak, di luar ekstensi bahasa ke aplikasi (misalnya, VBA di Excel , Lisp di AutoCAD ). Pengembang yang datang dengan model mental yang menganggap keberadaan alat pengembangan dalam aplikasi itu sendiri, oleh karena itu, harus mengubah model mereka atau membatasi diri pada lingkungan di mana model mereka akan berlaku.

Jadi, ketika Anda menulis:

Seiring dengan hal-hal berantakan lainnya yang saya temukan, saya pikir mengembangkan aplikasi kami untuk Android tidak akan terjadi.

Tampaknya itu untuk yang terbaik, untuk Anda, untuk saat ini. Demikian pula, saya akan menasihati Anda untuk tidak mencoba mem-port aplikasi Anda ke Web, karena beberapa masalah yang sama dengan yang Anda laporkan dengan Android juga akan Anda temukan di aplikasi Web (mis., Tidak ada "terminasi"). Atau, sebaliknya, suatu hari jika Anda melakukan porting aplikasi Anda ke Web, Anda mungkin menemukan bahwa aliran aplikasi Web mungkin lebih cocok untuk Android, dan Anda dapat mengunjungi kembali port Android pada waktu itu.

CommonsWare
sumber
21
Satu pemikiran yang melintas di kepala saya: Jika saya hanya menulis ulang seluruh aplikasi sebagai Layanan, dan memperlakukan Layanan itu sebagai aplikasi yang sebenarnya - mungkin itu akan bekerja lebih baik? Lalu saya bisa "membodohi" Aktivitas (seperti yang diinginkan Android) untuk hanya menyajikan data yang terkandung dalam Layanan. Dalam hal ini, saya mungkin bisa menjaga status login dan hal-hal lain di sana. Menggunakan startForeground (int, Notification), saya hampir dapat menghentikan Android membunuh Layanan ...?
Ted
66
"Harap dicatat bahwa pengguna saya adalah profesional, yang menggunakan perangkat untuk tujuan tunggal menggunakan aplikasi yang saya coba porting ke Android." Sebenarnya, Anda telah menunjukkan sebaliknya ("tidak bisa melakukan itu setiap kali mereka mendapat panggilan telepon" - "panggilan telepon" bukan aplikasi Anda). Selain itu, kecuali jika Anda membuat perangkat sendiri, Anda tidak dapat mencegah orang memasang aplikasi lain jika mereka memilihnya.
CommonsWare
25
@SomeCallMeTim: Tidak, itu bukan alasan yang sah untuk digunakan killProcess(). Alasan yang sah untuk menulis kode iOS yang lebih baik.
CommonsWare
24
@ CommonsWare: Maaf, tapi itu jawaban basi yang tidak ada gunanya bagiku. Saya porting kode yang saya bayarkan ke port. Haruskah saya menghabiskan dua kali waktu melakukan port, menulis ulang kode mereka, atau menyelesaikannya dengan cara yang mengurangi biaya bagi majikan saya, yang memungkinkan mereka untuk menempatkan lebih banyak game di Android lebih cepat? Bagaimanapun, ini adalah pertanyaan akademis sepenuhnya: Mereka tidak ingin saya membuat perubahan besar pada mesin mereka, karena saya tidak dapat menguji perubahan pada iOS. DAN itu salah: Tidak ada yang "buruk" tentang penggunaan pola Singleton untuk objek yang sesuai. Android hanya merusak aplikasi WRT NDK.
SomeCallMeTim
10
@Ted untuk reinitialization yang lebih andal, mungkin Anda bisa meminimalkan jumlah status yang disimpan di Aktivitas atau Layanan itu sendiri. Alih-alih, letakkan sebagian besar negara bagian dan kode dalam kelas terpisah yang Anda buat ulang "dari awal" setiap kali Kegiatan atau Layanan dimulai.
Qwertie
290

Saya hanya ingin menambahkan koreksi di sini untuk pembaca masa depan dari utas ini. Nuansa khusus ini telah luput dari pemahaman saya sejak lama sehingga saya ingin memastikan tidak ada di antara Anda yang melakukan kesalahan yang sama:

System.exit()tidak mematikan aplikasi Anda jika Anda memiliki lebih dari satu aktivitas di tumpukan. Apa yang sebenarnya terjadi adalah bahwa proses tersebut dimatikan dan segera dimulai kembali dengan satu aktivitas lebih sedikit di stack. Ini juga yang terjadi ketika aplikasi Anda terbunuh oleh dialog Force Close, atau bahkan ketika Anda mencoba untuk mematikan proses dari DDMS. Ini adalah fakta yang sepenuhnya tidak berdokumen, setahu saya.

Jawaban singkatnya adalah, jika Anda ingin keluar dari aplikasi Anda, Anda harus melacak semua aktivitas di tumpukan Anda dan finish()SEMUA dari mereka ketika pengguna ingin keluar (dan tidak, tidak ada cara untuk beralih melalui tumpukan Aktivitas) , jadi Anda harus mengelola semua ini sendiri). Bahkan ini sebenarnya tidak mematikan proses atau referensi menggantung yang mungkin Anda miliki. Itu hanya menyelesaikan kegiatan. Juga, saya tidak yakin apakah Process.killProcess(Process.myPid())berfungsi lebih baik; Saya belum mengujinya.

Jika, di sisi lain, tidak apa-apa bagi Anda untuk memiliki kegiatan yang tersisa di tumpukan Anda, ada metode lain yang membuat semuanya menjadi sangat mudah bagi Anda: Activity.moveTaskToBack(true)hanya akan latar belakang proses Anda dan menampilkan layar beranda.

Jawaban panjang melibatkan penjelasan filosofi di balik perilaku ini. Filosofi ini lahir dari sejumlah asumsi:

  1. Pertama-tama, ini hanya terjadi ketika aplikasi Anda berada di latar depan. Jika di latar belakang proses akan berakhir dengan baik. Namun, jika berada di latar depan, OS menganggap bahwa pengguna ingin terus melakukan apa pun yang dia lakukan. (Jika Anda mencoba untuk mematikan proses dari DDMS, Anda harus menekan tombol home terlebih dahulu, dan kemudian matikan)
  2. Ini juga mengasumsikan bahwa setiap kegiatan independen dari semua kegiatan lainnya. Ini sering benar, misalnya dalam hal aplikasi Anda meluncurkan Aktivitas Browser, yang sepenuhnya terpisah dan tidak ditulis oleh Anda. Aktivitas Browser dapat atau tidak dapat dibuat pada Tugas yang sama, tergantung pada atribut manifesnya.
  3. Ini mengasumsikan bahwa masing-masing kegiatan Anda sepenuhnya mandiri dan dapat dibunuh / dikembalikan dalam waktu singkat. (Saya agak tidak menyukai asumsi khusus ini, karena aplikasi saya memiliki banyak kegiatan yang bergantung pada sejumlah besar data yang di-cache, terlalu besar untuk diserialisasi secara efisien selama onSaveInstanceState, tetapi apa yang akan dilakukan?) Untuk sebagian besar aplikasi Android yang ditulis dengan baik, ini harus benar, karena Anda tidak pernah tahu kapan aplikasi Anda akan dimatikan di latar belakang.
  4. Faktor terakhir bukanlah asumsi, melainkan keterbatasan OS: membunuh aplikasi secara eksplisit sama dengan aplikasi yang mogok, dan juga sama dengan Android yang membunuh aplikasi untuk mendapatkan kembali memori. Ini memuncak dalam kudeta kami: karena Android tidak dapat mengetahui apakah aplikasi keluar atau jatuh atau terbunuh di latar belakang, itu mengasumsikan pengguna ingin kembali ke tempat yang mereka tinggalkan, dan ActivityManager akan memulai kembali proses.

Ketika Anda memikirkannya, ini sesuai untuk platform. Pertama, ini adalah persis apa yang terjadi ketika proses terbunuh di latar belakang dan pengguna kembali ke sana, sehingga harus dimulai ulang di tempat yang ditinggalkannya. Kedua, inilah yang terjadi ketika aplikasi crash dan menyajikan dialog Force Close yang ditakuti.

Katakanlah saya ingin pengguna saya dapat mengambil gambar dan mengunggahnya. Saya meluncurkan Aktivitas Kamera dari aktivitas saya, dan memintanya untuk mengembalikan gambar. Kamera didorong ke atas Tugas saya saat ini (daripada dibuat di Tugasnya sendiri). Jika Kamera memiliki kesalahan dan crash, apakah itu akan menyebabkan seluruh aplikasi crash? Dari sudut pandang pengguna, hanya Kamera yang gagal, dan mereka harus dikembalikan ke aktivitas sebelumnya. Jadi itu hanya me-restart proses dengan semua Kegiatan yang sama di tumpukan, minus Kamera. Karena Aktivitas Anda harus dirancang sedemikian rupa sehingga kegiatan itu dapat dibunuh dan dipulihkan dengan mudah, ini seharusnya tidak menjadi masalah. Sayangnya, tidak semua aplikasi dapat dirancang seperti itu, sehingga adalahmasalah bagi banyak dari kita, tidak peduli apa yang Romain Guy atau orang lain katakan kepada Anda. Jadi, kita perlu menggunakan solusi.

Jadi, saran penutup saya:

  • Jangan mencoba untuk menghentikan prosesnya. Panggil finish()semua aktivitas atau panggilan moveTaskToBack(true).
  • Jika proses Anda macet atau terbunuh, dan jika, seperti saya, Anda memerlukan data yang ada di memori yang sekarang hilang, Anda harus kembali ke aktivitas root. Untuk melakukan ini, Anda harus memanggil startActivity()dengan Intent yang berisi Intent.FLAG_ACTIVITY_CLEAR_TOPbendera.
  • Jika Anda ingin mematikan aplikasi Anda dari perspektif Eclipse DDMS, lebih baik tidak berada di latar depan, atau itu akan restart sendiri. Anda harus menekan tombol Rumah terlebih dahulu, lalu matikan prosesnya.
Neil Traft
sumber
8
Sebenarnya, sejak saya mulai dengan Android lagi, saya menyelesaikan semua aktivitas (hanya satu aktivitas yang aktif kapan saja), dan kemudian saya panggil System.exit (0); dalam Layanan saya - dan itu berfungsi seperti yang saya inginkan juga. Saya tahu sebagian besar ppl mengatakan "jangan lakukan itu", tapi saya mendapatkan perilaku yang saya inginkan dengan langkah itu ...
Ted
13
Membunuh proses kadang-kadang sangat berguna - misalnya saat menulis game yang menggunakan kode asli. Membunuh proses berarti melepaskan semua memori yang dialokasikan kembali ke sistem, segera.
Sulthan
10
Bagi siapa pun yang peduli, Process.killProcess menunjukkan perilaku yang sama persis dengan System.exit ()
PacificSky
6
Turunkan semua aktivitas dari AtivityBase yang umum. Kemudian pegang bendera untuk menutup paksa aplikasi, di onResume periksa apakah paksaan tutup paksa diatur. Jika demikian panggil System.exit (0); Ini akan mengalir melalui seluruh tumpukan aktivitas dan akhirnya mendapatkan aplikasi sepenuhnya ditutup.
Nar Gar
12
Terima kasih telah memberikan jawaban yang sebenarnya ( moveTaskToBack()adalah apa yang saya cari). Begitu banyak orang yang mengatakan, "Tidak, kamu idiot karena selalu ingin keluar dari aplikasi kamu." bahkan tanpa mempertimbangkan bahwa mungkin ada kasus di mana Anda menginginkannya (mis. gagal masuk).
Timmmm
180

Semua aplikasi saya telah keluar dari tombol ... dan saya cukup sering mendapat komentar positif dari pengguna karenanya. Saya tidak peduli apakah platform itu dirancang dengan cara yang seharusnya tidak dibutuhkan oleh aplikasi. Mengatakan "jangan taruh di sana" agak konyol. Jika pengguna ingin berhenti ... Saya memberikan mereka akses untuk melakukan hal itu. Saya tidak berpikir itu mengurangi cara Android beroperasi sama sekali dan sepertinya praktik yang baik. Saya memahami siklus hidup ... dan pengamatan saya adalah bahwa Android tidak melakukan pekerjaan dengan baik dalam menanganinya .... dan itu adalah fakta dasar.

androidworkz
sumber
15
+1 karena sayangnya itu tidak melakukan pekerjaan yang baik pada saat ini (tapi saya masih ingin mencoba melakukan hal-hal yang dirancang, jadi itu membuat saya bingung)
Richard Le Mesurier
25
Mekanisme apa yang Anda gunakan untuk berhenti?
Gary Rudolph
4
@Igor selesai () - aktivitas tidak mematikan aplikasi (memperpanjang Aplikasi). Jadi, bahkan ketika tidak ada kegiatan yang aktif pengaturannya masih aktif dan aktual, sehingga ketika kegiatan mencoba mengaksesnya mereka akan menjadi orang-orang yang digunakan sebelumnya. System.exit (0); di sisi lain membunuh Aplikasi, sehingga ketika mulai lagi aplikasi harus menginisialisasi pengaturan dari yang baru. Itulah yang saya butuhkan ketika memperbarui aplikasi secara manual, karena saya sering mengubah format data dan saya ingin mereka segera dimasukkan kembali.
Nar Gar
1
Ya, itulah satu-satunya cara untuk mencapai apa yang saya butuhkan saat ini. Saya menggunakan system.exit ketika aplikasi diperbarui (kalau tidak saya akan mendapatkan serialisasi atau pengecualian kelas berdasarkan perubahan kode saya). Saya harus menyebutkan bahwa saya tidak memberikan pengguna UI menangani untuk membunuh aplikasi melalui system.exit - itu dicadangkan bagi saya sebagai insinyur aplikasi yang akan digunakan hanya ketika aplikasi benar-benar perlu benar-benar membongkar. Sisa waktu penyelesaian sederhana () (atau operasi tombol kembali default) digunakan.
Nar Gar
13
Ya .. persetan dengan 'bukan standar android' .. Android itu ampuh karena memungkinkan orang untuk bereksperimen .. Jika ia menyediakan API untuk melakukan sesuatu, bagaimana orang bisa mengatakan itu bukan standar Android? Saya tidak bisa mencerna semua jawaban 'filosofis' itu. Anda membuat aplikasi dengan mengingat pengguna Anda. jika mereka senang atau jika mereka ingin melihat fitur ini, maka itu benar-benar baik untuk menerapkan bahwa bahkan jika mereka yang disebut filsuf menentangnya ..
Rahul
144

Berhentilah memikirkan aplikasi Anda sebagai aplikasi monolitik. Ini adalah satu set layar UI yang pengguna dapat berinteraksi dengan "aplikasi" Anda, dan "fungsi" yang disediakan melalui layanan Android.

Tidak tahu apa "aplikasi" misterius Anda tidak terlalu penting. Mari kita asumsikan terowongan itu menjadi intranet perusahaan yang sangat aman, melakukan beberapa pemantauan atau interaksi dan tetap masuk sampai pengguna "berhenti dari aplikasi". Karena departemen TI Anda memerintahkannya, pengguna harus sangat sadar ketika mereka masuk atau keluar dari intranet. Karenanya pola pikir Anda tentang hal ini penting bagi pengguna untuk "keluar".

Ini sederhana. Buat layanan yang menempatkan pemberitahuan berkelanjutan di bilah pemberitahuan yang mengatakan "Saya di intranet, atau saya sedang menjalankan". Mintalah layanan itu melakukan semua fungsi yang Anda butuhkan untuk aplikasi Anda. Miliki aktivitas yang mengikat layanan itu untuk memungkinkan pengguna Anda mengakses bit UI yang mereka butuhkan untuk berinteraksi dengan "aplikasi" Anda. Dan memiliki Android Menu -> Keluar (atau logout, atau apa pun) tombol yang memberitahu layanan untuk berhenti, kemudian tutup aktivitas itu sendiri.

Ini, untuk semua maksud dan tujuan persis apa yang Anda katakan Anda inginkan. Dilakukan dengan cara Android. Lihatlah Google Talk atau Navigasi Google Maps untuk contoh "keluar" ini mungkin mentalitas. Satu-satunya perbedaan adalah bahwa menekan tombol kembali dari aktivitas Anda dapat membuat proses UNIX Anda menunggu jika pengguna ingin menghidupkan kembali aplikasi Anda. Ini benar-benar tidak berbeda dengan sistem operasi modern yang menyimpan file-file yang baru-baru ini diakses dalam memori. Setelah Anda keluar dari program windows Anda, kemungkinan besar sumber daya yang dibutuhkan masih dalam memori, menunggu untuk digantikan oleh sumber daya lain karena mereka dimuat sekarang karena mereka tidak lagi diperlukan. Android adalah hal yang sama.

Saya benar-benar tidak melihat masalah Anda.

Eric
sumber
3
@ Eric, Anda tidak melihat masalah karena Anda melarikan diri darinya. Anda cukup menggunakan program lain yang berjalan pada "model program" lama untuk melakukan apa yang tidak dapat dilakukan oleh "model Android". Untuk melihat masalah dengan "model Android", Anda harus membayangkan bahwa Anda tidak memiliki kemewahan mendelegasikan tugas ke kotak Linux / Windows. Anda harus membayangkan bahwa Anda dipaksa untuk melakukan semuanya dari frontmostend ke backmostend hanya dengan kotak yang menjalankan "model Android". Kemudian, Anda akan melihat bahwa batasan "model Android" sejelas langit.
Pacerier
pikirkan aplikasi Anda sebagai aplikasi monolitik. Itu ditulis dalam java yang sedang dijalankan oleh proses JVM (Java Virtual Machine) tunggal. System.exit () keluar dari JVM dan sepenuhnya dan sepenuhnya menghentikan semua layar UI dan semuanya. Pengecualian untuk hal ini adalah JIKA pemrogram mengalami kesulitan mengatur beberapa utas yang berjalan dalam beberapa proses - tetapi secara default, BUKAN demikian, dan menurut Google, seharusnya tidak dilakukan secara normal.
Jesse Gordon
@JesseGordon Ini tidak benar. System.exit()hanya menghilangkan Aktivitas dari tumpukan. JVM segera diinisialisasi ulang. Lihat jawaban ini .
forresthopkinsa
1
@forresthopkinsa OK Saya sudah mengujinya di android 7.0. Aplikasi single threaded sederhana masih berjalan dalam instance JVM sendiri, berjalan sebagai ID pengguna yang unik untuk aplikasi itu. Saya belum mencoba aplikasi multi-utas untuk tes ini. Dan System.exit () MASIH membunuh seluruh JVM untuk aplikasi itu. Jika System.exit () dipanggil dari aktivitas utama, itu hanya keluar. Jika System.exit () dipanggil dari subaktivitas, JVM masih terbunuh, tetapi android me-restart di bawah ID proses baru kembali pada aktivitas utama / pertama. android.os.Process.killProcess (android.os.Process.myPid ()); dan bunuh <pid> bekerja dengan cara yang sama.
Jesse Gordon
1
Menarik .. Melihat jawaban yang Anda tautkan, @forresthopkinsa, sepertinya Android melakukan seperti browser web, memulihkan aktivitas setelah system.exit sehingga pengguna tidak melihatnya keluar, tetapi mengecualikan aktivitas yang menyebabkan keluar. .? Aneh. Tapi bagaimanapun, System.exit () tidak menutup semua aktivitas dan membebaskan () memori dan mengakhiri JVM untuk aplikasi itu. Tapi saya tidak tahu apa jenis kejenakaan Android untuk me-restart / mengembalikannya. Apakah itu untuk menggagalkan aplikasi pembunuh aplikasi? Jadi saya kira jika seseorang ingin tombol keluar, mereka harus meletakkannya di aktivitas utama.
Jesse Gordon
71

Ini adalah diskusi yang menarik dan mendalam dengan banyak pakar yang berkontribusi. Saya merasa posting ini harus dilingkarkan kembali dari dalam situs web utama pengembangan Android, karena itu berputar di sekitar salah satu desain inti dari OS Android.

Saya juga ingin menambahkan dua sen saya di sini.

Sejauh ini saya terkesan dengan cara Android menangani acara siklus hidup, membawa konsep pengalaman seperti web ke aplikasi asli.

Karena itu saya masih percaya bahwa harus ada Quittombol. Mengapa? ... bukan untuk saya atau Ted atau guru teknologi mana pun di sini, tetapi hanya untuk memenuhi permintaan pengguna akhir.

Meskipun saya bukan penggemar Windows, tapi sejak dulu mereka memperkenalkan konsep yang biasa digunakan pengguna akhir (tombol X) ... "Saya ingin berhenti menjalankan widget ketika 'Saya' ingin".

Itu tidak berarti seseorang (OS, pengembang?) Akan mengurus itu atas kebijakannya sendiri ... itu hanya berarti "di mana tombol X Merah saya yang biasa saya". Tindakan saya harus analog dengan 'akhiri panggilan dengan menekan tombol', 'matikan perangkat dengan menekan tombol', dan seterusnya dan seterusnya ... itu persepsi. Ini membawa kepuasan bahwa tindakan saya memang mencapai tujuannya.

Meskipun pengembang dapat menipu perilaku ini menggunakan saran yang diberikan di sini, persepsi masih tetap yaitu aplikasi harus sepenuhnya berhenti berfungsi (sekarang), oleh sumber (OS) independen, tepercaya dan netral berdasarkan permintaan dari pengguna akhir.

Paul
sumber
2
Baik. Baik Windows Mobile menawarkan tombol X yang sama dengan PC Windows, kecuali bahwa itu tidak benar-benar keluar dari aplikasi, itu hanya "pintar meminimalkan" itu. Banyak pengguna mungkin tidak pernah tahu aplikasi itu tidak benar-benar berhenti. (Pendekatannya bekerja sangat baik, walaupun jika Anda menggunakan .NET Compact Framework, aplikasi tidak diberi tahu bahwa ini telah terjadi dan karenanya tidak memiliki opsi untuk membebaskan sumber daya atau benar-benar keluar.)
Qwertie
3
Sungguh, ini sama dengan berbohong kepada pengguna Anda untuk memberi mereka perasaan hangat dan tidak jelas. Pada akhirnya, lebih baik membiarkan peninggalan masa lalu jatuh ke pinggir jalan, jangan sampai mereka terus menjadi perlengkapan teknologi permanen. Seluler dan web adalah platform baru, dan tidak diharapkan berperilaku sama dengan desktop. Dan secara anekdot, setidaknya, keputusan siklus hidup Android tampaknya cocok dengan pengguna: ketika aplikasi terbesar saya melewati peringatan 2 tahun, saya telah memperhatikan aliran permintaan pengguna akhir untuk tombol "keluar" mengering saat mereka terbiasa dengan platform baru.
Jon O
2
@ Jon Apa yang Anda rekomendasikan? Tidak menawarkan opsi 'keluar' di mana saja di aplikasi?
IgorGanapolsky
Nah, ketika seorang pengguna meminta tombol keluar, saya akan menjelaskan kepada mereka secara tepat bagaimana semuanya bekerja secara berbeda dari pada desktop (yang merupakan penjelasan yang sama yang saya berikan kepada mereka ketika mereka menyebutkan task killer). Sekarang, informasi itu sepertinya sudah masuk, dan saya tidak mendapatkan permintaan itu lagi. Jadi, saya sarankan Anda menjelaskannya beberapa kali (mungkin muncul dengan respons kalengan) dan meninggalkan tombol. Atau masukkan tombol keluar palsu yang memunculkan dialog yang menjelaskan mengapa tidak ada lagi tombol keluar. : D (Juga di Android 4+ pengguna dapat menggesek aplikasi "off" dari tampilan multitasking untuk "membunuhnya".)
Jon O
3
Saya juga belum menemukan alasan di balik semua saran yang mengatakan "jangan bunuh prosesnya". Menurut pendapat saya, pelanggan selalu benar, jadi apa yang salah dengan menyediakan tombol keluar setelah diminta dan "berbohong kepada pengguna Anda untuk memberi mereka perasaan hangat dan tidak jelas", jika itu yang mereka inginkan? Ini sebagian tentang penulisan aplikasi yang bagus. Sebagian besar pengguna tidak tahu atau peduli apa yang sebenarnya terjadi di bawah tenda, tetapi jika mereka menyukai aplikasi Anda dan melakukan apa yang mereka inginkan dan harapkan, mereka akan kembali dan membeli lebih banyak aplikasi Anda. Itu yang kita semua inginkan, bukan? Atau apakah saya melewatkan sesuatu?
DDSports
37

Anda dapat keluar, baik dengan menekan Backtombol atau dengan menelepon finish()Anda Activity. Panggil saja finish()dari MenuItemjika Anda ingin membunuhnya secara eksplisit.

Romain tidak mengatakan itu tidak dapat dilakukan, hanya saja itu tidak ada gunanya - pengguna tidak perlu peduli untuk berhenti atau menyimpan pekerjaan mereka atau apa pun, karena cara kerja siklus aplikasi bekerja mendorong Anda untuk menulis perangkat lunak pintar yang secara otomatis menyimpan dan menyimpan mengembalikan keadaannya apa pun yang terjadi.

Christopher Orr
sumber
5
Itu tidak ada gunanya jika memenuhi tujuan, dan dalam aplikasi kita itu hanya melakukan itu. Misalnya, kami ingin memeriksa pembaruan saat keluar dari aplikasi. Kami tidak dapat keluar dari aplikasi, maka tidak ada pembaruan yang dapat dilakukan. Beberapa komentar menyarankan bahwa menekan tombol kembali sama sekali tidak mematikan aplikasi (lihat tautan di pertanyaan saya di atas).
Ted
2
Seperti yang dikatakan Romain, ini bukan cara kerja aplikasi inti. Jadi, jika pengguna terbiasa menekan "Kembali" untuk keluar dari aplikasi, maka sepertinya mereka akan terus melakukannya dengan aplikasi Anda daripada secara eksplisit memilih Berhenti? Anda dapat melakukan pemeriksaan pembaruan saat startup, atau onDestroy (), atau menggunakan alarm berulang .. sepertinya tidak perlu dipicu oleh pengguna.
Christopher Orr
1
Tom: Saya telah mengkode untuk Windows Mobile selama hampir 5 tahun sekarang. Itulah telepon dengan "sumber daya terbatas". Tidak ada perilaku seperti itu di sana, dan tidak ada masalah yang tidak bertindak dalam "kakak" juga. "Aplikasi nyata" = di mana programmer memiliki lebih banyak kontrol atasnya, yaitu berhenti, ketika GUI-stuff dihapus dll ...
Ted
1
Jay: karena jika masih dalam memori, saya tidak dapat memperbarui aplikasi saya berpikir. Tidak dapat menghapus file yang sedang digunakan, bukan? Saya ingin memperbarui saat keluar karena kami tidak dapat memaksa pengguna kami untuk memperbarui saat mulai. Itu ada hubungannya dengan bagaimana mereka bekerja dan apa yang mereka butuhkan. Tidak masalah bagi mereka untuk dipaksa melakukan pembaruan pada awal shift mereka karena berbagai alasan. Agak rumit.
Ted
1
Jay: Tidak, seperti yang saya nyatakan di atas itu BUKAN Aplikasi Pasar, dan itu juga tidak akan seperti itu. Ini adalah aplikasi yang sangat khusus, bukan untuk penggunaan umum.
Ted
31

Perdebatan ini bermuara pada pertanyaan kuno apakah pengembang tahu yang terbaik atau apakah pengguna tahu yang terbaik. Desainer profesional di semua bidang faktor manusia berjuang dengan ini setiap hari.

Ted menegaskan bahwa salah satu aplikasi yang paling banyak diunduh di Market adalah 'App Killer'. Orang-orang mendapatkan sedikit serotonin ekstra ketika mereka berhenti dari aplikasi. Mereka terbiasa dengan desktop / laptop. Itu membuat semuanya bergerak cepat. Itu membuat prosesor tetap dingin dan kipas tidak menyala. Ini menggunakan lebih sedikit daya.

Ketika Anda menganggap bahwa perangkat seluler adalah kapal yang jauh lebih kecil, maka Anda dapat menghargai insentif mereka untuk 'membuang apa yang tidak lagi Anda perlukan'. Sekarang para pengembang Android beralasan bahwa OS tahu yang terbaik dan berhenti dari suatu aplikasi adalah barang antik. Saya sepenuh hati mendukung ini.

Namun, saya juga percaya bahwa Anda tidak boleh membuat frustasi pengguna, bahkan jika frustrasi itu berasal dari ketidaktahuan mereka sendiri. Karena itu, saya menyimpulkan bahwa memiliki opsi 'Berhenti' adalah desain yang baik, bahkan jika sebagian besar merupakan tombol plasebo yang tidak lebih dari menutup Tampilan.

Peter Mortensen
sumber
8
Ya, memiliki tombol 'Berhenti' memang mudah digunakan. Bagaimana lagi jika pengguna keluar dari aplikasi jika ia memiliki 5 aktivitas yang mendalam? Tentu mereka dapat menekan kembali beberapa kali, tetapi saya tidak berpikir mereka akan menyukainya.
IgorGanapolsky
4
Hanya 5? Peramban web Android 2.2 membuat saya menghabiskan beberapa menit mengetuk tombol kembali sampai saya akhirnya keluar
Joe Plante
3
Saya akan mulai mendengarkan pengembang android ketika mereka mengembangkan manajer memori yang BEKERJA. Pada Froyo, ini bekerja dengan sangat buruk, mematikan aplikasi acak, memulai kembali aplikasi yang tidak perlu (dan tidak memiliki niat untuk memulainya secara sah), dan OTOH, melambat ke perayapan COMPLETE saat memori mencapai 50MB gratis.
DVK
10
Ketika agama Anda mengatakan bahwa Android Task Killer "tidak perlu", tetapi menggunakan ATK untuk membunuh tugas-tugas bodoh yang tidak menjalankan bisnis mengubah OS dari merangkak pada ~ 1-5% dari kecepatan normal kembali ke 100% dari kecepatan normal ( terukur) 100% dari seluruh 1000s penggunaan ATK lebih dari 2 tahun setiap kali sistem mencapai 50MB low end gratis, agama Anda salah
DVK
@ JoPlante Anda dapat menutup semua tab dan jendela yang terbuka terlebih dahulu lalu cukup tekan tombol kembali sekali untuk keluar :) Setidaknya pada GS2 saya.
ldam
29

Ted, apa yang Anda coba capai bisa dilakukan, mungkin tidak hanya bagaimana Anda memikirkannya sekarang.

Saya sarankan Anda membaca tentang Aktivitas dan Layanan. Berhentilah menggunakan istilah "aplikasi" dan mulailah merujuk pada komponen, yaitu Aktivitas, Layanan. Saya pikir Anda hanya perlu belajar lebih banyak tentang platform Android; itu adalah perubahan pola pikir dari aplikasi PC standar. Fakta bahwa tidak ada posting Anda yang memiliki kata "Activity" (singkat dari kutipan FAQ, yaitu bukan kata-kata Anda) di dalamnya memberitahu saya bahwa Anda perlu membaca lebih banyak lagi.

Peter Mortensen
sumber
Saya sudah membaca sebagian besar hal di android.com =) dan saya dapat menautkan ke beberapa pertanyaan saya di mana saya berbicara tentang Kegiatan, jadi itu tidak benar (mis: stackoverflow.com/questions/2032335/… atau stackoverflow.com/questions/ 2032335 / ... dll ...) Namun, saya mungkin akan mencobanya sekali lagi, dan mencoba untuk membuat "aplikasi" siapa sebagai Servce ...
Ted
4
Aplikasi dapat berisi Layanan dan Aktivitas, dan sepertinya aplikasi Anda membutuhkan keduanya. Aktivitas ini hanya bagian UI.
Aaron
23

Posting blog Kapan Menyertakan Tombol Keluar di Aplikasi Android (Petunjuk: Jangan pernah) menjelaskannya jauh, jauh lebih baik daripada yang saya bisa. Saya berharap setiap pengembang Android sudah membacanya.

Kutipan:

Dalam pengalaman saya apa yang [para pengguna] benar-benar inginkan adalah: Cara yang jelas untuk menjamin bahwa suatu aplikasi akan berhenti mengkonsumsi sumber daya (baterai, siklus CPU, transfer data, dll.).

Banyak pengguna merasakan bahwa tombol keluar mengimplementasikan persyaratan ini dan memintanya untuk ditambahkan. Pengembang, yang ingin menyenangkan penggunanya, wajib menambahkannya. Tak lama kemudian mereka berdua gagal.

  • Dalam kebanyakan kasus tombol keluar hanya memanggil Activity.finish(). Ini persis sama dengan menekan tombol kembali. Persis. Layanan terus berjalan dan pemungutan suara terus terjadi. Pengguna mungkin berpikir mereka telah membunuh aplikasi tetapi tidak, dan segera mereka akan lebih kesal.
  • Perilaku keluar sekarang ambigu. Haruskah tombol keluar Anda menutup saja Kegiatan, atau haruskah itu juga menghentikan semua Layanan, Penerima, dan Alarm yang terkait? Apa yang harus Backdilakukan Apa yang terjadi jika mereka memukul Home? Apa yang terjadi jika aplikasi Anda memiliki widget? Haruskah tombol keluar menghentikan itu dari memperbarui juga?

Solusinya adalah membuat tombol kembali berperilaku seperti yang Anda harapkan dari tombol keluar. Lebih baik lagi, cukup hentikan konsumsi sumber daya setiap kali aplikasi tidak terlihat.

Silakan baca artikel selengkapnya.

Dheeraj VS
sumber
3
Keluar dan Kembali tidak selalu digunakan untuk tujuan yang sama. Ambil, misalnya, Pandora. Ketika Anda menekan kembali untuk keluar dari aplikasi ini, itu tidak keluar dari aplikasi (tetap bermain di latar belakang sebagai layanan).
IgorGanapolsky
@ IGG. Aplikasi pemutar musik memerlukan tombol "Stop" untuk berhenti memutar musik, bukan tombol "Keluar" untuk keluar dari aplikasi.
Dheeraj Vepakomma
Apakah Anda pernah menggunakan Pandora, iHeartRadio, Spotify, Jango dan aplikasi streaming musik lainnya? Mereka semua memiliki tombol keluar. Menghentikan pemutaran musik BUKAN HAL YANG SAMA dengan menghentikan aplikasi. Terutama jika Anda memiliki layanan yang berjalan di bilah pemberitahuan.
IgorGanapolsky
2
Mistis atau tidak, pengguna primitif atau tidak, tetapi hampir setiap perangkat lunak UI yang pernah ditulis - pada platform dan OS apa pun - menerapkan tombol keluar / tutup / keluar. Bagaimana lagi Anda menerapkannya?
IgorGanapolsky
3
@ DheerajV.S., Cukup berhenti mengkonsumsi sumber daya setiap kali aplikasi tidak terlihat? Saran yang buruk. Sangat. Sangat x99. Setiap kali saya mencoba mengirim sendiri foto ke email, saya harus membuat aplikasi terlihat selama 5 menit penuh karena jika saya menguranginya, itu berhenti mengirim email foto. Benar, saya tidak dapat menggunakan ponsel saya selama 5 menit penuh hanya karena beberapa pengembang yang berpikir aplikasi harus berjalan hanya ketika terlihat. Sekarang bayangkan mengirim file yang lebih besar seperti video .....
Pacerier
21

Jawaban: (Romain Guy): Pengguna tidak, sistem menangani ini secara otomatis. Itulah gunanya siklus hidup aktivitas (terutama onPause / onStop / onDestroy). Apa pun yang Anda lakukan, jangan meletakkan tombol aplikasi "keluar" atau "keluar". Tidak ada gunanya dengan model aplikasi Android. Ini juga bertentangan dengan cara kerja aplikasi inti.

1: Benar-benar keluar dari aplikasi mungkin umumnya tidak wajib, tetapi tidak sia-sia. Bagaimana jika windows tidak memiliki opsi keluar? Sistem akan berjalan lambat karena memori penuh dan OS harus menebak program mana yang Anda lakukan. Saya tidak peduli apa yang Romain Guy atau bahkan Larry Page dan Sergey Brin katakan - ini adalah fakta yang tidak perlu dipertanyakan lagi: Sistem berjalan lebih lambat ketika mereka harus membunuh tugas untuk mendapatkan ingatan mereka sebelum aplikasi baru dapat diluncurkan. Anda tidak bisa memberi tahu saya bahwa tidak perlu waktu untuk mematikan aplikasi! Bahkan cahaya dari bintang-bintang jauh mengambil waktu ... Ada adalah beberapa digunakan dalam memungkinkan pengguna untuk aplikasi sepenuhnya dekat.

2: Bertolak belakang dengan cara kerja aplikasi inti? Maksudnya apa? Ketika saya selesai menjalankan aplikasi untuk saat ini, itu tidak lagi melakukan pekerjaan apa pun ... Hanya menunggu untuk dibunuh oleh OS ketika ingatannya diperlukan.

Singkatnya, ada perbedaan yang jelas antara meminimalkan dan keluar, dan tidak ada klik yang baik untuk yang lain. Apakah kita meninggalkan obeng di setiap sekrup? Atau kunci di setiap pintu? Apakah kita membiarkan semua peralatan kita tetap tinggi sampai pemutusnya pecah dan kita perlu menyalakan alat lain? Apakah kita meninggalkan mesin cuci piring penuh dengan hidangan, dan hanya mengambil cukup setiap kali untuk memberikan ruang bagi beberapa yang kotor baru? Apakah kita membiarkan semua mobil berjalan di jalan masuk sampai - oh tidak apa-apa.

Jika pengguna ingin meminimalkan suatu aplikasi, maka hal terbaik adalah menguranginya. Jika pengguna ingin keluar dari aplikasi, berarti yang terbaik adalah keluar.

Apakah itu disukai? Itulah pandangan Android - mereka tidak menyukai itu. Dan banyak banyak pengembang Android pemula yang tidak menyukai itu.

Tetapi ketika tiba saatnya, ada pengkodean yang baik dan pengkodean yang buruk. Ada model aliran program yang baik dan ada model aliran program yang buruk.

Meninggalkan program di memori ketika pengguna tahu mereka selesai dengan mereka sama sekali bukan aliran program yang baik. Sama sekali tidak ada gunanya, dan memperlambat segalanya saat meluncurkan aplikasi baru atau ketika menjalankan aplikasi mengalokasikan lebih banyak memori.

Ini seperti mobil Anda: Ada kalanya Anda membiarkannya berjalan, seperti berhenti di lampu merah, atau mungkin makanan cepat saji melewati, atau berhenti di ATM. Tetapi ada situasi lain di mana Anda ingin mematikannya - seperti ketika Anda mulai bekerja, atau toko kelontong atau bahkan rumah.

Demikian pula, jika Anda memainkan permainan dan telepon berdering, ya. Hentikan permainan dan terus jalankan. Tetapi jika pengguna selesai dengan game untuk sementara waktu, maka tentu saja biarkan mereka keluar.

Tombol keluar pada beberapa aplikasi harus lebih di depan daripada yang lain. Game, misalnya, atau program di mana pengguna kemungkinan ingin sepenuhnya keluar, harus memiliki jalan keluar yang jelas. Program lain, seperti, mungkin, program email, di mana keluar adalah keinginan yang tidak mungkin (sehingga dapat terus memeriksa email) - program ini tidak boleh menyia-nyiakan ruang layar input kontrol utama dengan opsi keluar, tetapi untuk aliran program yang baik, itu harus memiliki opsi keluar. Bagaimana jika seseorang memutuskan mereka tidak ingin program surat mereka mencoba memeriksa email ketika mereka berada di daerah jangkauan yang buruk, atau mungkin dalam panggilan Skype atau apa pun? Biarkan mereka keluar dari program email jika mereka mau!

Menangguhkan dan keluar adalah dua tugas penting dan tidak memenuhi peran yang lain.

Jesse Gordon
sumber
2
"Jika pengguna ingin meminimalkan aplikasi, maka hal terbaik adalah menguranginya. Jika pengguna ingin keluar dari aplikasi, maka dengan segala cara yang terbaik adalah keluar." - Ada satu hal (berdasarkan lebih dari satu dekade pengalaman): pengguna jarang tahu, apa yang mereka inginkan. Jika Anda tidak membantu mereka, Anda harus mengubahnya. Tentang sampel di atas: izinkan saya memberi Anda sampel lain: Anda sedang mengerjakan sebuah mobil dan memiliki meja untuk berbagai hal. Apakah Anda selalu menyingkirkan untuk memperbaiki semua alat yang diperlukan untuk kabinet atau menyimpan yang paling sering digunakan? Dan hanya menyimpan yang besar terlambat digunakan untuk memiliki tempat untuk yang baru?
HoGo
4
HoGo, terima kasih atas komentar Anda. Secara alami, saya tidak setuju. Secara khusus, sebaik yang saya tahu, pandangan Anda adalah bahwa karena beberapa pengguna tidak tahu apa yang harus mereka lakukan, maka jangan biarkan pengguna melakukan apa yang harus mereka lakukan, bahkan orang yang tahu apa yang harus mereka lakukan. Jika android memiliki cara untuk mengetahui secara akurat apakah harus menghentikan aplikasi alih-alih meminimalkannya, maka baik-baik saja. Tetapi tidak, dan memaksa semua pengguna untuk selalu hidup dengan minimalisasi ketika mereka ingin keluar mengarah ke kinerja perangkat yang buruk.
Jesse Gordon
Masalahnya, sistem tahu bahwa ketika Anda memulai satu aplikasi dan tidak ada memori itu harus membunuh yang terakhir. Pengguna seharusnya tidak tahu itu. Anda hanya menginginkannya karena Anda adalah manusia yang suka penebangan dalam kendali, hanya ingatan ototnya yang bodoh, kontrolnya yang bahkan tidak berguna harus menutup program. Komputer diciptakan untuk mengotomatisasi, saya ingin lebih banyak untuk Windows untuk bekerja seperti Android dan hanya menutup secara otomatis untuk saya, tetapi saya harus ingat untuk menyimpan dan keluar, itu konyol, mengapa saya, pengguna melakukan itu? komputer harus mengelola memori mereka, saya punya hal lain untuk dikelola.
Luiz Felipe
Sebenarnya saya tidak menutup program di mesin Windows saya, saya memiliki 32GB RAM, saya membiarkan semuanya berjalan, saya menutupnya ketika saya menyelesaikan pekerjaan saya. Mengapa menutup program, untuk membukanya lagi 5 menit kemudian, ini tidak masuk akal. Pikirkan proyek C ++ besar yang membutuhkan 2 menit untuk menjadi responsif, saya hanya membiarkan Visual Studio terbuka selamanya. Dan saya berharap itu juga tidak crash dari 15 hari terbuka (dan ya, saya menggunakan memori ECC untuk itu).
Luiz Felipe
Analogi dengan toko mesin adalah yang baik, saya juga meninggalkan alat yang paling sering digunakan di atas meja saya, saya tidak memilih alat, menggunakannya, dan mengembalikannya setiap waktu. Juga, saya tidak memulai hari, nyalakan komputer, tunggu sampai mulai, buka IDE, apa pun. Saya hanya membiarkannya berjalan, komputer modern dapat menganggur pada 40w, mengapa ditutup? itu juga memakai lebih sedikit komponen (tidak ada arus masuk, EE tahu itu :))
Luiz Felipe
19

Saya pikir intinya adalah bahwa tidak perlu keluar dari aplikasi kecuali Anda memiliki perangkat lunak kereta. Android berhenti aplikasi saat pengguna tidak menggunakannya dan perangkat membutuhkan lebih banyak memori. Jika Anda memiliki aplikasi yang perlu menjalankan layanan di latar belakang, Anda mungkin ingin cara untuk mematikan layanan.

Misalnya, Google Listen terus memutar podcast ketika aplikasi tidak terlihat. Tetapi selalu ada tombol jeda untuk mematikan podcast ketika pengguna selesai menggunakannya. Jika saya ingat dengan benar, Dengar, bahkan menempatkan pintasan di bilah notifikasi sehingga Anda selalu dapat membuka tombol jeda dengan cepat. Contoh lain adalah aplikasi seperti aplikasi twitter misalnya yang secara konstan memilih layanan di internet. Jenis aplikasi ini harus benar-benar memungkinkan pengguna untuk memilih seberapa sering melakukan polling pada server, atau apakah akan melakukan polling di latar belakang.

Jika Anda perlu memiliki kode yang berjalan saat keluar, Anda dapat mengganti onPause (), onStop (), atau onDestroy () yang sesuai. http://developer.android.com/reference/android/app/Activity.html#ActivityLifecycle

Jay Askren
sumber
5
Seiring dengan hal-hal berantakan lainnya yang saya temukan, saya pikir mengembangkan aplikasi kami untuk Android tidak akan terjadi. Terlalu banyak "kakak" -satu yang terjadi, di mana Android memberi tahu saya aplikasi apa yang harus dijalankan atau tidak. Saya sebagai seorang programmer harus memiliki pilihan itu, bukan google atau android = (
Ted
3
Aktivitas Anda - antarmuka pengguna yang aktif - hilang ketika aplikasi lain muncul, atau Anda menekan balik atau apa pun. Pengguna tidak berinteraksi dengan mereka, jadi paling aman untuk menyelamatkan negara jika pengguna tidak kembali untuk waktu yang lama, dan seterusnya, seperti yang Anda tahu. Tidak ada yang menghentikan Anda dari menulis Servicemeskipun untuk menjaga pekerjaan yang sedang berlangsung di latar belakang, seperti menerima dorongan data atau apa pun. Google Talk tidak berhenti bekerja ketika Anda menggunakan aplikasi yang berbeda. Sama dengan Pemutar musik. Lihat aplikasi lain di luar sana dan cara kerjanya.
Christopher Orr
3
Anda harus dapat menyimpan kredensial sehingga pengguna tidak perlu masuk setiap kali mereka menerima panggilan telepon atau meninggalkan aplikasi Anda. Saya akan merekomendasikan melihat siklus hidup Android. Saat aplikasi dijeda, dihentikan, atau dihancurkan, Anda dapat menyimpan semua data yang relevan sehingga ketika aplikasi dibuka lagi, itu akan menjadi seperti ketika mereka meninggalkannya. Pengguna bahkan tidak perlu tahu bahwa aplikasi itu pernah dihentikan.
Jay Askren
1
Saya dapat membayangkan bahwa pengguna mungkin ingin keluar dari beberapa aplikasi yang sangat intensif sumber daya. Mungkin harus mengurangi penggunaan sumber daya saat dijeda, tetapi itu mungkin tidak selalu mungkin
Casebash
1
Pertanyaan ini masih saya lihat, 4 tahun setelah saya membahasnya =) Saya memang menjalankannya sebagai layanan di latar belakang, tapi saya telah menambahkan tombol berhenti, karena saya masih merasa - 4 tahun kemudian - itu perlu dan penting. Dan saya melihat semakin banyak aplikasi yang memiliki itu juga (Skype misalnya).
Ted
19

Jika Anda tidak dapat memahami bagaimana membuat data / koneksi Anda (dan dengan demikian "aplikasi" Anda) tetap ada, maka Anda tidak akan dapat melakukan apa yang "perlu" Anda lakukan dengan Android.

Mereka yang mengunduh App Killers kecil yang imut itu biasanya menemukan bahwa mereka tidak membantu masa pakai baterai atau penggunaan memori, tetapi menghalangi OS untuk melakukan tugas mengelola memori secara efisien ...

http://android-developers.blogspot.com/2010/04/multitasking-android-way.html

Dan
sumber
Sementara kita berbicara tentang pembunuh tugas, posting yang sangat mencerahkan muncul di Android reddit beberapa hari yang lalu. Intinya adalah, gunakan pembunuh tugas dengan hati-hati atau Anda benar-benar bisa berakhir melukai masa pakai baterai Anda: reddit.com/r/Android/comments/cwhm6/…
Neil Traft
@Neil Traft, saya menemukan komentar di posting sangat mencerahkan. Tenaga penjualan di toko merekomendasikan dan memasang pembunuh tugas untuk pelanggan mereka :)
dipu
3
@Dan, Bagaimana mungkin saya bisa keluar sepenuhnya dari aplikasi yang saya lakukan selama seminggu menghalangi OS Android dari pekerjaannya? Jadi ada lebih banyak memori gratis. Itu tidak mungkin menghalangi android! Meskipun begitu, itu pasti bisa mempercepatnya! Jika saya tahu saya sudah selesai dengan aplikasi untuk sementara waktu, itu sama sekali tidak ada gunanya. Itu hanya menghabiskan memori, dan cepat atau lambat, saya akan meluncurkan aplikasi baru dan OS akan memiliki penundaan tambahan karena harus pergi membunuh beberapa aplikasi yang saya tahu MINGGU lalu yang saya selesai dengan.
Jesse Gordon
@Jesse Gordon, Sudahkah Anda menyaksikan proses yang sebenarnya setelah Anda membunuh aplikasi? Mereka dihidupkan ulang, OS menganggap ada masalah ... OS akan mematikan aplikasi ketika membutuhkan memori. Apakah Anda bahkan membaca sesuatu yang diposting di artikel yang disebutkan di sini?
Dan
@Dan, Untuk berpikir bahwa Android akan melakukan sesuatu seperti ini .... itu benar-benar membutuhkan pendidikan ulang cuci putih yang serius.
Pacerier
18

Saya akan mempertimbangkan membaca "Pengembangan Aplikasi Nirkabel Android" yang diterbitkan oleh Addison-Wesley. Saya baru saja menyelesaikannya dan itu SANGAT menyeluruh.

Tampaknya Anda memiliki beberapa kesalahpahaman mendasar pada platform Android. Saya juga agak frustrasi pada awalnya dengan siklus hidup aplikasi aplikasi Android, tetapi setelah mencapai pemahaman yang lebih besar, saya menjadi sangat menikmati pendekatan ini. Buku ini akan menjawab semua pertanyaan Anda dan banyak lagi. Ini benar-benar sumber daya terbaik yang saya temukan untuk pengembang Android baru.

Juga, saya pikir Anda perlu melepaskan port line-for-line dari aplikasi yang ada. Untuk mem-port aplikasi Anda ke platform Android, beberapa desain aplikasi akan berubah. Siklus hidup aplikasi yang digunakan diperlukan karena perangkat seluler memiliki sumber daya yang sangat terbatas relatif terhadap sistem desktop dan memungkinkan perangkat Android untuk menjalankan beberapa aplikasi secara teratur dan sadar sumber daya. Lakukan beberapa studi mendalam tentang platform ini, dan saya pikir Anda akan menyadari bahwa apa yang ingin Anda lakukan sepenuhnya layak. Semoga berhasil.

Ngomong-ngomong, saya sama sekali tidak berafiliasi dengan Addison-Wesley atau orang atau organisasi apa pun yang terkait dengan buku ini. Setelah membaca kembali posting saya, saya merasa bahwa saya keluar dari fanboyish kecil. Saya hanya benar-benar menikmatinya dan merasa sangat membantu. :)

Peter Mortensen
sumber
2
Terima kasih untuk tip bukunya. Saya akan memeriksanya jika saya bisa dan jika saya memutuskan untuk pindah ke port Android. Hanya untuk menyatakannya lagi: pengguna kami tidak terlalu mutakhir dalam hal komputer. Saya akan sangat sulit bagi mereka untuk menggunakan misalnya NotificationBar di Android. Terlalu kecil (mereka punya jari BESAR hehe). Ini dunia yang berbeda bagi mereka, jadi kita harus tetap sederhana dan tanpa opsi bagi pengguna. Kami membangun .NET-solusi kami dengan itu dalam pikiran - jangan beri mereka pilihan =)
Ted
Saya dengar itu. Anda harus menganggap sebagian besar pengguna tidak terlalu pintar teknologi.
Andy
8
Saya bosan dengan mantra betapa sedikitnya "sumber daya" yang dimiliki perangkat seluler. Bangun, mereka berjalan pada lebih dari 500Mhz dan memiliki banyak memori. Dell Axim lama saya memiliki 128MB RAM. Perangkat saat ini di luar sana biasanya memiliki lebih dari 512RAM dan berjalan pada 1GHZ! Itu 10 kali lebih banyak daripada Pentium 90Mhz saya yang lama, dan saya tidak mendengar ppl mengatakan "sumber daya yang sangat terbatas" ini dan itu. Saatnya bangun dan mencium aroma kopi - kita berada di tahun 2010 sekarang, bukan tahun 80-an.
Ted
16

Hampir 99% dari waktu tidak perlu untuk aplikasi Android untuk mengambil alih siklus hidupnya sendiri. Sebagian besar waktu datang ke perencanaan yang lebih baik atau desain aplikasi yang lebih cerdas. Misalnya, lebih baik membangun layanan internal (tidak diekspor) untuk menangani unduhan, dll., Atau merancang tindakan dan tugas di sekitar alur kerja pengguna.

Tapi itu dikatakan, di mana ada kemauan di sana ada jalan. Android menyediakan - melalui kelas android.os.Process, API yang jauh lebih baik daripada Java untuk mengontrol proses yang mendasarinya. Dan tidak seperti Java, ia tidak memperlakukan pengembang seperti orang bodoh dengan menyembunyikan semuanya di balik panggilan java.lang.System.exit () sederhana.

Jadi bagaimana Anda meminta aplikasi Anda untuk bunuh diri di Android? Nah, triknya sederhana:

Buat kelas aplikasi Android Anda sendiri dengan mewarisi dari kelas android.app.Application standar (jangan lupa untuk mendeklarasikannya dalam file AndroidManifest.xml).

Ganti metode onCreate (), dan simpan ID proses yang memulai aplikasi Anda:

this.pid = android.os.Process.myPid(); // Save for later use.

Sekarang untuk mematikan aplikasi Anda, berikan metode kill ():

android.os.Process.sendSignal(pid, android.os.Process.SIGNAL_KILL);

Sekarang, kapan pun Anda membutuhkan aplikasi Anda untuk bunuh diri, ketikkan saja Cast konteks aplikasi, dan panggil metode kill Anda!

((MySuicidalApp) context.getApplicationContext()).kill()

Hanya ingat bahwa karena kebijakan manajemen proses di Android, khususnya yang terkait dengan layanan, Android mungkin hanya memilih untuk memulai kembali layanan Anda (lihat Anda tidak harus menggunakan pembunuh tugas di Android ).

Andries
sumber
ya, saya hanya datang ke sini karena saya ingin menutup aplikasi saya dalam satu situasi masuk akal, cache data OBB saya rusak dan saya perlu me-restart seluruh App
Luiz Felipe
14

Ketika saya menyusun aplikasi di Android, saya melihatnya seperti ini:

  • Anda bekerja dengan aplikasi Anda
  • Telepon berdering
  • Anda menerima telepon
  • Pada akhir panggilan, Anda kembali ke aplikasi Anda di tempat yang sama dengan Anda

Untuk melakukan itu, Anda hanya perlu Backtombol atau Hometombol telepon Anda (baik dengan menekan pendek atau panjang) dan bilah notifikasi.

Ketika saya keluar dari aplikasi saya, saya hanya menggunakan Backtombol sampai saya keluar dari itu atau Hometombol.

Begitulah menurut saya sebagian besar aplikasi. Tetapi jika saya memerlukan semacam sesi atau koneksi, saya menjelaskan kepada pengguna dengan tombol masuk / keluar dan pemberitahuan (bilah judul atau apa pun). Ini adalah gaya yang agak berbeda dari aplikasi gaya "keluar" murni.

Di PC, Anda memiliki desktop multi-GUI, dan di Android, Anda jelas memiliki banyak tugas, tetapi Anda hanya menampilkan satu aplikasi pada satu waktu (saya tidak mempertimbangkan widget di sini ^^). Dan di ponsel, kapan saja, Anda dapat memiliki pemberitahuan untuk sesuatu yang lebih penting daripada apa yang Anda lakukan.

Jadi seluruh konsep aplikasi bergantung pada sesuatu yang berbeda yaitu "masuk aplikasi - kerja - keluar aplikasi".

Solostaran14
sumber
12

Hmmmm ...

Saya pikir Anda tidak melihat aplikasi Android dengan cara yang benar. Anda dapat melakukan sesuatu yang hampir seperti apa yang Anda inginkan dengan mudah:

  • Apakah aktivitas aplikasi menyimpan / mengembalikan status seperti yang dianjurkan dalam dokumentasi siklus hidup pengembang.

  • Jika beberapa login diperlukan pada tahap pemulihan (tidak ada informasi login / sesi tersedia) maka lakukanlah.

  • Akhirnya tambahkan tombol / menu / batas waktu dalam hal ini Anda akan melakukan finish()tanpa menyimpan login dan info sesi lainnya, membuat secara implisit akhir sesi aplikasi: jadi jika aplikasi dimulai / dibawa ke depan lagi itu akan memulai sesi baru.

Dengan begitu Anda tidak terlalu peduli apakah aplikasi tersebut benar-benar dihapus dari memori atau tidak.

Jika Anda benar-benar ingin menghapusnya dari memori (ini tidak disarankan, dan BTW untuk tujuan apa?), Anda dapat membunuhnya secara bersyarat di akhir onDestroy()dengan java.lang.System.exit(0)(atau mungkin restartPackage(..)?). Tentu saja lakukan hanya dalam kasus di mana Anda ingin "benar-benar mengakhiri aplikasi", karena itu onDestroy()adalah bagian dari siklus hidup normal kegiatan dan bukan akhir aplikasi sama sekali.

Slig
sumber
11

Karena Aplikasi dalam konteks Android hanyalah Sekumpulan Kegiatan yang terkait secara samar, berhenti dari Aplikasi tidak terlalu masuk akal. Anda dapat menyelesaikan () suatu Kegiatan, dan tampilan Kegiatan sebelumnya di tumpukan Kegiatan akan digambar.

Untuk Tuan
sumber
2
Berhenti dari aplikasi tentu bisa masuk akal dalam beberapa situasi. Jika itu adalah program yang Anda gunakan beberapa kali sebulan selama beberapa menit, ada manfaat yang tidak perlu dipertanyakan untuk keluar sepenuhnya dari aplikasi. Manfaat itu adalah bahwa OS tidak perlu meluangkan waktu untuk keluar dari aplikasi itu seminggu kemudian ketika kehabisan memori dan telepon Anda berdering dan Anda telah menekan tombol jawab, dan Anda sedang menunggu android untuk membebaskan sebagian memori. jadi Anda dapat menjawab panggilan Anda, misalnya. Atau mungkin Anda mendapat email dan ingin membacanya - aplikasi apa pun yang membutuhkan lebih banyak memori akan diluncurkan lebih cepat jika OS tidak terlebih dahulu membebaskannya.
Jesse Gordon
3
Apa yang dikatakan @JesseGordon, dan aspek lain dari alasan mengapa berhenti ini masuk akal: jika saya tidak keluar dari aplikasi intensif sumber daya ini, saya tahu saya tidak akan menggunakan lagi selama sebulan, OS kadang-kadang salah membunuh beberapa aplikasi lain saat sumber daya menjadi langka, sambil membiarkan aplikasi sumber daya hog yang tidak berguna ini berjalan ... membuat aplikasi lain itu membutuhkan waktu lebih lama untuk melanjutkan dari yang seharusnya.
Don Hatch
10

Saya setuju dengan Ted. Saya mengerti bahwa keluar dari aplikasi bukanlah "cara Android", tetapi sepertinya tidak harus dihilangkan. Berikut adalah tiga alasan mengapa Anda mungkin ingin keluar nyata ke aplikasi (bukan hanya aktivitas):

  1. Pengguna mungkin ingin kontrol atas aplikasi mana yang terbunuh jika memori rendah. Jika aplikasi penting A berjalan di latar belakang, maka Anda mungkin ingin keluar dari aplikasi B saat Anda selesai menggunakannya sehingga aplikasi A tidak terbunuh oleh sistem operasi.

  2. Jika aplikasi Anda memiliki data sensitif yang di-cache dalam memori, Anda mungkin ingin mematikan aplikasi tersebut sehingga aplikasi virus / worm / nakal tidak bisa mendapatkannya. Saya tahu model keamanan seharusnya mencegah itu, tetapi untuk berjaga-jaga ...

  3. Jika aplikasi Anda menggunakan sumber daya (seperti jaringan, CPU, sensor, dll.) Yang dapat mempengaruhi telepon, maka salah satu cara untuk memastikan bahwa sumber daya tersebut dibebaskan adalah dengan keluar dari aplikasi. Saya memahami bahwa aplikasi yang berperilaku baik harus membebaskan sumber daya saat tidak diperlukan. Tetapi sekali lagi, keluar dari aplikasi sepertinya cara yang masuk akal untuk memastikan hal itu.

Burke
sumber
6
Menurut Anda apa yang dimaksud dengan "aplikasi"? Jika saya membuka aplikasi Facebook, dan mengatur foto profil baru - aplikasi Kamera atau Galeri saya akan mulai. Sebagai pengguna, saya masih melakukan tugas yang sama (menggunakan Facebook). Jika saya kemudian memutuskan untuk menutup Facebook, aplikasi Kamera dan Galeri saya harus ditutup juga (karena mereka diluncurkan dari Facebook) ... Bagaimana jika saya sedang mengedit beberapa foto saya yang lain dan hanya bermaksud untuk menutup Facebook ? Anda akan mengalihkan masalah ke potensi kehilangan data.
seanhodges
Yah, saya tidak berpikir itu bisa sampai sejauh kehilangan data. Jika Anda memiliki aktivitas pihak ketiga yang berjalan dalam tugas yang sama dengan aktivitas Anda sendiri, dan aktivitas Anda sendiri adalah aktivitas dengan tombol keluar, maka pengguna harus melakukan finish()aktivitas pihak ketiga sebelum ia dapat menekan tombol keluar. Dan aktivitas pihak ketiga harus menyimpan informasi yang belum disimpan pada saat itu. Saya tidak berpikir Anda dapat menggunakan pengalih aplikasi untuk kembali ke aktivitas tombol keluar kecuali jika berjalan dalam tugas yang terpisah. Dan jika ini adalah tugas yang terpisah, ini adalah proses yang terpisah, dan karenanya tidak akan terbunuh oleh tombol keluar.
Neil Traft
2
1. Saya pikir 99,99% pengguna Android tidak perlu khawatir tentang bagaimana OS mengelola aplikasi di balik tirai. Sisanya adalah orang aneh dan akan menemukan alat-alat canggih membuat sistem berperilaku tepat seperti yang mereka inginkan. 2. Anda selalu dapat membongkar data sensitif saat aktivitas dijeda atau dihentikan. 3. Sama seperti di atas, sumber daya dapat dibebaskan dalam metode panggilan balik siklus hidup. Ketika kegiatan dilanjutkan, sumber daya dapat dialokasikan kembali.
Zsolt Török
4
Saya pikir ini agak menarik bahwa begitu banyak pengguna Android memasang "Advanced Task Killer", sebuah aplikasi yang menutup aplikasi lain karena biasanya Anda tidak dapat melakukannya sendiri. Saya menggunakannya sepanjang waktu sendiri. Keluar dari aplikasi bukanlah sesuatu yang saya rasa bisa Anda lakukan tanpanya.
Ted
2
@ ZsoltTörök, 99,99% orang berurusan dengan komputer / telepon yang lambat dan dipaksa keluar dari pilihan untuk khawatir tentang bagaimana OS mengelola aplikasi di balik tirai.
Pacerier
10

Kernel Linux memiliki fitur yang disebut Pembunuh Kehabisan Memori (seperti yang disebutkan di atas, kebijakan dapat dikonfigurasi di tingkat userspace serta kernel tidak optimal, tetapi tidak berarti tidak perlu).

Dan ini banyak digunakan oleh Android:

Beberapa aplikasi userspace tersedia untuk membantu membunuh aplikasi ini, misalnya:

Peter Teoh
sumber
9

Anda tampaknya telah menemukan jawaban yang Anda inginkan dalam perintah finish (). Ini tidak akan menghapus aplikasi Anda dari memori, tetapi Android akan melakukannya kapan pun ia membutuhkan sumber daya, sehingga tidak ada bedanya bahwa Anda tidak akan melakukannya secara eksplisit.

Saya hanya akan menambahkan bahwa untuk mencapai efek penuh yang biasanya dimiliki oleh keluar aplikasi, Anda ingin mengatur ulang status aplikasi ke kondisi apa pun yang normalnya pada saat dijalankan pertama kali setelah boot perangkat, sebelum untuk memanggil selesai () pada semua aktivitas Anda. Dengan begitu, jika pengguna memilih aplikasi Anda lagi, itu akan tampak telah dijalankan "segar," tanpa negara tersisa dari titik sebelum "keluar" yang disimulasikan.

Jika ada beberapa tindakan khusus yang seharusnya hanya terjadi pada "keluar," seperti menyimpan pekerjaan pengguna atau apa pun, Anda juga dapat melakukannya sebelum bagian inisialisasi ulang dari rutin di atas.

Pendekatan ini memungkinkan Anda untuk mencapai tujuan Anda memiliki perintah "keluar" tanpa melanggar filosofi Android meninggalkan pengelolaan sumber daya OS, termasuk penutupan aplikasi, di tangan sistem operasi.

Secara pribadi, saya tidak akan menggunakan pendekatan ini, karena pengguna Android mengharapkan aplikasi untuk mempertahankan kontinuitasnya ketika mereka mengunjunginya kembali, sehingga mereka tidak terbiasa dengan modalitas "keluar" dari aplikasi. Saya sebaliknya akan mendukung fungsi "jelas" yang dapat dipanggil pengguna untuk mengatur ulang aplikasi ke beberapa keadaan awal default, tanpa perlu "meninggalkan" dalam proses.

Satu-satunya pengecualian adalah ketika pengguna menekan tombol kembali beberapa kali untuk menutup aplikasi. Dalam situasi itu, tidak ada harapan di pihak pengguna bahwa negara akan diselamatkan (dan jika ada keadaan yang belum disimpan dalam aplikasi, maka Anda, sebagai pengembang, harus memiliki kode yang menangani tombol kembali yang mendeteksi bahwa data yang belum disimpan, dan meminta pengguna untuk menyimpannya ke SharedPreferences atau file, atau ke media non-volatil lainnya).

Mengenai system.exit (0):

Jika Anda memutuskan untuk menggunakan system.exit (0) untuk menutup aplikasi Anda dengan finalitas kasar (misalnya, sebagai hasil dari tombol kembali tombol akhir), maka saya akan memperingatkan Anda bahwa meskipun bagi saya ini meskipun "bekerja," dan dalam beberapa kasing adalah satu-satunya cara saya bisa menutup aplikasi tanpa sisa itu tersisa, ada satu kesalahan kecil yang terjadi di Jelly Bean ketika Anda menggunakan pendekatan ini.

Khususnya, jika Anda menggunakan daftar Aplikasi Terkini untuk membuka aplikasi Anda, dan kemudian menggunakan tombol kembali untuk menutup aplikasi (dengan yang dekat dilaksanakan melalui system.exit (0)), daftar Aplikasi Terkini akan menjadi terlihat lagi, karena akan tidak pernah ditutup. Jika kemudian Anda mengetuk entri aplikasi Anda dalam daftar itu untuk menjalankannya untuk kedua kalinya dari daftar Aplikasi Terakhir yang sama dan sudah terbuka, tidak akan ada respons.

Saya menduga bahwa penyebabnya adalah karena daftar Aplikasi Terkini memegang referensi ke aplikasi Anda yang telah menjadi tidak berfungsi karena Anda telah menutup aplikasi menggunakan system.exit (0). Penutupan aplikasi Anda yang lebih beradab menggunakan selesai () mungkin telah memberi tahu OS dengan cara yang akan memungkinkannya untuk me-refresh daftar Aplikasi Terkini, tetapi system.exit (0) tampaknya tidak melakukan ini.

Ini bukan masalah besar di dalam dan dari dirinya sendiri, karena sangat sedikit orang akan membuka aplikasi dari Aplikasi Terbaru, kemudian keluar, dan kemudian segera membukanya lagi dari daftar Aplikasi Terkini yang terbuka. Dan jika mereka mengetuk tombol beranda dan kemudian membuka kembali daftar Aplikasi Terbaru, entri aplikasi Anda akan ada di sana, dan itu akan berfungsi penuh. Tapi saya pikir itu menunjukkan bahwa penggunaan system.exit (0) dapat mengganggu komunikasi yang tepat antara aplikasi Anda dan OS, dan ini menunjukkan bahwa mungkin ada konsekuensi lain, lebih serius, mungkin halus, dari penggunaan pendekatan ini.

Carl
sumber
Anda mungkin dapat menghapus entri aplikasi terbaru sebelum memanggil selesai ()? Ini adalah sesuatu yang akan saya coba ketika waktu memungkinkan. Saya memiliki Layanan latar depan dengan Kegiatan peluncur kecil. Karena Kegiatannya sangat kecil, bukan masalah besar jika tidak terbunuh dan dikubur, tetapi masuk akal untuk memberi tahu Android bahwa ini dapat dilakukan sebelum sisanya, jika mungkin.
nsandersen
9

Saya harap semuanya akan berubah seiring waktu. Pengguna harus dapat mematikan aplikasi atau proses jika proses aplikasi diberi sandbox dengan benar oleh OS. Ada anggapan bahwa aplikasi harus ditulis dengan sempurna atau pengguna hanya akan menggunakan aplikasi yang mengikuti semua rekomendasi SDK. Saya pikir itu adalah tugas berat.

dipu
sumber
Aku tahu. Produk Apple bagus untuk sebagian konsumen. Mereka tidak baik untuk pengembang. OS Android memiliki potensi penuh untuk menjadi seperti "OS Windows dunia PC" untuk ponsel. mungkin lebih baik. Ini sudah lebih terbuka daripada jendela dunia PC, kecuali itu tidak memungkinkan kita untuk menulis task manager.
dipu
7

Ada desain (relatif) sederhana yang akan memungkinkan Anda untuk berkeliling teka-teki "keluar". Jadikan aplikasi Anda memiliki status "aktivitas" yang hanya layar kosong. Pada onCreate pertama dari aktivitas tersebut, Anda dapat meluncurkan aktivitas lain di mana fungsi utama aplikasi Anda berada. "Keluar" kemudian dapat diselesaikan dengan menyelesaikan () pada aktivitas kedua ini dan kembali ke dasar hanya layar kosong. OS dapat menyimpan layar kosong ini dalam memori selama yang diinginkan ...

Intinya, karena Anda tidak bisa keluar ke OS, Anda hanya berubah menjadi ketiadaan yang diciptakan sendiri.

qwerty_ca
sumber
2
Ide bagus. Namun, bahkan menyelesaikan Aktivitas (atau Layanan) tidak menghentikan OS. Oh tidak, bahkan setelah onDestroy telah dieksekusi semua variabel dan hal-hal masih ada. Saya baru saja melihat bahwa di dalam Layanan, semuanya sama meskipun onDestroy dipanggil ...
Ted
2
... dan dengan demikian System.exit (0) membantu =)
Ted
7

Tanpa fungsi keluar untuk pengembang aplikasi untuk membunuh aplikasi mereka sendiri itu adalah desain yang sangat buruk.

Aplikasi saya perlu memungkinkan pengguna untuk secara dinamis mengubah data secara dinamis selama runtime dan pengguna perlu me-restart aplikasi saya untuk membuat efek perubahan, tetapi Android tidak mengizinkan aplikasi saya restart dengan sendirinya. OS Android memiliki siklus hidup aplikasi desain yang sangat buruk.

Peter Mortensen
sumber
9
public void appRestart () {Intent i = Intent baru (getBaseContext (), MyActivity.class); i.addFlags (Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity (i); }
androidworkz
2
Kode komentar di atas ini benar-benar berfungsi dengan baik. Setidaknya Anda dapat pindah ke aktivitas pertama alih-alih keluar sepenuhnya dari App. :)
Harpreet
7

Untuk menutup aplikasi di titik mana saja, gunakan FLAG_ACTIVITY_CLEAR_TOPflag di Intent lalusystem.exit();

Atau ada cara yang serupa, tetapi tanpa system.exit()ketika Anda ingin keluar panggil metode ini:

public void exit() {
    startActivity(new Intent(this, HomeActivity.class).
    setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | IntentCompat.FLAG_ACTIVITY_CLEAR_TASK).putExtra(EXIT_FLAG, true));
}

Di HomeActivity.onCreate()tambahkan kode berikut Anda

protected void onCreate(Bundle savedInstanceState) {
    if (getIntent().getBooleanExtra(EXIT_FLAG, false)) {
        if ((getIntent().getFlags() & Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY) == 0) {
            finish();
        }
    }
......................

Ini akan bekerja tanpa memutus siklus hidup Android.

Lemberg
sumber
7

Pertama-tama, jangan pernah menggunakan System.exit (0). Itu seperti membuat seseorang tidur meninju kepalanya!

Kedua: Saya menghadapi masalah ini. Sebelum membagikan solusi saya, saya ingin membagikan pemikiran saya.

Saya pikir "Tombol Keluar" itu bodoh. Benar-benar sangat bodoh. Dan saya pikir pengguna (konsumen) yang meminta tombol keluar untuk aplikasi Anda juga bodoh. Mereka tidak mengerti bagaimana OS bekerja dan bagaimana mengelola sumber daya (dan itu melakukan pekerjaan dengan baik).

Saya pikir jika Anda menulis kode yang baik yang melakukan hal-hal yang benar (memperbarui, menyimpan, dan mendorong) pada saat dan kondisi yang tepat dan menggunakan hal-hal yang benar (Layanan dan Penerima) itu akan berfungsi dengan cukup baik dan tidak ada yang akan mengeluh .

Tetapi untuk melakukan itu Anda harus mempelajari dan mempelajari cara kerja Android. Bagaimanapun, ini adalah solusi saya untuk memberikan kepada pengguna "Tombol Keluar".

Saya membuat Menu Opsi yang selalu terlihat di setiap aktivitas (saya punya aktivitas super yang melakukan itu).

Ketika pengguna mengklik tombol itu inilah yang terjadi:

Intent intent = new Intent(this, DashBoardActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

SharedPreferences settings = getSharedPreferences(getString(PREF_ID), Context.MODE_PRIVATE);
SharedPreferences.Editor editor = settings.edit();
editor.putBoolean(FORCE_EXIT_APPLICATION, true);

  // Commit the edits!
editor.commit();
startActivity(intent);
finish();

Jadi saya menyimpan di SharedPreferences bahwa saya ingin mematikan aplikasi saya, dan saya memulai Intent. Silakan lihat bendera-bendera itu; itu akan menghapus semua backstack saya memanggil Aktivitas DashBoard saya yang merupakan aktivitas "rumah" saya.

Jadi di Aktivitas Dashboard saya, saya menjalankan metode ini di onResume:

private void checkIfForceKill() {

    // CHECK IF I NEED TO KILL THE APP

    // Restore preferences
    SharedPreferences settings = getSharedPreferences(
            getString(MXMSettingHolder.PREF_ID), Context.MODE_PRIVATE);
    boolean forceKill = settings.getBoolean(
            MusicSinglePaneActivity.FORCE_EXIT_APPLICATION, false);

    if (forceKill) {

        //CLEAR THE FORCE_EXIT SETTINGS
        SharedPreferences.Editor editor = settings.edit();
        editor.putBoolean(FORCE_EXIT_APPLICATION, false);

        // Commit the edits!
        editor.commit();

        //HERE STOP ALL YOUR SERVICES
        finish();
    }
}

Dan itu akan bekerja dengan cukup baik.

Satu-satunya hal yang saya tidak mengerti mengapa itu terjadi adalah bahwa ketika saya melakukan finish terakhir (dan saya sudah memeriksa: itu mengikuti semua aliran onPause → onStop → onDestroy) aplikasi masih pada aktivitas terbaru (tetapi ini kosong).

Sepertinya maksud terbaru (yang telah memulai DashboardActivity) masih dalam sistem.

Saya harus menggali lebih banyak untuk juga menghapusnya.

StErMi
sumber
8
Tidak banyak konsumen yang tahu apa itu OS apalagi cara kerjanya, ini tidak membuat mereka bodoh. Menginginkan tombol Keluar / Keluar / Mati menjadikannya normal. Ketika Anda meninggalkan ruangan Anda mematikan lampu, yang lebih penting ketika Anda meninggalkan rumah Anda, Anda mengunci pintu dan di sinilah saya melihat masalah dengan ketidakmampuan untuk keluar dari program dengan benar. Membiarkan program hidup-hidup di latar belakang adalah risiko keamanan yang besar.
Keributan
4
"Saya pikir" Tombol Keluar "itu bodoh". Sebagian besar aplikasi perangkat lunak menyediakan tombol keluar.
IgorGanapolsky
Anda berkata "// DI SINI BERHENTI SEMUA LAYANAN ANDA" dan kemudian selesai menggunakan (). Layanan Android tidak memiliki metode selesai (). Mereka memiliki unbindService (mConnection);
IgorGanapolsky
@Squiggles Jika Anda memiliki ruangan yang mematikan semua lampu secara otomatis dan mengunci pintu saat Anda pergi, Anda tidak perlu peduli.
Seshu Vinay
7

Siklus hidup aplikasi Android dirancang untuk pengguna ponsel, bukan pengguna komputer.

Siklus hidup aplikasi adalah paradigma brutal sederhana yang diperlukan untuk mengubah server Linux menjadi alat konsumen.

Android adalah Java over Linux, OS server lintas platform nyata. Begitulah cara penyebarannya begitu cepat. Siklus hidup aplikasi merangkum realitas yang mendasari OS.

Untuk pengguna seluler, aplikasi baru saja diinstal atau tidak diinstal. Tidak ada konsep berlari atau keluar. Bahkan, proses aplikasi dimaksudkan untuk berjalan sampai OS merilisnya untuk sumber daya yang dimiliki.

Karena ini adalah Stack Overflow, siapa pun yang membaca ini adalah pengguna komputer dan harus mematikan 90% pengetahuan mereka untuk memahami siklus hidup aplikasi seluler.

Dominic Cerisano
sumber
Saya tidak mengikuti langkah Anda untuk "pengguna komputer harus mematikan 90% dari pengetahuan mereka". Ya, itulah yang dikatakan Romain Guy, tapi itu tidak membuatnya benar. Menurut saya bagian "Opsi lanjutan untuk pengguna komputer", dengan tombol "Keluar", akan memenuhi kebutuhan semua orang.
Don Hatch
Saya tidak tahu siapa "Romain Guy" ini, atau mengapa dia mengutip saya. Menutup tugas terbaru akan keluar dari aplikasi, seperti halnya berhenti dari info aplikasi. ADB mengizinkan akses shell untuk pengguna tingkat lanjut.
Dominic Cerisano
6

Perlu waktu lebih lama bagi saya untuk membaca T&J ini daripada benar-benar menerapkan Siklus Aplikasi Android yang tidak layak.

Ini adalah aplikasi GPS yang mengumpulkan poin dan mengirimkan lokasi saat ini ke layanan web setiap beberapa detik menggunakan utas ... Ini bisa menjadi polling setiap 5 menit dalam kasus Ted untuk pembaruan, kemudian onStop dapat dengan mudah memulai aktivitas pembaruan. Ted was soo khawatir jika ada yang ditemukan (asynchronous Ted, jangan kode seperti programmer Windows atau program Anda akan berjalan seperti program Windows ... ya, tidak terlalu sulit).

Saya melakukan beberapa kode awal di onCreate untuk mengatur hal-hal untuk aktivitas seumur hidup, termasuk checkUpdate.start();:

...

@Override
public void onStart() {
    super.onStart();
    isRemote = true;
    checkUpdate.resume();

    locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 2000, 0, luh);
}

@Override
public void onPause() {
    isRemote = false;
    checkUpdate.suspend();
    locationManager.removeUpdates(luh);
    super.onStop();
}

Kode ini mungkin benar-benar salah, tetapi berhasil. Ini adalah salah satu aplikasi Android pertama saya.

Voa, sebuah aplikasi yang tidak mengkonsumsi CPU ketika berada di latar belakang, namun langsung siap untuk dibuka kembali karena berada dalam RAM (meskipun tidak memegang RAM seperti siklus hidup Android) ... aplikasi selalu siap, itu telepon , teman-teman. Jika suatu aplikasi menggunakan semua RAM dan tidak dapat ditutup oleh OS maka masalahnya mungkin berhenti berdering = P Itu sebabnya OS harus dapat menutup aplikasi Anda ketika itu di latar belakang (jika aplikasi Anda tidak itu sumber daya babi itu tidak akan ditutup BTW), jadi mari kita menulis aplikasi yang lebih baik.

Brant
sumber
Anda seharusnya tidak menelepon super.onStop dari metode onPause .. Ini sepertinya akan mengacaukan segalanya.
Matt Wolfe
1
Setelah membaca 20 atau lebih jawaban filosofis yang hanya menghindari pertanyaan .... +1 untuk memiliki beberapa kode.
Pacerier
6

Setiap kali saat Anda pindah ke halaman berikutnya melalui niat, gunakan:

`YourActivityname.this.finish()`;

Contoh:

Intent intent = new Intent(getApplicationContext(), SMS.class);

startActivity(intent);
MainActivity.this.finish();

Agar tidak ada aktivitas yang berjalan di latar belakang dan ketika Anda ingin Keluar dari aplikasi Anda, gunakan:

MainActivity.this.finish();
android.os.Process.killProcess(android.os.Process.myPid());
System.exit(0);
getParent().finish();

Keluar ini bekerja seperti pesona bagi saya :)

GaneshKumar
sumber
1
Itu tidak keluar dari aplikasi melainkan datang ke Mainactivity.
Sharath
1
Tapi hati-hati - onPause () TIDAK dipanggil dalam kasus killProcess dan System.exit. Kami punya beberapa masalah dengan itu.
Pavel Biryukov
4

Dalam kasus apa pun, jika Anda ingin menghentikan aplikasi Anda, Anda selalu dapat menelepon System.exit(0);.

Tasos Kleisas
sumber
5
System.exit()TIDAK membunuh aplikasi Anda jika Anda memiliki lebih dari satu aktivitas di stack. Pengembang Android yang menggunakannya belum memahami siklus hidup aplikasi Android dasar. Baca jawaban ini .
Dheeraj Vepakomma
Solusi lengkap dengan System.exit(0); stackoverflow.com/questions/2033914/...
Sohail Zahid
2
Sebenarnya, System.exit () tidak membunuh aplikasi Anda. Namun, jika System.exit () dipanggil dari suatu tempat selain dari aktivitas utama, android akan memulai ulang aplikasi dengan satu aktivitas yang lebih sedikit di stack. Bagi saya itu tampak seperti respons konyol terhadap System.exit yang disengaja bersih. Maksud saya, jika div0 atau crash tidak disengaja, mungkin akan sopan untuk memulai kembali. Tapi itu bahkan tidak menyebabkan peluncuran ulang otomatis seperti yang saya ingat. Tetapi bagaimanapun juga, aplikasi tersebut terbunuh. Mungkin dimulai ulang, tetapi itu tidak berarti tidak terbunuh.
Jesse Gordon
3

Jika Anda memiliki 10,20 .. beberapa Kegiatan berjalan dan Anda ingin menyelesaikan semua itu dan keluar dari sistem.

Buat array statis di application classatauconstants class.

Konstanta

public class Constants {

public static ArrayList<Activity> activities = new ArrayList<Activity>();

}

MainActivity Tambahkan referensi aktivitas saat ini di larik ini

activity = MainActivity.this; Constants.activities.add(activity);

public class MainActivity extends Activity {

    private ImageView imageButton;
    private Activity activity;


    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        activity = MainActivity.this;
        Constants.activities.add(activity);

        imageButton = (ImageView) findViewById(R.id.camera);
        imageButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                // existing app.
                if (Constants.activities != null) {
                    for (int i = 0; i < Constants.activities.size(); i++) {
                        Activity s = Constants.activities.get(i);
                        s.finish();
                    }
                }
                //super.finish();
                finish();
                android.os.Process.killProcess(android.os.Process.myPid());
                System.exit(1);
            }
        });
    }
}
Sohail Zahid
sumber
1
Ini dapat membuat aplikasi Anda mogok saat pengguna menekan tombol dua kali, terutama ketika sistem berada di bawah beban berat karena alasan apa pun. Ini dapat dicegah dengan menghapus aktivitas dari array.
Semoga