Android: aktivitas terbuka tanpa menyimpan ke dalam tumpukan

94

Saya memiliki 2 kegiatan: Utama dan Daftar.

Dari Utama Anda dapat membuka Daftar; dari Daftar Anda dapat membuka Utama.

Aku ingin itu sehingga setiap pembukaan Daftar tidak tidak bisa disimpan ke dalam 'sejarah'. Jadi, menekan kembali dari Utama tidak dapat kembali ke Daftar.

Apa itu mungkin?

realtebo
sumber
11
Jika 'list' mulai 'main' maka panggil finish()segera setelahnya startActivity(...). Dengan begitu, jika pengguna menekan KEMBALI dari 'utama' tidak akan ada yang kembali.
Squonk
ini untuk navigasi pemberitahuan tetapi konsepnya mungkin berlaku developer.android.com/guide/topics/ui/notifiers/…
Kevin Lee

Jawaban:

160

Saat memulai daftar Anda Activity, setel Intentbenderanya seperti ini:

Intent i = new Intent(...); // Your list's Intent
i.setFlags(i.getFlags() | Intent.FLAG_ACTIVITY_NO_HISTORY); // Adds the FLAG_ACTIVITY_NO_HISTORY flag
startActivity(i);

The FLAG_ACTIVITY_NO_HISTORYbendera menjaga baru Activitydari yang ditambahkan ke tumpukan sejarah.

NB: Seperti yang @Sam tunjukkan, Anda dapat menggunakan i.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);sebagai gantinya. Tidak ada perbedaan fungsional.

Eric
sumber
2
Sedikit komentar saja untuk metode ini: cara ini akan bekerja dengan sempurna jika hanya ada 2 Aktivitas. Tetapi jika daftar Aktivitas dapat meluncurkan Aktivitas lain (katakanlah Aktivitas ketiga), tekan tombol kembali di Aktivitas ketiga akan kembali ke Aktivitas utama dan bukan Aktivitas daftar
VinceFR
Memang. Sayangnya, tidak ada cara untuk menghindarinya. Tidak ada Intentbendera yang menyatakan "hanya menambah sejarah jika tidak kembali ke Activityasalnya".
Eric
1
tidak tetapi bendera FLAG_ACTIVITY_NEW_TASK akan melakukan pekerjaan itu, daftar Aktivitas akan ditambahkan ke riwayat tetapi selalu di atas, jadi pers kembali dari Aktivitas utama tidak akan menampilkan daftar Aktivitas
VinceFR
7
Apakah ada alasan tertentu Anda digunakan setFlags()dengan getFlags()bukan Intent.addFlags()?
Sam
1
@VinceFR itulah yang saya inginkan! a -> b -> c dan langsung kembali ke c-
realtebo
90

Di file manifes tambahkan:

android:noHistory="true" 

ke aktivitas yang tidak ingin Anda simpan di tumpukan.

Marcin S.
sumber
apakah ada perbedaan dari memulai aktivitas dengan flag no_history?
realtebo
1
Seperti yang Anda katakan dalam pertanyaan Anda "setiap pembukaan daftar TIDAK disimpan ke dalam 'riwayat'" Oleh karena itu, setiap kali Anda membuka aplikasi Anda lagi itu akan membawa Anda ke aktivitas utama
Marcin S.
@Rumahsakitpmc. ketika aplikasi tidak ada dalam daftar aplikasi terbaru, itu tidak berfungsi. Bisakah Anda menjelaskan mengapa hal ini terjadi
Ajit Kumar Dubey
1
Jadi apa perbedaan antara 2 pendekatan tersebut (manifest dan flag)?
pumbosha
Pendekatan @pumbosha Manifes akan selalu meninggalkan aktivitas di luar sejarah. Pendekatan bendera memungkinkan Anda mengontrol perilaku itu pada waktu proses.
John Crawford
27

