Başka bir aktiviteden bir aktiviteyi bitirin


101

Bir aktiviteyi başka bir aktiviteden bitirmek istiyorum, örneğin:

Aktivite [A] 'da, düğmeye tıklandığında, Aktivite [A]' yı bitirmeden Aktivite [B] 'yi çağırıyorum.

Şimdi Etkinlik [B] 'de, Yeni ve Değiştir olmak üzere iki düğme vardır . Kullanıcı değiştir'i tıkladığında yığından tüm seçeneklerin işaretlendiği bir etkinlik [A] açılır ..

Ancak kullanıcı Activity [B] 'den New butonuna tıkladığında, Activity [A]' yı yığından bitirmem ve Activity [A] 'yı tekrar yığına yeniden yüklemem gerekecek.

Deniyorum ama [A] aktivitesini yığından bitiremiyorum ... Nasıl yapabilirim?

Kodu şu şekilde kullanıyorum:

Etkinlik [A] 'dan:

Intent GotoB = new Intent(A.this,B.class);
startActivityForResult(GotoB,1);

Aynı aktivitede başka bir yöntem

public void onActivityResult(int requestCode, int resultCode, Intent intent) {

    if (requestCode == 1)
    {
        if (resultCode == 1) {
            Intent i = getIntent();
            overridePendingTransition(0, 0);
            i.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
            finish();

            overridePendingTransition(0, 0);
            startActivity(i);
        }
    }
}

Ve Faaliyet [B] 'de, düğme tıklandığında:

setResult(1);
finish();

hey, bir faaliyeti diğerinden bitirmek istedin ... sonra doğru olan cevabı gönderdim. Ama neden oy verdiniz?
Manjunath

Burada birkaç güzel cevabı olan bir konu var: stackoverflow.com/questions/14355731/…
ab

Yanıtlar:


188
  1. Manifest dosyasında aktivitenizi A yapın: launchMode = "singleInstance"

  2. Kullanıcı yeniyi tıkladığında FirstActivity.fa.finish();, yeni Niyeti yapın ve arayın.

  3. Kullanıcı değiştir'i tıkladığında, yeni Niyet'i çağırın veya sadece B etkinliğini bitirin.

İLK YOL

İlk etkinliğinizde Activity objectböyle birini ilan edin ,

public static Activity fa;
onCreate()
{
    fa = this;
}

şimdi bu nesneyi bir başkasında Activitykullanarak ilk etkinliği böyle bitirmek için kullanın ,

onCreate()
{
    FirstActivity.fa.finish();
}

İKİNCİ YOL

Devam FirstActivityettiğiniz anda bitirmek istediğiniz aktivitenizi ararken, arama yaparken bayrak ekleyebilirsiniz.FirstActivity

intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);

Ancak bu bayrağı kullanarak, siz istemeseniz bile etkinlik bitmiş olacaktır. ve bazen onBackgöstermek FirstActivityistiyorsanız, niyet kullanarak çağırmanız gerekecektir.


6
Mükemmel cevap..!!
Vaibhav Vajani

94
Bir aktiviteye statik bir referans tutuyorsunuz. Bu, bir yerden manuel olarak temizlemediğiniz sürece asla ortadan kalkmayacaktır -> bir bellek sızıntısı yaratıyorsunuz!
DArkO

5
Peki sorun değil, kutudan çıkar çıkmaz düşünme için +1 var: D, sadece singleTop olarak değiştirirdim. ancak benzer bir şey yaparken yine de ilk tercihim olmayacak. temizleme kodu ile statik referanstan kurtulmanın bir yolunu kastettim, böylece bellek sızıntısı yok, ancak bu uygulama yapısına bağlı.
DArkO

6
Lütfen kimse ilk çözümü kullanmasın, bu tamamen yanlış. Bir zombi nesnesi oluştururken Android çerçevesini gerçekten hilekar bir şekilde atlıyorsunuz. Bir BroadcastReceiver kullanın.
S-K '

1
Harika çözümler. A-> B-> C aktivitelerinden ve onBackPressed of C'den gittiğim problemim için çok iyi çalıştı, yeni B örneğini başlatıyordum. A'nın eski örneği (istediğim şey) yerine B'nin eski örneğine git. Bu yüzden onBackPressed of C'de ilk yönteminizi izledim ve bu bana istediğim davranışı verdi :) Çok teşekkürler :)
SoulRayder

88

Bunu yapabilirsiniz, ancak bence normal aktivite akışını bozmamalısınız. Etkinliğinizi bitirmek istiyorsanız, etkinlik B'den etkinlik A'ya bir yayın gönderebilirsiniz.

B etkinliğinize başlamadan önce bir yayın alıcısı oluşturun:

BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {

    @Override
    public void onReceive(Context arg0, Intent intent) {
        String action = intent.getAction();
        if (action.equals("finish_activity")) {
            finish();
            // DO WHATEVER YOU WANT.
        }
    }
};
registerReceiver(broadcastReceiver, new IntentFilter("finish_activity"));

B'den A aktivitesini bitirmek istediğinizde, B aktivitesinden A aktivitesine yayın gönderin.

Intent intent = new Intent("finish_activity");
sendBroadcast(intent);

Umarım işinize yarayacak ...


"RegisterReceiver'da (broadcast_reciever, new IntentFilter (" finish_activity "));" üzerinde "Belirteçlerde sözdizimi hatası, bunun yerine AnnotationName bekleniyor" hatasını gösterir. Sorun nedir?
Behzad

