Pertanyaan Apakah berhenti dari aplikasi yang disukai?


Bergerak dalam upaya saya untuk belajar Android, saya hanya baca yang berikut ini:

Pertanyaan: Apakah pengguna punya pilihan untuk membunuh aplikasi   kecuali kita meletakkan opsi menu untuk membunuhnya? Jika tidak ada opsi seperti itu,   bagaimana cara pengguna mengakhiri aplikasi?

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

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

Rupanya, Anda tidak dapat menghentikan aplikasi di Android (tetapi sistem Android dapat menghancurkan aplikasi Anda 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 "penggunaan luas" oleh masyarakat umum, itu adalah aplikasi bisnis yang akan digunakan dalam bidang bisnis yang sangat sempit.

Saya sebenarnya sangat menantikan untuk mengembangkan untuk platform Android, karena alamat banyak masalah yang ada di Windows Mobile dan .NET. Namun, minggu lalu telah menjadi titik balik bagi saya ... Saya harap saya tidak harus meninggalkan Android, tetapi tidak terlihat sangat baik sekarang = (

Apakah ada cara bagi saya untuk melakukannya sangat berhenti dari aplikasi?


1037


asal


Jawaban:


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

Intinya adalah saya tidak bisa membiarkannya   Android untuk menentukan kapan aplikasi saya   akan dihentikan. itu pasti   pilihan pengguna.

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

Pengguna iPhone memiliki cara yang sama, dalam menekan tombol iPhone tidak selalu "merasa" seperti aplikasi dihentikan, karena banyak aplikasi iPhone mengambil tempat pengguna ditinggalkan, meskipun aplikasi benar-benar mati (karena hanya iPhone memungkinkan satu aplikasi pihak ketiga sekaligus, saat ini).

Seperti yang saya katakan di atas, ada banyak sekali   hal-hal yang terjadi di aplikasi saya (data sedang   DIPOTONG ke perangkat, daftar dengan tugas   itu harus selalu ada, dll.).

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

Pengguna kami masuk dan tidak bisa melakukannya   bahwa setiap kali mereka mendapat panggilan telepon   dan Android memutuskan untuk membunuh aplikasi.

Ada banyak aplikasi iPhone dan Android yang menangani hal ini. Biasanya, itu karena mereka memegang kredensial masuk, daripada memaksa pengguna untuk login setiap kali secara manual.

Misalnya, kami ingin memeriksa pembaruan   saat keluar dari aplikasi

Itu adalah kesalahan pada sistem operasi apa pun. Untuk semua yang Anda tahu, alasan aplikasi Anda sedang "keluar" adalah karena OS sedang mati, dan kemudian proses pembaruan Anda akan gagal di tengah arus. Secara umum, itu bukan hal yang baik. Baik periksa pembaruan saat memulai atau periksa pembaruan sepenuhnya secara asinkron (mis., Melalui tugas terjadwal), jangan pernah keluar.

Beberapa komentar menunjukkan bahwa memukul   tombol kembali tidak membunuh aplikasi di   semua (lihat tautan di pertanyaan saya di atas).

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

Itu hanya harus berakhir ketika   pengguna ingin menghentikannya - tidak pernah   pernah ada cara lain. Jika Anda tidak bisa menulis   aplikasi yang berperilaku seperti itu di Android,   maka saya pikir Android tidak bisa digunakan   untuk menulis aplikasi nyata = (

Maka tidak dapat aplikasi Web. Atau WebOS, jika saya memahami model mereka dengan benar (belum sempat bermain dengan salah satu). Dalam semua itu, pengguna tidak "menghentikan" apapun - mereka pergi begitu saja. iPhone sedikit berbeda, karena hanya memungkinkan satu hal untuk dijalankan pada suatu waktu (dengan beberapa pengecualian), sehingga tindakan meninggalkan berarti penghentian aplikasi yang cukup cepat.

Apakah ada cara bagi saya untuk benar-benar berhenti   aplikasi?

Seperti yang orang lain katakan kepada Anda, pengguna (melalui BACK) atau kode Anda (melalui finish()) dapat menutup aktivitas yang Anda jalankan saat ini. Pengguna umumnya tidak memerlukan yang lain, untuk aplikasi yang ditulis dengan benar, lebih dari yang mereka butuhkan "berhenti" pilihan untuk menggunakan aplikasi Web.


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

Misalnya, ada gerakan yang berkembang 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 berkembang untuk mencoba menghilangkan gagasan "mengakhiri" aplikasi. Sebagian besar aplikasi Web tidak memaksa pengguna untuk keluar, tetapi secara implisit mencatat pengguna setelah periode tidak aktif. Hal yang sama dengan Android, dan pada tingkat lebih rendah, iPhone (dan mungkin WebOS).

Ini membutuhkan lebih banyak penekanan pada desain aplikasi, berfokus pada tujuan bisnis dan tidak menempel dengan model implementasi yang terikat pada lingkungan aplikasi sebelumnya. Pengembang yang kekurangan waktu atau keinginan untuk melakukan ini akan merasa frustrasi dengan lingkungan yang lebih baru yang mematahkan model mental yang ada. Ini bukan kesalahan dari kedua lingkungan, lebih dari itu adalah kesalahan gunung karena badai yang mengalir di sekitarnya daripada melaluinya.

Misalnya, beberapa lingkungan pengembangan, seperti Hypercard dan Smalltalk, memiliki aplikasi dan alat pengembangan bersama-sama dalam satu pengaturan. Konsep ini tidak terlalu populer, di luar ekstensi bahasa untuk aplikasi (misalnya, VBA di Unggul, 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 mereka sendiri ke lingkungan di mana model mereka akan berlaku.

Jadi, ketika Anda menulis:

Seiring dengan hal-hal lain yang berantakan saya   ditemukan, saya pikir itu berkembang   aplikasi kami untuk Android tidak akan   terjadi.

Itu tampaknya menjadi yang terbaik, untuk Anda, untuk saat ini. Demikian pula, saya akan menasihati Anda agar tidak mencoba mem-port aplikasi Anda ke Web, karena beberapa masalah yang sama yang Anda laporkan dengan Android juga akan Anda temukan dalam aplikasi Web (misalnya, tidak ada "penghentian"). Atau, sebaliknya, suatu hari nanti jika Anda melakukan port aplikasi Anda ke Web, Anda mungkin menemukan bahwa aliran aplikasi Web mungkin lebih cocok untuk Android, dan Anda dapat mengunjungi kembali port Android pada saat itu.


1216



Saya hanya ingin menambahkan koreksi di sini untuk pembaca selanjutnya dari utas ini. Nuansa khusus ini telah lolos dari pemahaman saya untuk waktu yang lama jadi saya ingin memastikan tidak ada yang membuat kesalahan yang sama:

System.exit() tidak membunuh aplikasi Anda jika Anda memiliki lebih dari satu aktivitas di tumpukan.  Apa yang sebenarnya terjadi adalah itu prosesnya mati dan segera dimulai kembali dengan satu aktivitas lebih sedikit di stack. Ini juga yang terjadi ketika aplikasi Anda terbunuh oleh dialog Tutup Kekuatan, atau bahkan ketika Anda mencoba untuk membunuh proses dari DDMS. Ini adalah fakta yang sepenuhnya tidak terdokumentasi, sepengetahuan saya.

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

Jika, di sisi lain, tidak apa-apa bagi Anda untuk memiliki aktivitas yang tersisa di tumpukan Anda, ada metode lain yang membuat hal-hal menjadi sangat mudah bagi Anda: Activity.moveTaskToBack(true) hanya akan melatarbelakangi proses Anda dan menunjukkan layar beranda.

Jawaban panjang melibatkan penjelasan tentang 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 prosesnya akan berakhir dengan baik. Namun, jika berada di latar depan, OS mengasumsikan bahwa pengguna ingin tetap melakukan apa pun yang sedang dilakukannya. (Jika Anda mencoba untuk membunuh proses dari DDMS, Anda harus menekan tombol home terlebih dahulu, dan kemudian membunuhnya)
  2. Ini juga mengasumsikan bahwa setiap aktivitas tidak bergantung pada semua aktivitas lainnya. Ini sering benar, misalnya dalam hal aplikasi Anda meluncurkan Aktivitas Peramban, yang sepenuhnya terpisah dan tidak ditulis oleh Anda. Aktivitas Browser mungkin atau tidak dapat dibuat pada Tugas yang sama, tergantung pada atribut manifesnya.
  3. Ini mengasumsikan bahwa setiap aktivitas Anda benar-benar mandiri dan dapat dibunuh / dipulihkan dalam waktu singkat. (Saya lebih suka tidak menyukai asumsi khusus ini, karena aplikasi saya memiliki banyak aktivitas yang bergantung pada sejumlah besar data cache, terlalu besar untuk secara efisien diserialkan selama onSaveInstanceState, tetapi whaddya akan lakukan?) Untuk sebagian besar aplikasi Android yang ditulis dengan baik ini seharusnya benar, karena Anda tidak pernah tahu kapan aplikasi Anda akan dibunuh di latar belakang.
  4. Faktor terakhir bukanlah asumsi, melainkan batasan dari OS: membunuh aplikasi secara eksplisit sama dengan aplikasi yang mogok, dan juga sama dengan Android yang membunuh aplikasi untuk merebut kembali memori.  Ini memuncak dalam coup de grace kami: karena Android tidak dapat mengetahui apakah aplikasi keluar atau jatuh atau terbunuh di latar belakang, itu mengasumsikan pengguna ingin kembali dari tempat mereka tinggalkan, dan sehingga ActivityManager memulai kembali prosesnya.

Ketika Anda memikirkannya, ini sesuai untuk platform. Pertama, ini persis apa yang terjadi ketika proses tersebut mati di latar belakang dan pengguna kembali ke sana, sehingga perlu di-restart di tempat yang ditinggalkannya. Kedua, inilah yang terjadi ketika aplikasi crash dan menampilkan dialog Force Close yang ditakuti.

Katakan 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 dalam Tugasnya sendiri). Jika Kamera mengalami kesalahan dan mogok, apakah itu menyebabkan seluruh aplikasi mogok? 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 dalam tumpukan, dikurangi Kamera. Sejak Kegiatan Anda harus dirancang sedemikian rupa sehingga mereka dapat dibunuh dan dipulihkan dengan setetes topi, ini seharusnya tidak menjadi masalah. Sayangnya, tidak semua aplikasi dapat dirancang seperti itu, jadi itu aku s masalah bagi banyak dari kita, tidak peduli apa Romain Guy atau orang lain memberitahu Anda. Jadi, kita perlu menggunakan solusi.

Jadi, saran penutupan saya:

  • Jangan mencoba untuk membunuh prosesnya. Entah panggilan finish() pada semua kegiatan atau panggilan moveTaskToBack(true).
  • Jika proses Anda crash 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 menelepon startActivity() dengan maksud yang berisi Intent.FLAG_ACTIVITY_CLEAR_TOP bendera.
  • Jika Anda ingin membunuh aplikasi Anda dari perspektif Eclipse DDMS, sebaiknya tidak berada di latar depan, atau ia akan memulai kembali sendiri. Anda harus menekan tombol Home terlebih dahulu, dan kemudian bunuh prosesnya.

280



Semua aplikasi saya telah berhenti tombol ... dan saya cukup sering mendapatkan komentar positif dari pengguna karena itu. Saya tidak peduli jika platform dirancang dengan cara yang seharusnya tidak membutuhkan 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 dan sepertinya merupakan 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.


168



Berhenti 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" tidak terlalu penting. Mari kita asumsikan terowongan itu menjadi intranet perusahaan yang sangat aman, melakukan pemantauan atau interaksi dan tetap masuk sampai pengguna "berhenti dari aplikasi". Karena departemen TI Anda yang memerintahkannya, pengguna harus sangat sadar ketika mereka IN atau OUT dari intranet. Oleh karena itu pola pikir Anda menjadi penting bagi pengguna untuk "berhenti".

Ini sederhana. Buat layanan yang menempatkan pemberitahuan berkelanjutan di bilah notifikasi yang mengatakan "Saya ada di intranet, atau saya sedang menjalankan". Minta layanan itu melakukan semua fungsi yang Anda butuhkan untuk aplikasi Anda. Memiliki aktivitas yang mengikat ke layanan itu untuk memungkinkan pengguna Anda mengakses bit UI yang mereka butuhkan untuk berinteraksi dengan "aplikasi" Anda. Dan memiliki Menu Android -> Tombol Keluar (atau keluar, atau apa pun) yang memberi tahu layanan untuk berhenti, lalu menutup aktivitas itu sendiri.

Ini, untuk semua maksud dan tujuan persis seperti yang Anda inginkan. Selesai dengan cara Android. Lihatlah Google Talk atau Google Maps Navigation untuk contoh "exit" ini mungkin mentalitas. Satu-satunya perbedaan adalah bahwa menekan tombol kembali dari aktivitas Anda mungkin meninggalkan proses UNIX Anda untuk menunggu jika pengguna ingin menghidupkan kembali aplikasi Anda. Ini benar-benar tidak berbeda dari sistem operasi modern yang menyimpan 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 saat mereka dimuat sekarang karena mereka tidak lagi diperlukan. Android adalah hal yang sama.

Saya benar-benar tidak melihat masalah Anda.


134



Ini adalah diskusi yang menarik dan mendalam dengan banyak ahli yang berkontribusi. Saya merasa posting ini harus diulang 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 telah terkesan dengan cara Android menangani peristiwa siklus hidup, membawa konsep pengalaman seperti web ke aplikasi asli.

Setelah mengatakan bahwa saya masih percaya bahwa seharusnya ada Berhenti tombol. Mengapa? ... bukan untuk saya atau Ted atau salah satu guru teknologi di sini, tetapi hanya untuk memenuhi permintaan pengguna akhir.

Meskipun saya bukan penggemar berat Windows, tetapi lama-lama mereka memperkenalkan konsep yang digunakan oleh sebagian besar pengguna akhir (tombol X) ... "Saya ingin berhenti menjalankan widget ketika 'Saya ingin".

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

Meskipun pengembang dapat melakukan spoof terhadap perilaku ini dengan menggunakan saran yang diberikan di sini, persepsi masih tetap ada yaitu aplikasi harus benar-benar berhenti berfungsi (sekarang), oleh sumber independen, tepercaya, dan netral (OS) atas permintaan dari pengguna akhir.


68



Kamu bisa berhenti, baik dengan menekan tombol Kembali tombol atau dengan menelepon finish() di dalam kamu Activity. Telepon saja finish() dari MenuItem jika Anda ingin membunuhnya secara eksplisit.

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


35



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

Ted telah menunjukkan bahwa salah satu aplikasi yang paling banyak diunduh di Pasar adalah 'Pembunuh Aplikasi'. Orang mendapatkan sedikit serotonin tambahan ketika mereka berhenti menggunakan aplikasi. Mereka terbiasa dengan desktop / laptop. Itu membuat semuanya bergerak cepat. Itu membuat prosesor tetap dingin dan kipas mulai menyala. Ini menggunakan daya yang lebih kecil.

Bila 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 telah beralasan bahwa OS mengetahui yang terbaik dan berhenti dari sebuah aplikasi adalah barang antik. Saya dengan sepenuh hati mendukung ini.

Namun, saya juga percaya bahwa Anda tidak boleh menggagalkan pengguna, bahkan jika frustrasi itu disebabkan oleh ketidaktahuan mereka sendiri. Karena itu, saya menyimpulkan bahwa memiliki opsi 'Keluar' adalah desain yang baik, meskipun sebagian besar adalah tombol plasebo yang tidak lebih dari menutup View.


31



Ted, apa yang ingin Anda capai dapat dilakukan, mungkin tidak seperti yang Anda pikirkan sekarang.

Saya sarankan Anda membaca tentang Kegiatan dan Layanan. Berhenti menggunakan istilah "aplikasi" dan mulailah merujuk ke komponen, yaitu Kegiatan, Layanan. Saya pikir Anda hanya perlu mempelajari lebih lanjut tentang platform Android; itu adalah perubahan dalam pola pikir dari aplikasi PC standar. Kenyataan bahwa tidak satu pun dari pos Anda memiliki kata "Kegiatan" (singkat dari kutipan FAQ, yaitu bukan kata-kata Anda) di dalamnya memberitahu saya bahwa Anda perlu membaca lagi.


28