Bir Android uygulamasından programlı olarak nasıl çıkılır?


93

Bu sorunun defalarca sorulduğundan eminim çünkü birkaçını okuyorum. Müşterim, uygulamasına kullanıcıların tıklayıp çıkabilecekleri bir düğme koymamı istiyor. Okudum bu ve arama bulundu finish()yapacak. Ancak, bitiş sadece mevcut koşu aktivitesini kapatmaktır, değil mi? Çok fazla aktivitem var, bu yüzden bu durumda her bir aktivitenin örneğini geçmem ve bitirmem veya her aktiviteyi Singleton modelinde yapmam gerekiyor.

Ayrıca Activity.moveTaskToBack(true)seni ana ekrana götürebileceğini de bilmeliyim . Tamam, bu kapanmak değil, süreci arka plana atıyor. Peki bu etkili mi?

Uygulamayı tamamen kapatmak için hangi yöntemi kullanmalıyım? Yukarıda açıklananlardan herhangi biri veya yukarıdaki yöntemlerin herhangi başka bir yöntemi / diğer kullanımı?


neden eylem çubuğunu kullanmıyorsunuz? uygulama simgesine tıklayın ana ekrana gidin. çıkmak için geri düğmesine tıklayın
Raghunandan

@Raghunandan: Bahsettiğim gibi, müşteri gereksinimi :(
Lemon Juice

Bunun android.os.Process.killProcess (android.os.Process.myPid ()) yardımcı olup olmadığını kontrol edin;
SANorton Stanley


Yanıtlar:


71

Aslında herkes bir onclick etkinliğinde uygulamayı kapatmayı arıyor, etkinlik nerede olursa olsun ...

Yani arkadaşlar arkadaşlar bu kodu deniyor. Bu kodu onclick etkinliğine koyun

Intent homeIntent = new Intent(Intent.ACTION_MAIN);
    homeIntent.addCategory( Intent.CATEGORY_HOME );
    homeIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);  
    startActivity(homeIntent); 

8
Bu aslında PeakGen'in sorduğu gibi "uygulamayı tamamen kapatmıyor" ama bu güzel bir alternatif
La masse

2
Sanmıyorum , BAYRAK ETKİNLİĞİ ile başlayan bir etkinlik YENİ GÖREV , bu şekilde ondan
çıkılamaz

51

System.exit () 'i çağırabilirsiniz; tüm aktivitelerden kurtulmak için.

    submit=(Button)findViewById(R.id.submit);

            submit.setOnClickListener(new OnClickListener() {

                @Override
                public void onClick(View arg0) {
android.os.Process.killProcess(android.os.Process.myPid());
                    System.exit(1);

                }
            });

5
Beni ilk aktiviteye götürüyor
Lemon Juice

8
@AnchitMittal System.exit (1), Aktivite yığınını veya görevlerini sıfırlamayı garanti etmez (bkz. Developer.android.com/guide/components/… ). Bu nedenle bu yaklaşım, uygulamanın zamanında uygun şekilde kapatılmasını (tüm Aktiviteleri yok etmesini) garanti etmez.
IgorGanapolsky

Çıkılacak tüm etkinlikler değil.
Jitendra

49

API 16'da yayınlanan finishAffinity yöntemi, tüm devam eden etkinlikleri kapatır ve uygulamayı kapatır:

this.finishAffinity();