2
"normal aktivite akışını bozmamalısınız" +1 bunun için
S-K '

11
Kaydını unutma broadcast_receiverileunregisterReceiver()
Jaec


Çözüm bu. güzel bir
Parinda Rajapaksha

17

Bu oldukça standart bir iletişim sorusudur. Bir yaklaşım, Faaliyet A'da ResultReceiver kullanmak olabilir:

Intent GotoB=new Intent(A.this,B.class);
GotoB.putExtra("finisher", new ResultReceiver(null) {
    @Override
    protected void onReceiveResult(int resultCode, Bundle resultData) {
        A.this.finish();
    }
});
startActivityForResult(GotoB,1);

ve sonra Aktivite B'de istediğiniz zaman şu şekilde bitirebilirsiniz:

((ResultReceiver)getIntent().getExtra("finisher")).send(1, new Bundle());

Bunun gibi bir şey dene.


6
+1, ((ResultReceiver) getIntent (). GetParcelableExtra ("sonlandırıcı")). Send (1, new Bundle ());
Hamidreza Sadegh

12

Durumunuzda kullanabileceğiniz bir yaklaşım var.

Adım 1: Aktivite B'yi A Aktivitesinden Başlatın

startActivity(new Intent(A.this, B.class));

Adım 2: Kullanıcı değiştir düğmesine tıklarsa, Aktivite A'yı kullanarak FLAG_ACTIVITY_CLEAR_TOP.Ayrıca, bayrağı fazladan iletin.

Intent i = new Intent(B.this, A.class);
i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
i.putExtra("flag", "modify");
startActivity(i);
finish();

Adım 3: Kullanıcı Ekle düğmesine tıklarsa, Aktivite A'yı kullanarak FLAG_ACTIVITY_CLEAR_TOP.Ayrıca, bayrağı fazladan iletin. FLAG_ACTIVITY_CLEAR_TOPHedef etkinlikte tanımlı başlatma modu yoksa hedefe kadar tüm açık etkinlikleri temizler ve yeniden başlatır

Intent i = new Intent(B.this, A.class);
i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
i.putExtra("flag", "add");
startActivity(i);
finish();

Adım4: Şimdi onCreate()Aktivite A'nın yöntemi, bu bayrağı almalı.

String flag = getIntent().getStringExtra("flag");
if(flag.equals("add")) {
    //Write a code for add
}else {
    //Write a code for modifying
}

6

Aktivitenizi istek koduyla başlatın:

StartActivityForResult(intent,1234);

Ve bunun gibi başka bir aktiviteden kapatabilirsiniz:

finishActivity(1234);

Hangi dilde??
Morten Holmgaard

5

Yığın Taşması sorusuna verdiğim yanıtı görün Son Tüm önceki aktiviteler .

İhtiyacınız olan şey Intent.FLAG_CLEAR_TOP,. Bu bayrak, yığındaki hedeflenen etkinliğin üzerindeki tüm etkinliklerin tamamlandığından ve birinin gösterildiğinden emin olur.

İhtiyacınız olan başka bir şey de SINGLE_TOPbayrak. Bununla, yığında zaten oluşturulmuş bir etkinlik varsa, Android'in yeni bir etkinlik oluşturmasını engellersiniz.

Sadece etkinlik zaten oluşturulmuşsa, bu bayraklarla niyetin onNewIntent(intent), hedef etkinlikte çağrılan yöntemde (işlemek için aşırı yüklemeniz gerekir) teslim edileceğine dikkat edin.

Sonra, onNewIntentyeniden başlatma denen bir yönteme ya da finish()kendine yeni bir niyet çağırıp başlatacak ya repopulate()da yeni verileri ayarlayacak bir yönteme sahip olacaksınız. İkinci yaklaşımı tercih ederim, daha ucuzdur ve onCreatemantığı her zaman doldurmak için arayabileceğiniz ayrı bir yönteme çıkarabilirsiniz.


4

Nepster'ın çözümünü az önce uyguladım ve harika çalışıyor. Bir Parçadan çalıştırmak için küçük bir değişiklik var.

Parçanıza

// sending intent to onNewIntent() of MainActivity
Intent intent = new Intent(getActivity(), MainActivity.class);
intent.putExtra("transparent_nav_changed", true);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);

Ve yeniden başlatmak istediğiniz Aktivitenin OnNewIntent () 'inize.

// recreate activity when transparent_nav was just changed
if (getIntent().getBooleanExtra("transparent_nav_changed", false)) {
    finish(); // finish and create a new Instance
    Intent restarter = new Intent(MainActivity.this, MainActivity.class);
    startActivity(restarter);
}

2

B'de yeniye basmak için en kolay yaklaşıma sahip olduğumu düşünüyorum ..

Intent intent = new Intent(B.this, A.class);
intent.putExtra("NewClicked", true);
 intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);

ve bir an olsun

  if (getIntent().getBooleanExtra("NewClicked", false)) {
        finish();// finish yourself and make a create a new Instance of yours.
      Intent intent = new Intent(A.this,A.class);
      startActivity(intent);
    }

1

Bunun eski bir soru olduğunu biliyorum, bu yöntemlerden birkaçı benim için işe yaramadı, bu yüzden geleceğe bakan veya sorunlarımın benim için işe yaramasına neden olan herkes için

Ben overrode onPauseve denilen finish()o yöntemin içinde.


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.