Aplikasi memulai ulang alih-alih resume

194

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 Activitydengan aksi android.intent.action.MAINdan 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 Activityterlepas 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 Activitytidak 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.

Graeme
sumber
1
Ini mungkin tampak seperti pertanyaan sepele untuk ditanyakan, tetapi apakah Anda menetapkan "Don't keep activities" menjadi kenyataan dalam mengembangkan opsi untuk Xoom?
Andrew Schuster
Tidak (saya berharap! :)) - Saya telah mencatat siklus hidup setiap Aktivitas dan Aktivitas di latar belakang karena masih tersedia (Aktivitas tersebut dihentikan - tidak dihancurkan). OS tampaknya memanggil finish()mereka dalam kasus di mana ia memulai yang pertama Activitykembali daripada melanjutkannya.
Graeme
1
Jika Anda telah menekan tombol beranda dan kemudian mengklik ikon peluncur, perilaku resume adalah default untuk android yang mungkin Anda ketahui. Namun jika Anda menekan tombol kembali untuk kembali ke layar beranda sebagian besar ponsel akan menyelesaikan () aplikasi. Apakah mungkin metode apa pun yang Anda gunakan untuk keluar dari aplikasi berbeda pada perangkat yang berbeda? Bisakah Anda keluar dari onKeyUpEvent untuk memeriksa apakah ada yang tidak menangani tombol hard / sof secara aneh?
Nick Cardoso
2
Tidak - Saya yakin akan masalah yang disebutkan di atas. Menggunakan rumah untuk meletakkan aplikasi di latar belakang (bukan kembali, yang Anda benar akan menyelesaikan () Aktivitas). Mungkin di Xoom untuk melanjutkan aplikasi dari Daftar Tugas (hanya bukan dari Peluncur) sehingga backstack pasti tidak terbunuh.
Graeme
1
Jawab dengan karunia adalah cara untuk memperbaiki masalah yang dijelaskan dalam pertanyaan. Menandai jawaban saya sendiri sebagai "benar" karena meskipun kadang-kadang masalah disebabkan oleh bug aplikasi di peluncur (sebagaimana dicatat dalam jawabannya) masalah khusus saya disebabkan oleh pengalihan tugas. Solusi untuk kedua masalah tersebut diperbaiki oleh solusinya.
Graeme

Jawaban:

238

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:

    if (!isTaskRoot()
            && getIntent().hasCategory(Intent.CATEGORY_LAUNCHER)
            && getIntent().getAction() != null
            && getIntent().getAction().equals(Intent.ACTION_MAIN)) {

        finish();
        return;
    }
starkej2
sumber
4
Sejauh ini ini bekerja untuk saya tanpa efek samping yang merugikan sejauh ini. Berdasarkan asumsi logis, saya tidak melihat alasan mengapa itu tidak valid.
javahead76
3
Saya pikir ini adalah cara yang tepat untuk mengatasi bug ini. Bekerja untukku.
Sokolov
3
melakukan pekerjaan untuk saya, diverifikasi pada sekitar 8 perangkat yang berbeda. Terima kasih banyak!
shaya ajzner
3
WOOOOOW memperbaiki masalah saya ive telah mencari perbaikan selama 2 jam terakhir
Jean Raymond Daher
2
Terima kasih @ starkej2. Bekerja seperti pesona.
Rajeev Sahu
54

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:

  1. Unduh dari play store (atau sideload apk)
  2. Luncurkan aplikasi dari dialog play store: aktivitas A muncul [tumpukan tugas: A]
  3. Arahkan ke aktivitas B [tumpukan tugas: A -> B]
  4. Tekan tombol 'Rumah'
  5. Luncurkan aplikasi dari laci aplikasi: aktivitas A muncul! [tumpukan tugas: A -> B -> A] (pengguna dapat menekan tombol 'Kembali' untuk mendapatkan aktivitas 'B' dari sini)

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':