Gunakan tugas baru dengan membersihkan. Ini berfungsi dalam kasus saya ketika opsi lain tidak.

intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);

Hapus seluruh tumpukan riwayat dan mulai aktivitas baru di Android

Kalel Wade
sumber
1
Ini akan bagus, tetapi adakah cara untuk menghentikan animasi "mengubah tugas" sistem? Sayangnya, menambahkan FLAG_ACTIVITY_NO_ANIMATION tidak mencegahnya!
androidguy
ini berdampak pada kecepatan aplikasi?
Acauã Pitta
23

Tampaknya, jika Anda memanggil finish () pada aktivitas Anda tepat setelah Anda membuka yang lain, aktivitas yang sudah selesai akan dihapus dari tumpukan.

sebagai contoh:

Intent intent = new Intent(this, NextActivity.class);
startActivity(intent);
finish();
dac2009
sumber
Jika ponsel Anda tidak begitu cepat, Anda akan melihat aktivitas sebelumnya bergerak.
Nolan
@Nolan itu hanya jika Anda selesai sebelum Anda memulai aktivitas
Henrik Bøgelund Lavstsen
7

Dalam kasus khusus saya FLAG_ACTIVITY_NO_HISTORYtidak berhasil. Tidak ada yang berhasil FLAG_ACTIVITY_NEW_TASKatau FLAG_ACTIVITY_CLEAR_TASKsendirian.

Namun FLAG_ACTIVITY_NEW_TASKdan FLAG_ACTIVITY_CLEAR_TASKbersama-sama berhasil.

Intent intent = new Intent(FooActivity.this, MainActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);
Fred
sumber
4

Jawaban terlambat, tetapi menambah kedalaman jawaban lain. Semuanya bermuara pada apa yang Anda inginkan terjadi dengan aktivitas lain yang dimulai dari aktivitas itu

Opsi 1 - Hanya aktivitas ini yang seharusnya tidak memiliki riwayat aktivitas panggilan

Kemudian lakukan saja:

Intent i = new Intent(...);
i.addFlag(Intent.FLAG_ACTIVITY_NO_HISTORY);
startActivity(i);

Opsi 2 - Semua aktivitas yang dimulai dari aktivitas spesifik tersebut tidak boleh memiliki riwayat

Kemudian tambahkan manifes aktivitas panggilan:

android:noHistory="true" 

Tetapi jika Anda ingin memiliki riwayat dalam aktivitas baru, Anda harus menghapus bendera secara manual:

Intent i = new Intent(...);
i.removeFlag(Intent.FLAG_ACTIVITY_NO_HISTORY);
startActivity(i);

Harapan yang menjelaskan jawaban lain :)

Miku
sumber
3

Hanya ingin menambahkan cara untuk melakukan ini di Kotlin:

val i = Intent(this, LogInActivity::class.java)
startActivity(i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK))
Devin B
sumber
2
Lebih dari cara Kotlin: Intent(this, MainActivity::class.java).apply { addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK) }.also { startActivity(it) }
4ndro1d
2

Coba FLAG_ACTIVITY_CLEAR_TOP jika aktivitas sudah berjalan:

Intent intent = new Intent(this, MyActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
cinta hidup
sumber
-4

Bisakah Anda tidak menimpa tombol kembali pada aktivitas tertentu untuk menghentikan fungsionalitas 'kembali'?

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if (keyCode == KeyEvent.KEYCODE_BACK) {

        return true;
    }
    return super.onKeyDown(keyCode, event);
}
Broak
sumber
6
Jangan lakukan ini. Dapat diterima untuk mencegat BACK untuk tujuan tertentu, tetapi melakukannya murni untuk menggunakan pers BACK secara diam-diam dan mencegah penghentian Activitybukanlah praktik yang baik.
Squonk
1
Setuju sepenuhnya ^ hanya sebuah pilihan.
Broak
1
Ada OnBackPresseduntuk itu.
Fred