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?


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.


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.


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


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();

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

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


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

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


-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);
}

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.