Android: membersihkan kembali tumpukan

Di Android, saya memiliki beberapa tindakan, katakanlah, A, B, C.

Di A, saya menggunakan kode ini untuk membuka B:

 Intent intent = new Intent(this, B.class); startActivity(intent); 

Di B, saya menggunakan kode ini untuk membuka C:

 Intent intent = new Intent(this, C.class); startActivity(intent); 

Ketika pengguna menekan tombol di C, saya ingin kembali ke A dan menghapus tumpukan kembali (tutup B dan C). Oleh karena itu, ketika pengguna menekan tombol kembali B dan C tidak ditampilkan, saya telah mencoba yang berikut:

 Intent intent = new Intent(this, A.class); intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity(intent); 

Tetapi B dan C masih ditampilkan jika saya menggunakan tombol kembali ketika saya kembali ke Sesi A. Bagaimana saya bisa menghindari ini?

288
26 апр. ditetapkan oleh Martin pada 26 April 2011-04-26 21:03 '11 pada 21:03 2011-04-26 21:03
@ 32 jawaban
  • 1
  • 2

Coba tambahkan FLAG_ACTIVITY_NEW_TASK seperti yang dijelaskan dalam dokumen untuk FLAG_ACTIVITY_CLEAR_TOP :

Mode peluncuran ini juga dapat digunakan untuk efek yang baik dalam kombinasi dengan FLAG_ACTIVITY_NEW_TASK: jika Anda menggunakan aktivitas root dari tugas, itu akan memulai contoh tugas saat ini di latar depan, dan kemudian menghapus status akarnya. Ini sangat berguna, misalnya, ketika memulai aktivitas dari manajer notifikasi.

Jadi, kode Anda untuk menjalankan A adalah sebagai berikut:

 Intent intent = new Intent(this, A.class); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intent); finish(); // call this to finish the current activity 
393
26 апр. Balas diberikan oleh Jake Basile 26 Apr 2011-04-26 21:10 '11 pada jam 9:10 malam 2011-04-26 21:10
 intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); startActivity(intent); 
134
03 дек. balasan diberikan diesel 03 des. 2012-12-03 23:10 '12 pada 23:10 2012-12-03 23:10

Cara menambahkan ke file manifes untuk kegiatan terkait:

 android:noHistory="true" 

menentukan aktivitas B dan C? Mereka tidak akan ditambahkan ke belakang. Tidak yakin apa yang Anda inginkan.

72
28 июня '11 в 23:38 2011-06-28 23:38 jawabannya diberikan Cirrus 28 Juni '11 di 23:38 2011-06-28 23:38

Sudah lama mengganggu saya. Akhirnya, saya memutuskan untuk melakukan ini:

Dalam penggunaan fragmen:

 Intent intent = new Intent(view.getContext(), A.class); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intent); 

Dalam aksi, gunakan (tambahkan flag maksud lain Intent.FLAG_ACTIVITY_CLEAR_TASK dibandingkan dengan fragmen):

 Intent intent = new Intent(this, MainActivity.class); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intent); 
53
11 июля '14 в 10:46 2014-07-11 10:46 jawabannya diberikan oleh Geng Jiawen 11 Juli '14 pada 10:46 2014-07-11 10:46
  • Tambahkan android:launchMode="singleTop" ke elemen aktivitas manifes Anda untuk Aktivitas A
  • Kemudian gunakan intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP) dan intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) saat memulai Kegiatan A

Ini berarti bahwa ketika Anda memulai Kegiatan A, semua tugas di atasnya dihapus, jadi A adalah teratas. Tumpukan belakang baru dibuat menggunakan A di root, dan menggunakan singleTop memastikan bahwa Anda pernah menjalankan A sekali (karena A sekarang di atas, karena ..._CLEAR_TOP ).

28
26 апр. Balas diberikan oleh Joseph Earl pada 26 April 2011-04-26 21:35 '11 pada 21:35 2011-04-26 21:35

Mulai dari API 16 (Jelly Bean), Anda cukup memanggil finishAffinity() .

Sekarang Anda juga dapat memanggil ActivityCompat.finishAffinity(Activity activity) menggunakan pustaka kompatibilitas.

Pastikan untuk mengatur parameter taskAffinity dalam nama paket manifes yang unik untuk grup tindakan ini.

Lihat informasi tambahan:
http://developer.android.com/reference/android/support/v4/app/ActivityCompat.html#finishAffinity%28android.app.Activity%29

25
30 мая '13 в 1:58 2013-05-30 01:58 Jawaban diberikan oleh Daniel Schuler pada 30 Mei '13 pada 1:58 2013-05-30 01:58

Coba gunakan

 intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); 

dan tidak

 intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); 
14
16 мая '13 в 10:58 2013-05-16 10:58 Balas diberikan oleh Muhammad Aamir Ali pada 16 Mei13 pada 10:58 2013-05-16 10:58