Aynı yakınlığa sahip mevcut görevde bu aktiviteyi ve hemen altındaki tüm aktiviteleri bitirin. Bu tipik olarak, bir uygulama başka bir göreve başlatılabildiğinde (örneğin, anladığı bir içerik türünün ACTION_VIEW'den) çalıştırılabildiğinde ve kullanıcı mevcut görevden kendi görevine geçmek için yukarı gezinmeyi kullandığında kullanılır. Bu durumda, kullanıcı ikinci uygulamanın başka herhangi bir faaliyetine geçmişse, bunların tümü görev anahtarının bir parçası olarak orijinal görevden kaldırılmalıdır.

Bu son işlemin, önceki aktiviteye sonuç vermenize izin vermediğini ve bunu yapmaya çalışıyorsanız bir istisna atılacağını unutmayın.


API 21'den beri şunları kullanabilirsiniz:

finishAndRemoveTask();

Bu görevdeki tüm etkinlikleri bitirir ve son görevler listesinden kaldırır.

Alternatifler:

getActivity().finish();
System.exit(0);


int pid = android.os.Process.myPid();
android.os.Process.killProcess(pid);


Process.sendSignal(Process.myPid(), Process.SIGNAL_KILL);


Intent i = new Intent(context, LoginActivity.class);
i.putExtra(EXTRA_EXIT, true);
i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
context.startActivity(i);

Kaynak: Android uygulamasından programlı olarak nasıl çıkılır


Umarım yardımcı olur! İyi şanslar!


2
System.exit () kullanmayın. Android, uygulamadan çıktıktan sonra uygulamayı yeniden başlatmayı deneyecek. Bir döngüye girebilirsin.
AndroidDev

42

Uygulamanızdan çıkmak istiyorsanız, bu kodu düğmeye basılan etkinliğinizde kullanın:

public void onBackPressed() {
  moveTaskToBack(true);
  android.os.Process.killProcess(android.os.Process.myPid());
  System.exit(1);
}

24
 @Override
    public void onBackPressed() {
        AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(this);
        alertDialogBuilder.setTitle("Exit Application?");
        alertDialogBuilder
                .setMessage("Click yes to exit!")
                .setCancelable(false)
                .setPositiveButton("Yes",
                        new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog, int id) {
                                moveTaskToBack(true);
                                android.os.Process.killProcess(android.os.Process.myPid());
                                System.exit(1);
                            }
                        })

                .setNegativeButton("No", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int id) {

                        dialog.cancel();
                    }
                });

        AlertDialog alertDialog = alertDialogBuilder.create();
        alertDialog.show();
    }

4
Arasındaki fark System.exit (1); ve System.exit (0);
Pyae Phyo

System.exit (1), uygulamanın bazı hatalarla tamamlandığı anlamına gelirken, System.exit (0), uygulamanın herhangi bir hatasız tamamlandığı anlamına gelir. Bu, çeşitli linux / unix komutlarının çıkışta (hata) koşulları nasıl döndürdüğünü gösterir.
iOS-Coder


13

Aslında iki olası durum vardır:

  1. Aktiviteden çıkmak isteyebilirsiniz
  2. Veya uygulamadan çıkmak istiyorsunuz

Aşağıdaki kodu kullanarak etkinlikten çıkabilirsiniz:

var intent = new Intent(Intent.ActionMain);
intent.AddCategory(Intent.CategoryHome);
intent.SetFlags(ActivityFlags.NewTask);
startActivity(intent);
finish();

Ancak bu, aynı uygulamadaki temel faaliyetleri ortadan kaldırmaz. Bu sadece uygulamayı en aza indirecektir.

Uygulamadan çıkmak istiyorsanız, işlemi sonlandırmak için aşağıdaki kodu kullanın:

android.os.Process.killProcess(android.os.Process.myPid()); 

mono geliştirme için sadece kullanın

process.KillProcess(Process.MyPid());

Mypid () sizin yönteminiz ya da ne ...... öyleyse Mypid'i nasıl yazarsınız ... yöntemle yazmanız gerekir .....
Amitsharma

@amitsharma MyPid (), killProcess (int) ve sendSignal (int, int) ile kullanılabilen bu işlemin tanımlayıcısını döndüren Process sınıfından bir yöntemdir
Kasun

Arka plan hizmetini ve yayın alıcılarını da durdurur mu yoksa sadece uygulamayı güvenli bir şekilde kapatır mı?
Usman Rana

böylece, arasındaki fark nedir android.os.Process.killProcess(android.os.Process.myPid()); ve process.KillProcess(Process.MyPid());?
DysaniazzZ

