Bir aktivite nasıl ön plana çıkarılır (yığının tepesi)?


91

Android'de, bir Activity ExampleActivity tanımladım.

Uygulamam başlatıldığında, bu A-Etkinliğinin bir örneği yaratıldı diyelim A. Kullanıcı içindeki bir düğmeyi tıkladığında A, başka bir B-Activity örneği olan B yaratıldı. Şimdi görev yığını, B en üstte olmak üzere BA'dır. Daha sonra kullanıcı, başka bir C-Activity örneği olan B üzerindeki bir düğmeye tıkladı ve C oluşturuldu. Şimdi görev yığını CBA'dır ve C üstte.

Şimdi, kullanıcı C üzerinde bir düğmeye tıkladığında, uygulamanın A'yı ön plana getirmesini istiyorum, yani A'nın ACB görev yığınının en üstünde olmasını istiyorum.

Bunun gerçekleşmesi için kodu nasıl yazabilirim?

Yanıtlar:


109

Bunu deneyebilirsiniz FLAG_ACTIVITY_REORDER_TO_FRONT(belge tam olarak ne istediğinizi açıklar)


3
FLAG_ACTIVITY_SINGLE_TOP olması gerektiğini düşünüyorum .

26
@ user942821 FLAG_ACTIVITY_SINGLE_TOPburada yardımcı olmayacak. ActivityC yığının en üstünde olduğunda ve startActivity()ActivityA'yı başlatmaya çağırdığında , ayarlasanız bile yeniFLAG_ACTIVITY_SINGLE_TOP bir ActivityA örneği oluşturmaya devam edecektir . FLAG_ACTIVITY_SINGLE_TOPyalnızca yığının en üstünde bulunan bir etkinliği başlatmaya çalışıyorsanız yeni bir eşgörünüm oluşturulmasını engeller . Bu durumda ActivityA yığının en üstünde değildir, bu nedenle Android yeni bir örnek oluşturur.
David Wasser

6
Harika! Verildikten (Intent.FLAG_ACTIVITY_REORDER_TO_FRONT | Intent.FLAG_ACTIVITY_CLEAR_TOP)sonra herhangi bir geçmişi temizlemek için kullanılır Activity.
shkschneider

10
FLAG_ACTIVITY_REORDER_TO_FRONT, FLAG_ACTIVITY_CLEAR_TOP'u da belirtirseniz göz ardı edilir. Belgeleri kontrol edin.
Kris Subramanian

3
intent.addFlags (Intent.FLAG_ACTIVITY_REORDER_TO_FRONT | Intent.FLAG_ACTIVITY_SINGLE_TOP); Bu, etkinliğinizi kullanıcı oturumunda öne çıkarmak istiyorsanız, zaten arkadaysa ancak ön tarafta değilse iyi çalışacaktır.
Hassan Jamil

64

Bunu yapmanın en iyi yolu, Android ana ekranının kullandığı aynı amacı kullanmaktı - uygulama Başlatıcı.

Örneğin:

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

Bu şekilde, paketimde kullanıcı tarafından en son kullanılan etkinlik ne olursa olsun, tekrar öne çıkar. Bunu, kullanıcıyı uygulamama geri götürmek için hizmetimin PendingIntent'ini kullanırken faydalı buldum.


2
Bu kod parçası için çok teşekkürler. Bunun düzgün çalışması için saatler harcadım.
PakitoV

3
veya ComponentName ve setComponent olmadan, ancak yeni Intent ile (this, MyMainActivity.class)
Tima

3
Garip çünkü bu benim için çalışan tek şeydi; bayraklar ayarlamak işe yaramadı ve her zaman etkinliği yeniden yarattı.
Steven Huang

5
Bu cevabı ve yorumları okuduğumda bir yanlış anlaşılma yaşadığımız açık. Asıl soru, Activitygörev yığını içindeki bir tanesinin nasıl yeniden düzenleneceğini sormaktır. OP ActivityA, yığının en altından yığının en üstüne geçmek istediğini açıkça belirtir (yani: ActivityA'yı görev yığınının önüne yeniden sıralamak istiyor ). Bu cevap bunu yapmayacak. Bu cevap, "Uygulamamı (görev yığınını) arka plandan ön plana nasıl getirebilirim?" Sorusunun cevabıdır. Bu, OP'nin orijinal sorusundan tamamen farklı bir sorudur.
David Wasser

3
Ayrıca, olumlu oy düğmesi "Bu yanıt yararlıdır" diyor, "bu yanıt op için yararlı" değil - bu durum için zaten "kabul işareti" var. Açıkçası, operasyon için neyin yararlı olduğunu bilmiyorum ve IMHO'nun operasyon için neyin yararlı olduğunu tahminime dayanarak cevapları düşürmesi yanlış.
Boris Treukhov

28

İşte bunu nasıl yapabileceğinize dair bir kod örneği:

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

Bu, yığın üzerinde bir etkinliğin yalnızca bir örneğine sahip olmanızı sağlayacaktır.

private static Intent getIntent(Context context, Class<?> cls) {
    Intent intent = new Intent(context, cls);
    intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
    return intent;
}

11

FLAG_ACTIVITY_REORDER_TO_FRONT : Context.startActivity () 'ye iletilen bir Amaç içinde ayarlanırsa, bu bayrak başlatılan etkinliğin, zaten çalışıyorsa, görevin geçmiş yığınının önüne getirilmesine neden olur.

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

4

Bence bir Intentbayrak kombinasyonu işe yaramalı. Özellikle Intent.FLAG_ACTIVITY_CLEAR_TOPve Intent.FLAG_ACTIVITY_NEW_TASK.

Aramadan önce bu bayrakları amacınıza ekleyin startActvity.


2

i.setFlags(Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT);

Not Homeaktivite başlatma modunuz single_task olmalıdır


1

Genel olarak bu aktivite yönetimi yönteminin tavsiye edilmediğini düşünüyorum. Yığın'da bir etkinliği iki Adım aşağı yeniden etkinleştirmenin sorunu, bu etkinliğin büyük olasılıkla öldürülmüş olmasıdır. Faaliyetlerinizin durumunu hatırlamak ve bunları başlatmak için tavsiyemstartActivity ()

Eminim bu sayfayı görmüşsünüzdür, ancak size kolaylık sağlamak için bu bağlantı


0

Bir Bildirime tıkladığınızda yığının en üstüne bir etkinlik getirmek istiyorsanız, FLAG_ACTIVITY_REORDER_TO_FRONT'un çalışması için aşağıdakileri yapmanız gerekebilir:

Benim için çözüm, bildirimin tetiklediği yayın eylemlerini dinleyen bir yayın alıcısı yapmaktı. Yani temelde:

  1. Bildirim, başlatılacak etkinliğin fazladan adı olan bir yayın eylemini tetikler.

  2. Yayın alıcısı, bildirim tıklandığında bunu yakalar, ardından FLAG_ACTIVITY_REORDER_TO_FRONT bayrağını kullanarak bu etkinliği başlatmak için bir niyet oluşturur

  3. Etkinlik, etkinlik yığınının en üstüne getirilir, yinelenmez.


-2

"PendingIntent" sınıfıyla push bildirimleri almak için "Google Cloud Message" kullanıyorsanız, aşağıdaki kod bildirimi yalnızca işlem çubuğunda görüntüler.

Hiçbir etkinlik oluşturulmayacağına ilişkin bildirime tıklandığında, son etkin etkinlik sorunsuz bir şekilde mevcut durumu koruyarak geri yüklenir.

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!

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.