Filter maksud semacam ini menyebabkan ikon dan label untuk aktivitas ditampilkan di peluncur aplikasi, memberi pengguna cara untuk meluncurkan aktivitas dan kembali ke tugas yang dibuatnya kapan saja setelah diluncurkan.

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.

                    /**
     * Ensure the application resumes whatever task the user was performing the last time
     * they opened the app from the launcher. It would be preferable to configure this
     * behavior in  AndroidMananifest.xml activity settings, but those settings cause drastic
     * undesirable changes to the way the app opens: singleTask closes ALL other activities
     * in the task every time and alwaysRetainTaskState doesn't cover this case, incredibly.
     *
     * The problem happens when the user first installs and opens the app from
     * the play store or sideloaded apk (not via ADB). On this first run, if the user opens
     * activity B from activity A, presses 'home' and then navigates back to the app via the
     * launcher, they'd expect to see activity B. Instead they're shown activity A.
     *
     * The best solution is to close this activity if it isn't the task root.
     *
     */

    if (!isTaskRoot()) {
        finish();
        return;
    }

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.)

Ehmer kaya
sumber
4
"Masalahnya hilang begitu aplikasi dimulai dari peluncur." Ini adalah bagian paling aneh dan saya mengamatinya juga - membunuh aplikasi setelah peluncuran pertama, itu mulai berperilaku normal lagi. Bug yang aneh. Terima kasih telah menganalisisnya secara menyeluruh dan untuk solusinya.
Oded
11
Catatan: Anda bisa membuat masalah untuk mereproduksi lagi setelah awalnya membersihkannya (dengan "memulai-dingin" seperti yang Anda gambarkan) dengan menggunakan "Buka" dari halaman Google Play aplikasi, bahkan jika Anda menginstal APK melalui Android Studio . Saya menemukan ini sangat berguna untuk memverifikasi perbaikan berhasil.
Oded
Penjelasan yang bagus!
karanatwal.github.io
Terima kasih atas penjelasan ini :)
AndroidEnthusiast
2
Ini terjadi dengan banyak aplikasi. Foto Google menjadi yang utama yang saya uji.
Raghubansh Mani
19

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 Activityatau, jika Taskdimulai oleh peluncuran sebelumnya terbuka, itu membawanya ke depan. Dengan kata lain - Jika pada tahap apa pun dalam navigasi Anda membuat yang baru Taskdan finishyang lama, peluncur sekarang tidak akan lagi melanjutkan aplikasi Anda.

Jika anggapan itu benar, saya cukup yakin bahwa itu adalah bug, mengingat masing-masing Taskdalam 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:

i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK );

Sementara itu cukup jelas FLAG_ACTIVITY_NEW_TASKmenciptakan yang baru Task, 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:

i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)

Layar splash saya mulai "utama" Activitydi aplikasi saya menggunakan bendera di atas. Lagipula, Jika saya telah "me-restart" aplikasi saya dan Activitymasih berjalan, saya lebih suka menyimpan informasi keadaan itu.

Anda akan melihat dalam dokumentasi yang tidak menyebutkan memulai yang baru Task:

Jika diatur, dan aktivitas yang diluncurkan sudah berjalan dalam tugas saat ini, maka alih-alih meluncurkan contoh baru dari aktivitas itu, semua aktivitas lain di atasnya akan ditutup dan Tujuan ini akan dikirim ke (sekarang aktif atas) aktivitas lama sebagai Intent baru.

Misalnya, pertimbangkan tugas yang terdiri dari kegiatan: A, B, C, D. Jika D memanggil startActivity () dengan Intent yang memutuskan ke komponen aktivitas B, maka C dan D akan selesai dan B menerima Intent yang diberikan , menghasilkan tumpukan sekarang menjadi: A, B.

Contoh aktivitas B yang sedang berjalan saat ini dalam contoh di atas akan menerima maksud baru yang Anda mulai di sini dalam metode onNewIntent (), atau diselesaikan sendiri dan dimulai kembali dengan maksud baru. Jika telah menyatakan mode peluncurannya menjadi "banyak" (default) dan Anda belum menetapkan FLAG_ACTIVITY_SINGLE_TOP dengan maksud yang sama, maka itu akan selesai dan dibuat kembali; untuk semua mode peluncuran lain atau jika FLAG_ACTIVITY_SINGLE_TOP diatur maka Intent ini akan dikirimkan ke instanceN saat ini onNewIntent ().

