Bagaimana cara membawa aktivitas ke latar depan (top of stack)?

91

Di Android, saya mendefinisikan aktivitas ExampleActivity.

Ketika aplikasi saya diluncurkan, sebuah instance dari A-Activity ini dibuat, katakanlah A. Ketika pengguna mengklik tombol A, instance lain dari B-Activity, B dibuat. Sekarang tumpukan tugasnya adalah BA, dengan B di atas. Kemudian, pengguna mengklik tombol di B, instance C-Activity lain, dan C dibuat. Sekarang tumpukan tugas adalah CBA, dengan C di atas.

Sekarang, ketika pengguna mengklik tombol pada C, saya ingin aplikasi membawa A ke latar depan, yaitu membuat A berada di atas tumpukan tugas, ACB.

Bagaimana saya bisa menulis kode untuk mewujudkannya?

pengguna256239
sumber

Jawaban:

109

Anda dapat mencoba ini FLAG_ACTIVITY_REORDER_TO_FRONT(dokumen menjelaskan dengan tepat apa yang Anda inginkan)

Reno
sumber
3
Menurut saya seharusnya FLAG_ACTIVITY_SINGLE_TOP .
26
@ user942821 FLAG_ACTIVITY_SINGLE_TOPtidak akan membantu di sini. Saat ActivityC berada di puncak tumpukan dan memanggil startActivity()untuk meluncurkan ActivityA, meskipun Anda menyetelnya FLAG_ACTIVITY_SINGLE_TOPmasih akan membuat instance baru dari ActivityA. FLAG_ACTIVITY_SINGLE_TOPhanya mencegah pembuatan instance baru jika Anda mencoba meluncurkan aktivitas yang sudah ada di bagian atas tumpukan . Dalam hal ini, ActivityA tidak berada di bagian atas tumpukan, jadi Android membuat instance baru.
David Wasser
6
Hebat! Digunakan (Intent.FLAG_ACTIVITY_REORDER_TO_FRONT | Intent.FLAG_ACTIVITY_CLEAR_TOP)untuk menghapus riwayat apa pun setelah diberikan Activity.
shkschneider
10
FLAG_ACTIVITY_REORDER_TO_FRONT diabaikan jika Anda juga menentukan FLAG_ACTIVITY_CLEAR_TOP. Periksa dokumentasinya.
Kris Subramanian
3
intent.addFlags (Intent.FLAG_ACTIVITY_REORDER_TO_FRONT | Intent.FLAG_ACTIVITY_SINGLE_TOP); Ini akan bekerja dengan baik jika Anda ingin membawa aktivitas Anda di depan dengan sesi pengguna jika sudah di atas backstack tetapi tidak di depan.
Hassan Jamil
64

Cara terbaik yang saya temukan untuk melakukan ini adalah dengan menggunakan maksud yang sama seperti yang digunakan layar beranda Android - Peluncur aplikasi.

Sebagai contoh:

Intent i = new Intent(this, MyMainActivity.class);
i.setAction(Intent.ACTION_MAIN);
i.addCategory(Intent.CATEGORY_LAUNCHER);
startActivity(i);

Dengan cara ini, aktivitas apa pun dalam paket saya yang terakhir digunakan oleh pengguna dibawa kembali ke depan lagi. Saya menemukan ini berguna dalam menggunakan PendingIntent layanan saya untuk membuat pengguna kembali ke aplikasi saya.

greg7gkb
sumber
2
Terima kasih banyak untuk potongan kode itu. Saya membuang waktu berjam-jam mencoba membuatnya berfungsi dengan baik.
PakitoV
3
atau tanpa ComponentName dan setComponent, tetapi dengan Intent baru (this, MyMainActivity.class)
Tima
3
Aneh karena ini adalah satu-satunya hal yang berhasil untuk saya; bendera pengaturan tidak berfungsi dan selalu membuat ulang aktivitas.
Steven Huang
5
Ketika saya membaca jawaban ini dan komentarnya, jelas bahwa kami memiliki kesalahpahaman. Pertanyaan asli menanyakan tentang bagaimana mengatur ulang Activitydalam tumpukan tugas. OP dengan jelas menyatakan bahwa dia ingin pindah ActivityAdari bawah tumpukan ke atas tumpukan (yaitu: dia ingin menyusun ulang ActivityA ke depan tumpukan tugas ). Jawaban ini tidak akan berhasil. Jawaban ini adalah jawaban untuk pertanyaan "Bagaimana cara membawa aplikasi saya (tumpukan tugas) dari latar belakang ke latar depan?" Itu adalah pertanyaan yang sama sekali berbeda dari pertanyaan awal OP.
David Wasser
3
Juga tombol upvote mengatakan "Jawaban ini membantu" bukan "jawaban ini membantu op" - dia sudah memiliki "tanda terima" untuk situasi ini. Jelas saya tidak tahu apa yang membantu untuk op, dan IMHO downvoting jawaban berdasarkan tebakan saya apa yang membantu untuk op itu salah.
Boris Treukhov
28

