Semoga seseorang dapat membantu saya mencari tahu, jika bukan solusi, setidaknya penjelasan untuk perilaku.
Masalah:
Pada beberapa perangkat, menekan ikon peluncur menghasilkan tugas saat ini sedang dilanjutkan, pada yang lain itu menghasilkan niat peluncuran awal yang dipecat (secara efektif memulai ulang aplikasi). Mengapa ini terjadi?
Detailnya:
Ketika Anda menekan "Ikon Peluncur" aplikasi dimulai secara normal - Artinya, saya berasumsi, sebuah Intent diluncurkan dengan nama pertama Anda Activity
dengan aksi android.intent.action.MAIN
dan kategori android.intent.category.LAUNCHER
. Namun tidak selalu demikian:
Pada sebagian besar perangkat, jika Anda menekan ikon peluncur setelah aplikasi sudah berjalan, Aktivitas yang sedang berjalan dalam proses itu dilanjutkan ( BUKAN yang awal Activity
). Ini melanjutkan dengan cara yang sama seolah-olah Anda telah memilihnya dari "Tugas Terbaru" di menu OS. Ini adalah perilaku yang saya inginkan di semua perangkat.
Namun, pada perangkat lain yang dipilih perilaku yang berbeda terjadi:
Di Motorola Xoom, ketika Anda menekan ikon peluncur, Aplikasi akan selalu memulai peluncuran awal
Activity
terlepas dari apa yang sedang berjalan. Saya berasumsi bahwa ikon peluncur selalu memulai maksud "PELUNCURAN".Pada Samsung Tab 2, ketika Anda menekan ikon peluncur, jika Anda baru saja menginstal aplikasi, itu akan selalu meluncurkan awal
Activity
(Sama seperti Xoom) - namun, setelah Anda me-restart perangkat setelah instalasi, ikon peluncur akan melanjutkan aplikasi. Saya berasumsi bahwa perangkat ini menambahkan "aplikasi yang diinstal" ke dalam tabel pencarian pada startup perangkat yang memungkinkan ikon peluncur untuk melanjutkan tugas yang berjalan dengan benar?
Saya sudah membaca banyak jawaban yang suara mirip dengan masalah saya tetapi hanya menambahkan android:alwaysRetainTaskState="true"
atau menggunakan launchMode="singleTop"
untuk Activity
tidak jawabannya.
Edit:
Setelah peluncuran terbaru dari aplikasi ini, kami menemukan bahwa perilaku ini mulai terjadi pada semua perangkat setelah restart pertama. Yang tampaknya gila bagi saya tetapi melihat melalui proses restart, saya tidak dapat menemukan apa yang salah.
sumber
finish()
mereka dalam kasus di mana ia memulai yang pertamaActivity
kembali daripada melanjutkannya.Jawaban:
Perilaku yang Anda alami disebabkan oleh masalah yang ada di beberapa peluncur Android sejak API 1. Anda dapat menemukan detail tentang bug serta kemungkinan solusinya di sini: https://code.google.com/p/android/issues/ detail? id = 2373 .
Ini adalah masalah yang relatif umum pada perangkat Samsung serta produsen lain yang menggunakan peluncur / kulit kustom. Saya belum melihat masalah terjadi pada peluncur saham Android.
Pada dasarnya, aplikasi tidak benar-benar memulai kembali sepenuhnya, tetapi Aktivitas peluncuran Anda sedang dimulai dan ditambahkan ke bagian atas tumpukan Aktivitas saat aplikasi sedang dilanjutkan oleh peluncur. Anda dapat mengonfirmasi hal ini dengan mengeklik tombol kembali saat Anda melanjutkan aplikasi dan ditampilkan Aktivitas peluncuran. Anda kemudian harus dibawa ke Aktivitas yang Anda harapkan akan ditampilkan ketika Anda melanjutkan aplikasi.
Solusi yang saya pilih untuk diterapkan untuk menyelesaikan masalah ini adalah dengan memeriksa kategori Intent.CATEGORY_LAUNCHER dan tindakan Intent.ACTION_MAIN dalam maksud yang memulai Kegiatan awal. Jika kedua flag tersebut ada dan Activity tidak berada di root dari task (artinya aplikasi sudah berjalan), maka saya panggil finish () pada Activity awal. Solusi tepat itu mungkin tidak bekerja untuk Anda, tetapi sesuatu yang serupa seharusnya.
Inilah yang saya lakukan di onCreate () dari Aktivitas awal / peluncuran:
sumber
Pertanyaan ini masih relevan di 2016. Hari ini seorang penguji QA melaporkan aplikasi saya memulai kembali daripada melanjutkan dari peluncur saham di Android M.
Pada kenyataannya, sistem menambahkan aktivitas yang diluncurkan ke tumpukan tugas saat ini , tetapi tampaknya bagi pengguna seolah-olah telah terjadi restart dan mereka kehilangan pekerjaan mereka. Urutannya adalah:
Catatan: masalah ini tidak bermanifestasi untuk men-debug APK yang digunakan melalui ADB, hanya dalam APK yang diunduh dari Play Store atau dimuat di samping. Dalam kasus terakhir, maksud peluncuran dari langkah 5 berisi bendera
Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT
, tetapi tidak dalam kasus debug. Masalahnya hilang begitu aplikasi dimulai dari peluncur. Kecurigaan saya adalah Tugas diunggulkan dengan Intent yang salah bentuk (lebih akurat, tidak standar) yang mencegah perilaku peluncuran yang benar sampai tugas tersebut dihapus sepenuhnya.Saya mencoba berbagai mode peluncuran aktivitas , tetapi pengaturan itu menyimpang terlalu banyak dari perilaku standar yang diharapkan pengguna: melanjutkan tugas di aktivitas B. Lihat definisi perilaku yang diharapkan berikut dalam panduan untuk Tugas dan Kembali Tumpukan , di bagian bawah halaman di bawah 'Memulai Tugas':
Saya menemukan jawaban ini relevan dan memasukkan yang berikut ke dalam metode 'onCreate' dari aktivitas root saya (A) sehingga dilanjutkan dengan tepat ketika pengguna membuka aplikasi.
PEMBARUAN: memindahkan solusi ini dari penguraian panji niat ke kueri jika aktivitas tersebut merupakan akar dari tugas secara langsung. Bendera niat sulit untuk diprediksi dan diuji dengan semua cara berbeda untuk membuka aktivitas MAIN (Luncurkan dari rumah, luncurkan dari tombol 'atas', luncurkan dari Play Store, dll.)
sumber
Aha! (tldr; Lihat pernyataan dalam huruf tebal di bagian bawah)
Saya telah menemukan masalahnya ... Saya kira.
Jadi, saya akan memulai dengan anggapan. Ketika Anda menekan peluncur, itu memulai default
Activity
atau, jikaTask
dimulai oleh peluncuran sebelumnya terbuka, itu membawanya ke depan. Dengan kata lain - Jika pada tahap apa pun dalam navigasi Anda membuat yang baruTask
danfinish
yang lama, peluncur sekarang tidak akan lagi melanjutkan aplikasi Anda.Jika anggapan itu benar, saya cukup yakin bahwa itu adalah bug, mengingat masing-masing
Task
dalam proses yang sama dan sama validnya dengan kandidat resume seperti yang pertama dibuat?Masalah saya kemudian diperbaiki dengan menghapus flag-flag ini dari beberapa
Intents
:Sementara itu cukup jelas
FLAG_ACTIVITY_NEW_TASK
menciptakan yang baruTask
, saya tidak menghargai bahwa anggapan di atas berlaku. Saya menganggap ini sebagai pelakunya dan menghapusnya untuk menguji dan saya masih memiliki masalah jadi saya menolaknya. Namun, saya masih memiliki kondisi di bawah ini:Layar splash saya mulai "utama"
Activity
di aplikasi saya menggunakan bendera di atas. Lagipula, Jika saya telah "me-restart" aplikasi saya danActivity
masih berjalan, saya lebih suka menyimpan informasi keadaan itu.Anda akan melihat dalam dokumentasi yang tidak menyebutkan memulai yang baru
Task
:Jadi, saya punya situasi seperti yang dijelaskan di bawah ini:
A
diluncurkanB
denganFLAG_ACTIVITY_CLEAR_TOP
,A
selesai.B
ingin memulai kembali layanan sehingga mengirim penggunaA
yang memiliki logika memulai kembali layanan dan UI (Tidak ada bendera).A
diluncurkanB
dengan FLAG_ACTIVITY_CLEAR_TOP,A
selesai.Pada tahap ini
FLAG_ACTIVITY_CLEAR_TOP
flag kedua sedang restartB
yang ada di tumpukan tugas. Saya berasumsi ini harus menghancurkanTask
dan memulai yang baru, menyebabkan masalah saya, yang merupakan situasi yang sangat sulit dikenali jika Anda bertanya kepada saya!Jadi, jika semua anggapan saya benar:
Launcher
satunya resume awalnya dibuat TaskFLAG_ACTIVITY_CLEAR_TOP
akan, jika restart hanya yang tersisaActivity
, juga membuat ulang yang baruTask
sumber
Saya memiliki masalah yang sama pada perangkat Samsung. Setelah banyak mencari, tidak ada jawaban yang bekerja untuk saya. Saya menemukan bahwa dalam file AndroidManifest.xml ,
launchMode
diatur kesingleInstance
(android:launchMode="singleInstance"
). MenghapuslaunchMode
atribut memperbaiki masalah saya.sumber
launchMode
nilai: inthecheesefactory.com/blog/…Di Cat s60 saya, saya telah mengaktifkan "Jangan simpan aktivitas" dalam opsi Pengembang, menonaktifkan ini lagi memungkinkan saya untuk beralih aplikasi tanpa kehilangan status aplikasi ...
sumber
Solusi ini bekerja untuk saya:
kredit: Saya perlu meminimalkan aplikasi android pada klik tombol kembali
mungkin tidak berfungsi di semua perangkat, tetapi berhasil membuat perilaku tombol home ketika tombol kembali ditekan, sehingga menghentikan aktivitas daripada menyelesaikannya.
sumber
Saya memiliki masalah yang sama, penyebabnya adalah:
(Kode Kotlin, dalam MainActivity)
Jadi ketika menavigasi ke MainActivity saya dari LoginActivity saya, saya menggunakan ini:
Ketika menggunakan flag-flag ini, saya tidak harus memiliki onBackPressed () di MainActivity saya, itu akan keluar dari aplikasi secara alami di klik belakang. Dan ketika menekan tombol Home dan kembali ke aplikasi itu tidak bisa restart.
sumber
Solusi untuk orang-orang yang tidak tahu tentang pemrograman dan mengalami masalah ini di ponsel android mereka. Ini terjadi terutama karena peningkatan versi android (hanya asumsi saya). Setelah memutakhirkan semua aplikasi Anda dioptimalkan untuk menggunakan baterai lebih sedikit. Tetapi, ini pada gilirannya memperlambat perangkat Anda.
Bagaimana menyelesaikan
Pergi ke pengaturan >> Aplikasi >> pengaturan aplikasi (mencari tanda pengaturan di mana saja di layar - itu berbeda pada perangkat yang berbeda) >> optimasi baterai (atau opti serupa [masukkan deskripsi gambar di sini] [1] aktif) >> pindahkan semua aplikasi ke keadaan 'tidak dioptimalkan' (harus melakukan 1 dengan 1 secara manual -mungkin diizinkan / tidak diizinkan di beberapa ponsel). Aplikasi peluncur Anda harus 'tidak dioptimalkan' (Peluncur Zen UI dalam kasus saya - ini adalah pelakunya saya kira - Anda dapat mencoba mengoptimalkan / Tidak mengoptimalkan dan memulai kembali aplikasi yang berbeda jika Anda punya waktu). Sekarang restart ponsel Anda. (tidak perlu mengatur ulang data / mode aman atau masalah)
Coba multitasking sekarang. :) Menekan ikon peluncur sekarang akan menghasilkan tugas saat ini sedang dilanjutkan. :) Perangkat Anda akan menjadi Jangan khawatir tentang baterai, itu akan menguras pula.
sumber
Berharga bagi pengguna Anda. Resume sempurna bahkan setelah duduk berminggu-minggu di daftar aplikasi yang baru saja digunakan.
Sepertinya resume untuk pengguna tetapi sebenarnya adalah awal yang penuh sesak nafas.
Latar Belakang: Memori yang digunakan oleh aplikasi yang berada dalam aktivitas utama yang belum memulai tugas mudah untuk diperoleh kembali. OS hanya dapat me-restart aplikasi dengan bundel asli diteruskan ke onCreate. Namun Anda dapat menambahkan ke bundel asli
onSaveInstanceState
sehingga ketika aplikasi Anda dihidupkan ulang oleh OS Anda dapat mengembalikan keadaan instance dan tidak ada yang lebih bijaksana apakah aplikasi dimulai kembali atau dilanjutkan. Ambil contoh program peta klasik. Pengguna bergerak ke posisi di peta dan kemudian menekan tombol home. Dua minggu kemudian aplikasi pemetaan ini masih dalam daftar aplikasi terbaru bersama dengan facebook, pandora, dan permen. OS tidak hanya menyimpan nama aplikasi untuk aplikasi yang baru digunakan tetapi juga menyimpan bundel asli yang digunakan untuk memulai aplikasi. Namun programmer telah mengkodekannyaonSaveInstanceState
metode sehingga bundel orignal sekarang berisi semua bahan dan informasi yang diperlukan untuk membangun aplikasi sehingga sepertinya itu dilanjutkan.Contoh: Simpan posisi kamera saat ini di onSaveInstanceState hanya memetikan aplikasi dibongkar dan harus dimulai kembali minggu kemudian dari daftar aplikasi terbaru.
Catatan: Anda juga dapat menggunakan
onRestoreInstanceState
metode ini tetapi saya merasa lebih mudah untuk mengembalikan instance dionCreate
.Ini lebih dari kemungkinan apa yang terjadi di aplikasi Anda. Pada beberapa perangkat aplikasi Anda dibongkar untuk membebaskan memori. Ya ada beberapa bendera yang membantu tetapi bendera tidak akan mengambil setiap nuansa aplikasi Anda dan bendera tidak akan membuat Anda tetap hidup selama berminggu-minggu seperti
onSaveInstanceState
kehendak. Anda harus kode resume sempurna dua minggu kemudian. Ini tidak akan menjadi tugas yang mudah untuk aplikasi yang kompleks tetapi kami ada di belakang Anda dan ada di sini untuk membantu.Semoga berhasil
sumber