Mode peluncuran ini juga dapat digunakan untuk efek yang baik dalam hubungannya dengan FLAG_ACTIVITY_NEW_TASK: jika digunakan untuk memulai aktivitas root dari suatu tugas, itu akan membawa setiap instance yang sedang berjalan dari tugas itu ke latar depan, dan kemudian menghapusnya ke status root. Ini sangat berguna, misalnya, ketika meluncurkan aktivitas dari manajer notifikasi.

Jadi, saya punya situasi seperti yang dijelaskan di bawah ini:

  • Adiluncurkan Bdengan FLAG_ACTIVITY_CLEAR_TOP, Aselesai.
  • Bingin memulai kembali layanan sehingga mengirim pengguna Ayang memiliki logika memulai kembali layanan dan UI (Tidak ada bendera).
  • Adiluncurkan Bdengan FLAG_ACTIVITY_CLEAR_TOP, Aselesai.

Pada tahap ini FLAG_ACTIVITY_CLEAR_TOPflag kedua sedang restart Byang ada di tumpukan tugas. Saya berasumsi ini harus menghancurkan Taskdan memulai yang baru, menyebabkan masalah saya, yang merupakan situasi yang sangat sulit dikenali jika Anda bertanya kepada saya!

Jadi, jika semua anggapan saya benar:

  • The Launchersatunya resume awalnya dibuat Task
  • FLAG_ACTIVITY_CLEAR_TOPakan, jika restart hanya yang tersisa Activity, juga membuat ulang yang baruTask
Graeme
sumber
FLAG_ACTIVITY_CLEAR_TOP tidak membuat tugas baru atau memulai kembali aktivitas yang Anda coba mulai jika itu satu-satunya Aktivitas yang tersisa. "Jika disetel, dan aktivitas yang diluncurkan sudah berjalan dalam tugas saat ini, maka alih-alih meluncurkan instance baru dari aktivitas itu, semua aktivitas lain di atasnya akan ditutup dan Tujuan ini akan dikirim ke (sekarang di atas) aktivitas lama sebagai Intent baru. "
starkej2
2
Saya menyadari itu tidak dimaksudkan untuk - tetapi melalui coba-coba ini terjadi pada kasus saya. Menghapus bendera ini memperbaiki masalah.
Graeme
Ini tidak membuat resume yang sempurna di semua perangkat dalam semua kondisi.
danny117
Menghapus bendera memperbaiki masalah bagi saya. Terima kasih
Sealer_05
Saya memang memiliki skenario splash screen / layar utama tetapi saya tidak menggunakan flag apa pun untuk transisi dari splash ke main, masih masalah ini dapat direproduksi oleh saya - solusi ini tidak berfungsi untuk saya.
ror
12

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 , launchModediatur ke singleInstance( android:launchMode="singleInstance"). Menghapus launchModeatribut memperbaiki masalah saya.

Ali
sumber
Memang, ini juga membantu saya. Saya menemukan jawaban ini dari pertanyaan SO lain untuk membantu: stackoverflow.com/a/21622266/293280 . Dan ini menulis tentang berbagai jenis launchModenilai: inthecheesefactory.com/blog/…
Joshua Pinter
Perbaikan ini berhasil untuk saya! Menambahkan ini bukan dalam manifes tetapi dalam atribut aktivitas di atas kelas aktivitas utama.
Calin Vlasin
@CalinVlasin dapatkah Anda menunjukkan dengan tepat bagaimana Anda menggunakan launchMode? dimana kamu meletakkannya Saat ini saya memilikinya seperti ini tetapi menyebabkan masalah: <activity android: name = ". UI.landing.MyActivity" android: configChanges = "locale | layoutDirection" android: launchMode = "singleTop" android: windowSoftInputMode = "stateAlwaysHidden | AdjustResize ">
j2emanue
Ini juga masalah saya. Saya pikir ini harus digunakan bersamaan dengan jawaban yang diterima (! IsTaskRoot ...
behelit
1

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 ...

ptp
sumber
Entah bagaimana, tapi ini HIDUP pada perangkat saya.
realPro
0

Solusi ini bekerja untuk saya:

    @Override
    public boolean onKeyUp(int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_BACK) {
            Intent startMain = new Intent(Intent.ACTION_MAIN);
            startMain.addCategory(Intent.CATEGORY_HOME);
            startMain.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            startActivity(startMain);
            return false;
        }
        else
            return super.onKeyUp(keyCode, event);
    }

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.