7

Ne dersin this.finishAffinity()

Dokümanlardan,

Aynı yakınlığa sahip mevcut görevde bu aktiviteyi ve hemen altındaki tüm aktiviteleri bitirin. Bu tipik olarak, bir uygulama başka bir göreve başlatılabildiğinde (örneğin, anladığı bir içerik türünün ACTION_VIEW'den) çalıştırılabildiğinde ve kullanıcı mevcut görevden kendi görevine geçmek için yukarı gezinmeyi kullandığında kullanılır. Bu durumda, kullanıcı ikinci uygulamanın başka herhangi bir faaliyetine geçmişse, bunların tümü görev anahtarının bir parçası olarak orijinal görevden kaldırılmalıdır. Bu son işlemin, önceki aktiviteye sonuç vermenize izin vermediğini ve bunu yapmaya çalışıyorsanız bir istisna atılacağını unutmayın.


6
android.os.Process.killProcess(android.os.Process.myPid());

Benim durumum için bu hayatımı kurtardı. Teşekkür ederim!
Lifka

4

bu, Görev'i (faaliyetler yığını) temizleyecek ve yeni Göreve başlayacaktır

Intent intent = new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_HOME);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
System.exit(1);

Bu kodu neden bir cevap olarak gönderdiğinizi ve ne işe yaradığını açıklayın.
M.Adel Khalid

1
Stack Overflow'a hoş geldiniz! Bu kullanıcının sorununu çözmüş olsanız da, yalnızca kod içeren yanıtlar, gelecekte bu soruya gelecek kullanıcılar için pek yararlı olmayacaktır. Lütfen, kodunuzun orijinal sorunu neden çözdüğünü açıklamak için yanıtınızı düzenleyin.
Joe C

3
 @Override
    public void onBackPressed() {
        Intent homeIntent = new Intent(Intent.ACTION_MAIN);
        homeIntent.addCategory( Intent.CATEGORY_HOME );
        homeIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        startActivity(homeIntent);
    }

2

bunu onClic'inize koyun:

moveTaskToBack(true);
    finish()

olumsuz oyla ne yanlış. Cevap bu. 2 aktivitem var, birincisi giriş aktivitesi ve ikincisi ana aktivite .... Ana aktivite içinde uygulamadan çıkmak istedim ve giriş aktivitesine geri dönmek istemiyorum ... Bu cevabı ekledim ve şimdi uygulamayı ana aktivite içinde kapatabilirim.
Azizi Musa

Bunu yaparsanız, uygulama arka planda çalışmaya devam edecektir
Mohanad Haddadin

İyi çalışıyor. Benim durumum: splashActivity, MainActivity'yi çalıştırın. Kullanıcı MainActivity uygulamasında geri düğmesine bastığında beklendiği gibi çıkar. Diğer tüm vakalar beni sıçrama aktivitesine geri götürdü!
Jviaches

Pekala, oturum açma işlemimovewTaskToBack biter bitmez oturum açma etkinliğini bitirmiş olmalısın :) Ve cevap elbette tam olarak doğru değil , hiçbir şeyi bitirmiyor , sadece uygulamayı saklıyor ve finishbaşkalarının da bahsettiği gibi sadece mevcut olanı bitiriyor activity. Bu yüzden mevcut aktiviteyi bırakır ve varsa geri kalanını gizler. Her neyse, sadece bunun için aşağı oy almamalı ...
Meow Cat 2012

2

Bunu bir görüşmede deneyin. Bazen onClick of a butonda kullanıyorum.

Intent intent = new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_HOME);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);

Uygulamanızı kapatmak yerine, kontrol panelini açar, böylece uygulamanız kapalı gibi görünür.

daha fazla netlik için bu soruyu okuyun android - uygulama kodundan çıkın


2