Jika aplikasi Anda memiliki versi SDK minimum 16, Anda dapat menggunakan finishAffinity ()

Selesaikan tindakan ini, serta semua tindakan >

Ini adalah pekerjaan bagi saya. Pada layar "Pembayaran Pembayaran", hapus semua tindakan di tumpukan pengembalian,

  @Override public void onBackPressed() { finishAffinity(); startActivity(new Intent(PaymentDoneActivity.this,Home.class)); } 

http://developer.android.com/reference/android/app/Activity.html#finishAffinity%28%29

8
13 апр. Balas oleh Jaydeep purohit 13 Apr 2016-04-13 15:42 '16 pada 15:42 2016-04-13 15:42

Untuk penelitian selanjutnya, coba kode ini.

 Intent intent = new Intent(context, LoginActivity.class); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intent); finish(); 
7
17 мая '15 в 6:09 2015-05-17 06:09 jawabannya diberikan oleh GeetT 17 Mei '15 pada 6:09 2015-05-17 06:09

Seperti Kegiatan Menghapus Wakka dari Sejarah, ...


Tambahkan atribut android:noHistory="true" <activity> di AndroidManifest.xml sebagai berikut:

  <activity android:name=".MyActivity" android:noHistory="true"> </activity> 
6
22 авг. Jawaban yang diberikan oleh Richard Le Mesurier 22 Agustus 2012-08-22 17:58 '12 pada 17:58 2012-08-22 17:58

Gunakan finishAffinity (); dalam tugas C saat Anda menjalankan tugas A untuk menghapus operasi backstack.

6
15 дек. Jawabannya diberikan baswaraj 15 Des. 2016-12-15 17:49 '16 pada 17:49 2016-12-15 17:49

Gunakan kode ini untuk memulai aktivitas baru, dan tutup atau hancurkan semua tumpukan atau file htc lainnya.

 Intent intent = new Intent(this, MainActivity.class); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); startActivity(intent); 
4
10 марта '17 в 13:10 2017-03-10 13:10 jawabannya diberikan Pankaj Talaviya 10 Maret '17 pada 13:10 2017-03-10 13:10

Saya menemukan jawaban di sini agak menipu, karena kode dalam pertanyaan sumber tampaknya berfungsi dengan baik untuk saya?

Dengan A menjadi aktivitas root, dimulai dengan B atau C hanya dengan FLAG_ACTIVITY_CLEAR_TOP menghapus B dan C dari tumpukan belakang.

3
14 дек. Balas diberikan oleh ianjoyner 14 Des. 2011-12-14 14:15 '11 pada 14:15 2011-12-14 14:15

Di Cotlin, ini hampir sama dengan di Jawa. Hanya | simbol diganti oleh atau teks. Jadi, ada tertulis seperti-

 intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK or Intent.FLAG_ACTIVITY_NEW_TASK) 
3
23 янв. jawabannya diberikan Exigente05 23 Januari. 2019-01-23 23:59 '19 jam 11:59 malam 2019-01-23 23:59
 Use finishAffinity() to clear all backstack with existing one. Suppose, Activities A, B and C are in stack, and finishAffinity(); is called in Activity C, - Activity B will be finished / removing from stack. - Activity A will be finished / removing from stack. - Activity C will finished / removing from stack. 
3
28 окт. jawabannya diberikan oleh Firzan Shaikh pada 28 Oktober. 2017-10-28 09:53 '17 pada 9:53 2017-10-28 09:53

Sepertinya saya bahwa Anda perlu memulai Activity C dengan Activity B menggunakan startActivityForResult() . Ketika Anda mengklik tombol di Activity C , panggil setResult(RESULT_OK) dan finish() , sehingga Activity C berakhir. Di Activity B Anda dapat menanggapi onActivityResult() dengan juga memanggil finish() pada diri Anda sendiri, dan kemudian Anda kembali ke Activity A

2
26 апр. jawabannya diberikan oleh maximus 26 Apr 2011-04-26 21:06 '11 pada 21:06 2011-04-26 21:06

Saya menemukan solusi menarik yang dapat membantu. Saya melakukan ini di onBackPressed() .

 finishAffinity(); finish(); 

FinishAffinity menghapus koneksi dari aksi yang ada ke tumpukannya. Dan selesai akan membantu Anda keluar dari pelajaran ini. Yang akibatnya berhenti dari aplikasi.

2
12 сент. Jawaban diberikan oleh Sujit Royal pada 12 September . 2018-09-12 13:01 '18 pukul 13:01 2018-09-12 13:01

Intent.FLAG_ACTIVITY_CLEAR_TOP tidak akan berfungsi dalam kasus ini. Gunakan (Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK)

Lihat dokumentasi ini untuk detailnya.

2
01 апр. jawabannya diberikan oleh Ashish Saini 01 Apr. 2016-04-01 10:47 '16 pada 10:47 2016-04-01 10:47