Russell Chisholm
sumber
Trik yang menarik tetapi tidak menyelesaikan masalah seperti yang disebutkan. Sangat berguna untuk masalah / pertanyaan lain sekalipun.
Graeme
Tombol kembali memiliki tujuan tertentu dan pengguna mengharapkan tombol kembali untuk melakukan apa yang seharusnya dilakukan. Mengesampingkannya dengan cara apa pun adalah salah dan, menurut saya, sangat tidak profesional.
Bugs Terjadi
-1

Saya memiliki masalah yang sama, penyebabnya adalah:

(Kode Kotlin, dalam MainActivity)

override fun onBackPressed() {
    finish()
}

Jadi ketika menavigasi ke MainActivity saya dari LoginActivity saya, saya menggunakan ini:

    val intent = Intent(this, MainActivity::class.java)
    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)
    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK)
    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
    startActivity(intent)

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.

Christer
sumber
-2

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.

Arun Antony
sumber
-8

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 onSaveInstanceStatesehingga 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.

@Override
    public void onSaveInstanceState(Bundle savedInstanceState) {
        super.onSaveInstanceState(savedInstanceState);
        // save the current camera position;
        if (mMap != null) {
            savedInstanceState.putParcelable(CAMERA_POSITION,
                    mMap.getCameraPosition());
        }
    }



@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // get the exact camera position if the app was unloaded.
        if (savedInstanceState != null) {
            // get the current camera position;
            currentCameraPosition = savedInstanceState
                    .getParcelable(CAMERA_POSITION);
        }

Catatan: Anda juga dapat menggunakan onRestoreInstanceStatemetode ini tetapi saya merasa lebih mudah untuk mengembalikan instance di onCreate.

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 onSaveInstanceStatekehendak. 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

danny117
sumber
Ini bukan karena masalah memori yang umum atau kondisi "keadaan jeda" default. Saya telah mencoba aplikasi saya di banyak perangkat (beberapa dengan memori besar beberapa dengan memori lebih rendah).
Graeme
Inilah sebabnya mengapa Anda menyimpan data tahan di onPauseSaya telah mencoba aplikasi saya untuk melanjutkan kembali sejauh dua minggu di telepon yang saya gunakan setiap hari dan biarkan saya memberi tahu Anda setelah dua minggu metode onCreate dipanggil dan os lewat di bundel yang saya simpan di onSaveSessionState dan saya menggunakan data dalam bundel untuk membuat aktivitas saya muncul tepat ketika saya meninggalkannya. Jadi ini baru tiga hari sejak jawaban saya jadi tidak mungkin Anda bisa menyelesaikan tes dua minggu. Ringkasan: Aplikasi dapat ditutup kapan saja di latar belakang.
danny117
@ danny117 Saya tidak berpikir Anda memiliki pemahaman yang akurat tentang masalah yang dialami Graeme
starkej2
Saya mengerti masalah Graeme. Pada beberapa perangkat melanjutkan panggilan aplikasi onCreate. Kedengarannya persis seperti HTC EVO (Gingerbread) saya yang akan mematikan aplikasi hanya untuk memutar layar. Lihatlah dokumen yang dikatakannya sehingga aplikasi dapat dipulihkan di onCreate developer.android.com/reference/android/app/…
danny117
@ danny117 itu benar, tetapi masalah yang dia alami tidak terkait dengan satu aktivitas yang sedang dibuat kembali ketika aplikasi dilanjutkan (yang diharapkan), tetapi aktivitas yang salah sedang dimulai
starkej2