This.finishAffinity () kullanın; bitirmek () yerine o düğmede; Çalışmazsa, manifestinize android: noHistory = "true" ekleyerek de deneyebilir ve ardından uisng finish () ile etkinliğinizi bitirebilirsiniz; veya finishAffinity ();

Umarım yardımcı olur....:)


2

Xamarin.Android'de Başarmak:

    public override void OnBackPressed()
    {
        MoveTaskToBack(true);
        Process.KillProcess(Process.MyPid());
        Environment.Exit(1);
    }

Bu, System.Environment.Exit veya Android.OS.Environment.Exit'e bir başvuru mu?
Moffen

2

Sadece bu iki işlevi çağırın

 finish();
 moveTaskToBack(true);

Cevabınız daha düşük kaliteli gönderilerde geldi. Kodunuz kendi kendini açıklayıcı olsa bile lütfen biraz açıklama sağlayın.
Harsha Biyani

2
Intent homeIntent = new Intent(Intent.ACTION_MAIN);
homeIntent.addCategory( Intent.CATEGORY_HOME );
homeIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(homeIntent);
System.exit(1);

Bu Kodu kullanın, çok kullanışlıdır ve tüm faaliyetlerden çıkabilirsiniz.


Bunu yaptım ve sonra 5. kattan telefon attım, tüm aktiviteler x'e göre kapandı
Paschalis

1

onCreate üzerinde singletop ve finish () ile çağrılan hayalet etkinlik hile yapmalı




1

Birisi hala merak ederse, için Xamarin.Android (benim durumumda da monogame üzerinde çalıştıran) komutu FinishAndRemoveTask()üzerine Activityyaptığı işi çok iyi!



0

sadece arka baskınızda kodu kullanın

                    Intent startMain = new Intent(Intent.ACTION_MAIN);
                    startMain.addCategory(Intent.CATEGORY_HOME);
                    startMain.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                    startActivity(startMain);

0

Eğer kullanıyorsanız EventBus faaliyetleri arasında iletişim kurmak için uygulamanızda (veya gerçekten başka pub / alt kütüphanesi) onlara açık bir olay gönderebilirsiniz:

final public class KillItWithFireEvent
{
    public KillItWithFireEvent() {}

    public static void send()
    {
        EventBus.getDefault().post(new KillItWithFireEvent());
    }
}

Bunun tek dezavantajı, bu olayı dinlemek için tüm aktivitelere ihtiyaç duymanızdır finish(). Bunun için, sadece bu olayı dinleyen ve alt sınıfların diğer her şeyi uygulamasına izin veren miras yoluyla kolayca shim aktivite sınıfları oluşturabilir , ardından tüm aktivitelerinizin bu ekstra katmandan miras aldığından emin olabilirsiniz. Kill dinleyicileri, bazı özel durumlarda ölümden kaçınmak gibi, geçersiz kılmalar yoluyla bazı ekstra işlevler bile ekleyebilirler.


0

Uygulamadan çıkmak istediğinizde aşağıdaki iki satırı çalıştırın

android.os.Process.killProcess(android.os.Process.myPid());
System.exit(1);

0
finish();
 finishAffinity();
 System.exit(0);

benim için çalıştı


1
Lütfen kodunuza bir açıklama ekleyin. Ek olarak, zaten kapsanan diğer cevaplar gibi görünüyor - bu yüzden çözümünüzü diğerlerinden daha iyi yapan şeyin ne olduğunu açıklamalısınız
Nico Haase

0

Sadece şunu ara:

finishAffinity();

Bu kod soruyu yanıtlayabilirken, bu kodun soruyu neden ve / veya nasıl yanıtladığına ilişkin ek bağlam sağlamak, uzun vadeli değerini artırır.
Igor F.

0

Bu yöntemi çık / çık düğmenize bağlayın

public void quitGame(View view) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            finishAndRemoveTask();
        } else {
            finish();
        }
    }

-1

Hem bitir hem de çık kullanırsanız, uygulamanız tamamen kapanacaktır

bitiş();

System.exit (0);

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.