logout.addFlags (Intent.FLAG_ACTIVITY_CLEAR_TASK); logout.addFlags (Intent.FLAG_ACTIVITY_NEW_TASK);

1
26 сент. Balas diberikan oleh Abhijeet pada 26 sept. 2013-09-26 17:30 '13 pukul 5:30 sore 2013-09-26 17:30

Saya mencoba semua solusi, dan tidak ada yang bekerja secara individual untuk saya. Solusi saya:

Deklarasikan Activity A sebagai SingleTop menggunakan [android:launchMode="singleTop"] di manifes Android.

Sekarang tambahkan flag berikut ketika menjalankan A dari mana saja. Dia akan membersihkan tumpukan.

 Intent in = new Intent(mContext, A.class); in.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK ); startActivity(in); finish(); 
1
19 апр. Jawabannya diberikan Tarun pada 19 April. 2016-04-19 08:41 '16 pada 8:41 pagi 2016-04-19 08:41

Contoh ini dapat digunakan untuk memanggil Activity A dari Activity C

Intent loout = new Intent(context, LoginActivity.class); loout.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); context.startActivity(loout);

1
12 июля '16 в 14:55 2016-07-12 14:55 jawabannya diberikan oleh Vipin Yadav 12 Juli '16 pada 14:55 2016-07-12 14:55

Dalam manifes

 android:launchMode="singleTask" 

dan

 intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity(intent); 
0
27 сент. jawabannya diberikan blackjack 27 september. 2016-09-27 13:41 '16 pada pukul 1:41 sore 2016-09-27 13:41

Atau tambahkan ke Activity B dan Activity C

 android:noHistory="true" 

atau Override onBackPressed untuk menghindari penekanan return .

 @Override public void onBackPressed() { return; } 
0
01 апр. Jawabannya diberikan oleh Renjith JR 01 Apr. 2016-04-01 12:27 '16 jam 12:27 malam 2016-04-01 12:27

Ini bekerja untuk saya dengan onBackPressed:

 public void onBackPressed() { Intent intent = new Intent(ImageUploadActivity.this, InputDataActivity.class); Intent myIntent = new Intent(this, ImageUploadActivity.class); myIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intent); finish(); } 
0
12 марта '18 в 14:56 2018-03-12 14:56 Jawaban diberikan oleh PhilipS pada 12 Maret '18 pukul 14:56 2018-03-12 14:56

Gunakan metode setFlags () untuk membersihkan sisi belakang, buka semua tindakan dan jalankanActvity Anda

 Intent intent = new Intent(getApplicationContext(), yourActivity.class); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); startActivity(intent); 
0
07 сент. Jawaban diberikan oleh Pankaj Talaviya 07 Sep 2017-09-07 08:03 '17 pada 8:03 2017-09-07 08:03

Tambahkan NO Riwayat Tandai dalam maksud.

Di aktivitas B, jalankan tindakan C, seperti yang ditunjukkan di bawah → → →

 Intent intent = new Intent(this, C.class); intent.setFlags(intent.getFlags() | Intent.FLAG_ACTIVITY_NO_HISTORY); startActivity(intent); finish(); 
0
10 июня '15 в 9:15 2015-06-10 09:15 jawabannya diberikan oleh Arun Sharma pada 10 Juni '15 jam 9:15 2015-06-10 09:15

Saya menelepon activity_name.this.finish() setelah memulai maksud baru, dan itu berhasil untuk saya.

 I tried "FLAG_ACTIVITY_CLEAR_TOP" and "FLAG_ACTIVITY_NEW_TASK" 

Tetapi itu tidak berfungsi untuk saya ... Saya tidak menyarankan solusi ini untuk digunakan, tetapi jika flag instalasi tidak bekerja untuk Anda, Anda dapat mencobanya. Tapi saya tetap merekomendasikan untuk tidak menggunakannya.

0
31 окт. Jawabannya diberikan Swap-IOS-Android 31 Oktober. 2014-10-31 15:08 '14 pada 15:08 2014-10-31 15:08

Selain FLAG_ACTIVITY_CLEAR_TOP Anda dapat mencoba menambahkan Intent.FLAG_ACTIVITY_SINGLE_TOP :

intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

0
26 апр. jawabannya diberikan binnyb 26 apr. 2011-04-26 21:11 '11 pada 21:11 2011-04-26 21:11

Kode ini berfungsi dengan benar. Saya mencoba siklus hidup aplikasi sampel.

Saya tidak memiliki B dan C di tumpukan belakang setelah memulai aktivitas A dengan bendera FLAG_ACTIVITY_CLEAR_TOP

0
28 янв. Sathesh menjawab 28 Jan 2013-01-28 12:05 '13 pada 12:05 2013-01-28 12:05
  intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP); 
0
19 февр. Jawaban yang diberikan oleh Mujeeb Rahaman T 19 Feb. 2019-02-19 14:33 '19 pada 14:33 2019-02-19 14:33
  • 1
  • 2