Berikut adalah contoh kode bagaimana Anda dapat melakukannya:

Intent intent = getIntent(getApplicationContext(), A.class)

Ini akan memastikan bahwa Anda hanya memiliki satu contoh aktivitas di tumpukan.

private static Intent getIntent(Context context, Class<?> cls) {
    Intent intent = new Intent(context, cls);
    intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
    return intent;
}
Jan-Terje Sørensen
sumber
11

FLAG_ACTIVITY_REORDER_TO_FRONT : Jika disetel dalam Intent yang diteruskan ke Context.startActivity (), tanda ini akan menyebabkan aktivitas yang diluncurkan dibawa ke depan tumpukan riwayat tugasnya jika sudah berjalan.

Intent i = new Intent(context, AActivity.class);
i.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
startActivity(i);
FunGapApp
sumber
4

Saya pikir kombinasi Intentbendera harus melakukan triknya. Secara khusus, Intent.FLAG_ACTIVITY_CLEAR_TOPdan Intent.FLAG_ACTIVITY_NEW_TASK.

Tambahkan tanda ini ke maksud Anda sebelum memanggil startActvity.

Al.
sumber
2

i.setFlags(Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT);

Catatan Mode peluncuran aktivitas rumah Anda harus single_task

sujith s
sumber
1

Secara umum menurut saya metode pengelolaan kegiatan ini tidak disarankan. Masalah dengan mengaktifkan kembali aktivitas dua Langkah ke bawah dalam Tumpukan adalah bahwa aktivitas ini kemungkinan besar telah dimatikan. Saran saya untuk mengingat keadaan aktivitas Anda dan meluncurkannyastartActivity ()

Saya yakin Anda telah melihat halaman ini tetapi untuk kenyamanan Anda tautan ini

Segfault
sumber
0

Jika Anda ingin membawa aktivitas ke puncak tumpukan saat mengklik Notifikasi, Anda mungkin perlu melakukan hal berikut agar FLAG_ACTIVITY_REORDER_TO_FRONT berfungsi:

Solusi bagi saya untuk ini adalah membuat penerima siaran yang mendengarkan tindakan siaran yang dipicu pemberitahuan. Pada dasarnya:

  1. Notifikasi memicu tindakan siaran dengan tambahan nama aktivitas yang akan diluncurkan.

  2. Penerima siaran menangkap ini saat notifikasi diklik, lalu membuat maksud untuk meluncurkan aktivitas itu menggunakan flag FLAG_ACTIVITY_REORDER_TO_FRONT

  3. Aktivitas dibawa ke puncak tumpukan aktivitas, tidak ada duplikat.

sakis kaliakoudas
sumber
-2

jika Anda menggunakan "Google Cloud Message" untuk menerima notifikasi push dengan kelas "PendingIntent", kode berikut hanya menampilkan notifikasi di bilah tindakan.

Mengklik notifikasi tidak ada aktivitas yang akan dibuat, aktivitas aktif terakhir dipulihkan dengan mempertahankan status saat ini tanpa masalah.

Intent notificationIntent = new Intent(this, ActBase.class); **notificationIntent.setAction(Intent.ACTION_MAIN); notificationIntent.addCategory(Intent.CATEGORY_LAUNCHER);** PendingIntent contentIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0);

NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this) .setSmallIcon(R.drawable.ic_launcher) .setContentTitle("Localtaxi") .setVibrate(vibrate) .setStyle(new NotificationCompat.BigTextStyle().bigText(msg)) .setAutoCancel(true) .setOnlyAlertOnce(true) .setContentText(msg);

mBuilder.setContentIntent(contentIntent);

NotificationManager mNotificationManager = (NotificationManager) this.getSystemService(Context.NOTIFICATION_SERVICE);

mNotificationManager.notify(NOTIFICATION_ID, mBuilder.build());

Ciao!

GFPF
sumber