Android uygulaması nasıl kapatılır?


157

Uygulamamı kapatmak istiyorum, böylece artık arka planda çalışmaz.

Bu nasıl yapılır? Bu Android platformunda iyi bir uygulama mı?

"Geri" düğmesine güvenirsem, uygulamayı kapatır, ancak arka planda kalır. Sadece arka planda bu uygulamaları öldürmek için "TaskKiller" adlı bir uygulama bile var.



bir uygulamanın neden arka planda çalışmasını istemeyeceğini merak ediyor musunuz?
Darpan

Yanıtlar:


139

Android, bir uygulamayı dokümanlarına göre güvenli bir şekilde kapatmak için bir mekanizmaya sahiptir. Çıkılan son Etkinlikte (genellikle uygulama başladığında ilk gelen ana Etkinlik) onDestroy () yöntemine birkaç satır yerleştirin. System.runFinalizersOnExit (true) çağrısı , uygulama sona erdiğinde tüm nesnelerin sonlandırılmasını ve çöp toplanmasını sağlar. İsterseniz android.os.Process.killProcess (android.os.Process.myPid ()) aracılığıyla bir uygulamayı hızlı bir şekilde öldürebilirsiniz . Bunu yapmanın en iyi yolu, bir yardımcı sınıfta aşağıdakine benzer bir yöntem koymak ve daha sonra uygulamanın öldürülmesi gerektiğinde çağırmaktır. Örneğin, kök etkinliğin yok etme yönteminde (uygulamanın bu etkinliği asla öldürmediğini varsayarak):

Ayrıca Android, HOME tuşu olayının bir uygulamasını bildirmez , bu nedenle HOME tuşuna basıldığında uygulamayı kapatamazsınız . Android, HOME anahtar etkinliğini kendisine saklar, böylece bir geliştirici kullanıcıların uygulamalarından çıkmasını engelleyemez. Ancak ile belirleyebilir ANA varsayar bir yardımcı sınıf true bir bayrak ayarlayarak basıldığında tuşunun ANA bir olay olduğunu gösterir oluştuğunda anahtar sonra yanlış, bayrak değiştirerek, preslenmiş ANA sonra tuşuna basıldığında değildi ve etkinliğin onStop () yönteminde basılan HOME tuşunu görmek için kontrol edin.

Herhangi bir menülerde ve menüler tarafından başlatılan etkinliklerde HOME tuşunu kullanmayı unutmayın . Aynı şey ARA tuşu için de geçerlidir . Aşağıda örneklendirilecek bazı örnek sınıflar verilmiştir:

Uygulamayı yok edildiğinde öldüren bir kök faaliyet örneği:

package android.example;

/**
 * @author Danny Remington - MacroSolve
 */

public class HomeKey extends CustomActivity {

    public void onDestroy() {
        super.onDestroy();

        /*
         * Kill application when the root activity is killed.
         */
        UIHelper.killApp(true);
    }

}

HOME tuşunu genişleten tüm etkinlikler için işlenebilecek genişletilebilir soyut bir etkinlik :

package android.example;

/**
 * @author Danny Remington - MacroSolve
 */

import android.app.Activity;
import android.view.Menu;
import android.view.MenuInflater;

/**
 * Activity that includes custom behavior shared across the application. For
 * example, bringing up a menu with the settings icon when the menu button is
 * pressed by the user and then starting the settings activity when the user
 * clicks on the settings icon.
 */
public abstract class CustomActivity extends Activity {
    public void onStart() {
        super.onStart();

        /*
         * Check if the app was just launched. If the app was just launched then
         * assume that the HOME key will be pressed next unless a navigation
         * event by the user or the app occurs. Otherwise the user or the app
         * navigated to this activity so the HOME key was not pressed.
         */

        UIHelper.checkJustLaunced();
    }

    public void finish() {
        /*
         * This can only invoked by the user or the app finishing the activity
         * by navigating from the activity so the HOME key was not pressed.
         */
        UIHelper.homeKeyPressed = false;
        super.finish();
    }

    public void onStop() {
        super.onStop();

        /*
         * Check if the HOME key was pressed. If the HOME key was pressed then
         * the app will be killed. Otherwise the user or the app is navigating
         * away from this activity so assume that the HOME key will be pressed
         * next unless a navigation event by the user or the app occurs.
         */
        UIHelper.checkHomeKeyPressed(true);
    }

    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.settings_menu, menu);

        /*
         * Assume that the HOME key will be pressed next unless a navigation
         * event by the user or the app occurs.
         */
        UIHelper.homeKeyPressed = true;

        return true;
    }

    public boolean onSearchRequested() {
        /*
         * Disable the SEARCH key.
         */
        return false;
    }
}

HOME tuşunu işleyen bir menü ekranı örneği :

/**
 * @author Danny Remington - MacroSolve
 */

package android.example;

import android.os.Bundle;
import android.preference.PreferenceActivity;

/**
 * PreferenceActivity for the settings screen.
 * 
 * @see PreferenceActivity
 * 
 */
public class SettingsScreen extends PreferenceActivity {
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        addPreferencesFromResource(R.layout.settings_screen);
    }

    public void onStart() {
        super.onStart();

        /*
         * This can only invoked by the user or the app starting the activity by
         * navigating to the activity so the HOME key was not pressed.
         */
        UIHelper.homeKeyPressed = false;
    }

    public void finish() {
        /*
         * This can only invoked by the user or the app finishing the activity
         * by navigating from the activity so the HOME key was not pressed.
         */
        UIHelper.homeKeyPressed = false;
        super.finish();
    }

    public void onStop() {
        super.onStop();

        /*
         * Check if the HOME key was pressed. If the HOME key was pressed then
         * the app will be killed either safely or quickly. Otherwise the user
         * or the app is navigating away from the activity so assume that the
         * HOME key will be pressed next unless a navigation event by the user
         * or the app occurs.
         */
        UIHelper.checkHomeKeyPressed(true);
    }

    public boolean onSearchRequested() {
        /*
         * Disable the SEARCH key.
         */
        return false;
    }

}

İşte uygulama boyunca HOME tuşunu işleyen bir yardımcı sınıf örneği :

package android.example;

/**
 * @author Danny Remington - MacroSolve
 *
 */

/**
 * Helper class to help handling of UI.
 */
public class UIHelper {
    public static boolean homeKeyPressed;
    private static boolean justLaunched = true;

    /**
     * Check if the app was just launched. If the app was just launched then
     * assume that the HOME key will be pressed next unless a navigation event
     * by the user or the app occurs. Otherwise the user or the app navigated to
     * the activity so the HOME key was not pressed.
     */
    public static void checkJustLaunced() {
        if (justLaunched) {
            homeKeyPressed = true;
            justLaunched = false;
        } else {
            homeKeyPressed = false;
        }
    }

    /**
     * Check if the HOME key was pressed. If the HOME key was pressed then the
     * app will be killed either safely or quickly. Otherwise the user or the
     * app is navigating away from the activity so assume that the HOME key will
     * be pressed next unless a navigation event by the user or the app occurs.
     * 
     * @param killSafely
     *            Primitive boolean which indicates whether the app should be
     *            killed safely or quickly when the HOME key is pressed.
     * 
     * @see {@link UIHelper.killApp}
     */
    public static void checkHomeKeyPressed(boolean killSafely) {
        if (homeKeyPressed) {
            killApp(true);
        } else {
            homeKeyPressed = true;
        }
    }

    /**
     * Kill the app either safely or quickly. The app is killed safely by
     * killing the virtual machine that the app runs in after finalizing all
     * {@link Object}s created by the app. The app is killed quickly by abruptly
     * killing the process that the virtual machine that runs the app runs in
     * without finalizing all {@link Object}s created by the app. Whether the
     * app is killed safely or quickly the app will be completely created as a
     * new app in a new virtual machine running in a new process if the user
     * starts the app again.
     * 
     * <P>
     * <B>NOTE:</B> The app will not be killed until all of its threads have
     * closed if it is killed safely.
     * </P>
     * 
     * <P>
     * <B>NOTE:</B> All threads running under the process will be abruptly
     * killed when the app is killed quickly. This can lead to various issues
     * related to threading. For example, if one of those threads was making
     * multiple related changes to the database, then it may have committed some
     * of those changes but not all of those changes when it was abruptly
     * killed.
     * </P>
     * 
     * @param killSafely
     *            Primitive boolean which indicates whether the app should be
     *            killed safely or quickly. If true then the app will be killed
     *            safely. Otherwise it will be killed quickly.
     */
    public static void killApp(boolean killSafely) {
        if (killSafely) {
            /*
             * Notify the system to finalize and collect all objects of the app
             * on exit so that the virtual machine running the app can be killed
             * by the system without causing issues. NOTE: If this is set to
             * true then the virtual machine will not be killed until all of its
             * threads have closed.
             */
            System.runFinalizersOnExit(true);

            /*
             * Force the system to close the app down completely instead of
             * retaining it in the background. The virtual machine that runs the
             * app will be killed. The app will be completely created as a new
             * app in a new virtual machine running in a new process if the user
             * starts the app again.
             */
            System.exit(0);
        } else {
            /*
             * Alternatively the process that runs the virtual machine could be
             * abruptly killed. This is the quickest way to remove the app from
             * the device but it could cause problems since resources will not
             * be finalized first. For example, all threads running under the
             * process will be abruptly killed when the process is abruptly
             * killed. If one of those threads was making multiple related
             * changes to the database, then it may have committed some of those
             * changes but not all of those changes when it was abruptly killed.
             */
            android.os.Process.killProcess(android.os.Process.myPid());
        }

    }
}

1
Bunun, uygulamanın bir parçası olarak çalışan tüm etkinlikler de dahil olmak üzere System.exit (0) adlı uygulamanın tamamını öldürmesi beklenir. Diğer tüm uygulamalar çalışmaya devam eder. Uygulamada yalnızca bir etkinliği öldürmek istiyorsanız, ancak uygulamadaki tüm etkinlikleri değil, öldürmek istediğiniz etkinliğin finish () yöntemini çağırmanız gerekir.
Danny Remington - OMS

2
Bu nfo için çok teşekkürler. AndEngine ile bir oyun yapıyorum ve tüm aktivitelerde bile bitirmek dediğimde, android hala tam olarak temizlenmeyecek ve oyun yeniden başlatıldığında, GL dokularımın hepsi kusurlu vb. Bu yüzden araştırdıktan sonra, AndEngine olduğunu düşündükten sonra, bunun yanlış giden bir şey olması gerektiğini fark ettim çünkü android, çıkmak istediğimde süreci korumaya çalışıyordu. Tüm yorumlar "oh, çağrı dememelisiniz, kullanıcı deneyimini mahveder" saçmalıktır. Hava bir uygulama açık kalmalıdır .......

17
Hiçbir üretim uygulaması bu kodu kullanmamalıdır. killApp()Google'ın öngörülemeyen davranışlara yol açacağını belirttiği için, hiçbir üretim uygulaması gösterilen kodun hiçbirini çağırmamalıdır .
CommonsWare

1
System.runFinalizersOnExit (doğru); yöntemi kullanımdan kaldırıldı, Bir uygulamayı güvenli bir şekilde kapatmanın başka bir yolu nedir (çöp toplanır).
Ajeesh

1
Başlangıçta yayınlandığı sırada kullanımdan kaldırılmadı. O zaman mevcut AP 7 ve şu anki API 19 olduğundan, muhtemelen bunu şimdi yapmanın başka bir yolu var.
Danny Remington - OMS

68

EVET! Uygulamanızı artık arka planda çalışmadığından kesinlikle kapatabilirsiniz. Başkalarının yorumladığı gibi finish(), Google'ın önerilen program aslında kapalı olduğu anlamına gelmez.

System.exit(0);

Bu doğru, uygulamanızı arka planda çalışan hiçbir şey bırakmayacak şekilde kapatacaktır.Ancak bunu akıllıca kullanın ve dosyaları açık bırakmayın, veritabanı kolları açık vb. Bu şeyler normalde finish()komut aracılığıyla temizlenir .

Bir uygulamada Çıkış'ı seçtiğimde şahsen nefret ediyorum ve gerçekten çıkmıyor.


44
System.exit () kullanılması kesinlikle önerilmez.
CommonsWare

14
Bunun önerilen yol olmadığını iddia etmeyeceğim, ancak uygulamanın hemen arka plandan çıkıldığını garanti edecek bir çözüm sağlayabilir misiniz? Değilse, System.exit, Google daha iyi bir yöntem sağlayana kadar gitmenin yoludur.
Cameron McBride

74
Gerçekte çıkış yapmayan bir yöntem yaratan aynı insanlara “gerekmediğinize” kim karar verir? Kullanıcılar uygulamalarının kapanmasını istemezlerse, en popüler 5. ücretli uygulama bir görev katili olmaz. İnsanlar hafızayı serbest bırakırlar ve çekirdek işletim sistemi işi yapmaz.
Cameron McBride

19
Kötü tavsiye edildiğini kabul etti, ancak sorulan soruya gerçek bir cevap verdiği için oy verdi. "Bunu gerçekten yapmak istemiyorsun" ifadesini duymaktan çok yoruldum, takip açıklaması yok. Android, iPhone'a kıyasla bu tür şeyler için dokümantasyon konusunda mutlak bir kabus.
DougW

11
Android ile görev katillerinin kullanılmasında bellek faydası yoktur. Ön plan uygulamasının daha fazla belleğe ihtiyacı varsa, Android ön planda olmayan tüm uygulamaları yok edecek ve temizleyecektir. Bazı durumlarda Android, görev katiliyle kapatılmış bir Uygulamayı yeniden açar. Android, uygulama değiştirme süresini azaltmak için gerekli olmayan tüm belleği son kullanılan uygulamalarla dolduracaktır. UYGULAMALARI ÇIKIŞ DÜĞMESİ İLE YAPMAYIN. ANDROID'DE GÖREV MÜDÜRÜ KULLANMAYIN. geekfor.me/faq/you-shouldnt-be-using-a-task-killer-with-android android-developers.blogspot.com/2010/04/…
Janusz

23

Ben böyle yaptım:

Sadece koydum

Intent intent = new Intent(Main.this, SOMECLASSNAME.class);
Main.this.startActivityForResult(intent, 0);

bir etkinlik açan yöntemin içine, sonra ben koymak app kapatmak için tasarlanmış SOMECLASSNAME yönteminin içine:

setResult(0);
finish();

Ve ana sınıfımda şunları koydum:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if(resultCode == 0) {
        finish();
    }
}

18

Sadece çok zaman geçtikten sonra kendi sorumu cevaplamak için (CommonsWare en popüler cevap üzerine bunu yapmamamız gerektiğini söylediğinden beri):

Uygulamadan çıkmak istediğimde:

  1. İlk aktivitemi (açılış ekranı veya şu anda etkinlik yığınının altında olan herhangi bir etkinlik) ile FLAG_ACTIVITY_CLEAR_TOPbaşlatırım (bundan sonra başlatılan diğer tüm etkinliklerden çıkacaktır, yani - hepsi). Bu etkinliğin etkinlik yığınında olmasını sağlayın (bir nedenle önceden bitirmeyin).
  2. finish()Bu etkinliği çağırıyorum

İşte bu, benim için oldukça iyi çalışıyor.


3
Bu aslında uygulamanızı öldürmez. Uygulama listesinde görünmeye devam edecektir. Tüm aktivitelerinizi öldürüyorum.
Joris Weimar

1
FLAG_ACTIVITY_CLEAN_TOP Sony akıllı telefonlar için çalışmaz. Android: clearTaskOnLaunch = "true" özelliğini AndroidManifest.xml adresindeki etkinliğe ekleyerek bunu çözebilirsiniz
Rusfearuth

10

Bu kodu EXIT tuşuna basmanız yeterlidir.

Intent intent = new Intent(getApplicationContext(), MainActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.putExtra("LOGOUT", true);
startActivity(intent);

Ve MainActivity.class'ınızın onCreate () yönteminde ilk satır olarak aşağıdaki kodu yazın,

if (getIntent().getBooleanExtra("LOGOUT", false))
{
    finish();
}

9

Framework API'lerini kullanmak mümkün değildir. Bir işlemin ne zaman kaldırılması veya bellekte kalması gerektiğine karar vermek işletim sisteminin (Android) takdirindedir. Bu, verimlilik nedenlerinden ötürü: kullanıcı uygulamayı yeniden başlatmaya karar verirse, belleğe yüklenmek zorunda kalmadan zaten oradadır.

Yani hayır, sadece cesaretini kırmakla kalmıyor , bunu yapmak da imkansız .


4
Her zaman Integer z = null; z.intValue (); // en kötü cevap
Joe Plante

6
Bu doğru. Ayrıca, telefonunuzu duvara dayayabilirsiniz, bu da yeterli basınç uygulandığında tüm açık uygulamaları sonlandıracaktır. Hala tavsiye etmem. Yazımı buna göre güncelledim.
Matthias

Uygulamalar menüsünü açtığınızda uygulamayı arka planda da bırakan @JoePlante. Görünüşe göre imkansız.
peresisUser

8

Uygulama yollarından çıkmak için:

Yol 1:

çağırın finish();ve geçersiz kılın onDestroy();. Aşağıdaki kodu girin onDestroy():

System.runFinalizersOnExit(true)

veya

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

Yol 2:

public void quit() {
    int pid = android.os.Process.myPid();
    android.os.Process.killProcess(pid);
    System.exit(0);
}

Yol 3:

Quit();

protected void Quit() {
    super.finish();
}

Yol 4:

Intent intent = new Intent(getApplicationContext(), LoginActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.putExtra("EXIT", true);
startActivity(intent);

if (getIntent().getBooleanExtra("EXIT", false)) {
     finish();
}

Yol 5:

Bazen çağrı finish()tüm uygulamadan değil sadece geçerli aktiviteden çıkar. Ancak bunun için bir geçici çözüm vardır. Her başlattığınızda activity, düğmesini kullanarak başlatın startActivityForResult(). Uygulamanın tamamını kapatmak istediğinizde aşağıdakine benzer bir şey yapabilirsiniz:

setResult(RESULT_CLOSE_ALL);
finish();

Ardından her etkinliğin onActivityResult(...)geri aramasını tanımlayın, böylece değerle bir activitygeri dönüş RESULT_CLOSE_ALLyaptığında finish()şunları da çağırır :

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    switch(resultCode){
        case RESULT_CLOSE_ALL:{
            setResult(RESULT_CLOSE_ALL);
            finish();
        }
    }
    super.onActivityResult(requestCode, resultCode, data);
}

Niyet niyeti = yeni Niyet (getApplicationContext (), LoginActivity.class); intent.setFlags (Intent.FLAG_ACTIVITY_NEW_TASK); intent.putExtra ("EXIT", doğru); startActivity (niyet); süper iyi çalışıyor.
hitesh141

A-> B-> C-> D Aktivitesine başladım. Etkinlik DI'de geri düğmesine basıldığında Etkinlik A'ya gitmek istersiniz. A başlangıç ​​noktam olduğundan ve zaten yığınta olduğu için A'nın üstündeki tüm etkinlikler temizlenir ve A'dan başka bir Etkinliğe geri dönemezsiniz. . @KolDown'da genel boole değerini geçersiz kıl (int keyCode, KeyEvent olayı) {if (keyCode == KeyEvent.KEYCODE_BACK) {Niyet a = yeni Amaç (bu A.class); a.addFlags (Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity (a) ' geri dönüş; } dönüş super.onKeyDown (keyCode, event); }
hitesh141

5

Windows Mobile bu şekilde çalışmıştır ... iyi ... hiç! Microsoft'un bu konuda söyledikleri:

http://blogs.msdn.com/windowsmobile/archive/2006/10/05/The-Emperor-Has-No-Close.aspx (2006'dan bu yana blog gönderisinin başlığını hatırladığım için üzgünüm? Google'da "imparatorun yakınlığı yok" diyerek makaleyi buldum lol)

Kısacası:

Uygulama arka planda iken sistemin daha fazla belleğe ihtiyacı varsa uygulamayı kapatır. Ancak, sistemin daha fazla belleğe ihtiyacı yoksa, uygulama RAM'de kalır ve kullanıcının bir dahaki sefere ihtiyacı olduğunda hızlı bir şekilde geri gelmeye hazır olur.

O'Reilly'deki bu sorudaki birçok yorum , Android'in aynı şekilde davrandığını ve bir süredir kullanılmayan uygulamaları yalnızca Android'in kullandıkları belleğe ihtiyacı olduğunda kapattığını gösteriyor.

Bu standart bir özellik olduğundan, davranışı zorla kapatmak için kullanıcı deneyimini değiştirmek olacaktır. Birçok kullanıcı, Android uygulamalarının nazikçe işten çıkarılmasına alışık olacak, bu nedenle başka görevleri gerçekleştirdikten sonra geri dönmek amacıyla birisini reddettiklerinde, uygulamanın durumunun sıfırlanması veya daha uzun sürmesi oldukça hayal kırıklığına uğrayabilir. açmak. Beklenen şey olduğu için standart davranışa sadık kalacağım.


5

finish()Yöntemin bir Etkinlik üzerinde çağrılması, o geçerli etkinlik üzerinde istediğiniz etkiye sahiptir.


14
Hayır değil. Uygulamayı değil, geçerli Etkinliği bitirir. Görev yığınında en altta bulunan Etkinliği bitirirseniz (), uygulamanızın çıktığı görülecektir, ancak Android, uygun gördüğü sürece gerçekte tutmaya karar verebilir.
Matthias

Gerçekten de, uygulamanızdan tamamen çıkmanız gerekiyorsa, her etkinlik için bitirme yöntemini çağırmanız ve başlatmış olabileceğiniz hizmetleri de düşünmeniz gerekir. İlk yanıtı da düzenledim - ihmal için üzgünüm.
r1k0

3

yukarıdaki cevapların hiçbiri uygulamamda iyi çalışmıyor

işte çalışma kodum

çıkış düğmenizde:

Intent intent = new Intent(getApplicationContext(), MainActivity.class);
ComponentName cn = intent.getComponent();
Intent mainIntent = IntentCompat.makeRestartActivityTask(cn);
mainIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);
mainIntent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
mainIntent.putExtra("close", true);
startActivity(mainIntent);
finish();

bu kod diğer tüm etkinlikleri kapatmak ve MainActivity'yi MainActivity'nizde en üste taşımaktır:

if( getIntent().getBooleanExtra("close", false)){
    finish();
}

2

finish();Aşağıdaki gibi bir ifade koyun :

myIntent.putExtra("key1", editText2.getText().toString());

finish();

LoginActivity.this.startActivity(myIntent);

Her aktivitede.


2
@Override
    protected void onPause() {

        super.onPause();

        System.exit(0);

    }

2

Aşağıdaki kodu kopyalayın ve AndroidManifest.xml dosyasını İlk Etkinlik Etiketi altına yapıştırın.

<activity                        
            android:name="com.SplashActivity"
            android:clearTaskOnLaunch="true" 
            android:launchMode="singleTask"
            android:excludeFromRecents="true">              
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER"
                />
            </intent-filter>
        </activity>     

Ayrıca bu kodu AndroidManifest.xml dosyasındaki Etkinlik Etiketi'nin altına ekleyin

 android:finishOnTaskLaunch="true"

1

2.3 ile mümkün değil. Çok fazla arama yaptım ve birçok uygulamayı denedim. En iyi çözüm hem (go taskmanager) hem de (hızlı yeniden başlatma) yüklemektir. Onları birlikte kullandığınızda çalışacak ve hafızayı serbest bırakacaktır. Başka bir seçenek, uygulamaların kontrolüne (yakın) izin veren android dondurma sandviç 4.0.4'e yükseltmektir.



1

finishAffinity()Uygulamanın tüm Etkinliğini kapatmak istiyorsanız, kullanımı iyi bir seçenek olabilir. Android Dokümanlarına göre

Finish this activity as well as all activities immediately below it in the current task that have the same affinity.

1
public class CloseAppActivity extends AppCompatActivity
{
    public static final void closeApp(Activity activity)
    {
        Intent intent = new Intent(activity, CloseAppActivity.class);
        intent.addCategory(Intent.CATEGORY_HOME);
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK |
                IntentCompat.FLAG_ACTIVITY_CLEAR_TASK);
        activity.startActivity(intent);
    }

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        finish();
    }
}

ve açıkça:

<activity
     android:name=".presenter.activity.CloseAppActivity"
     android:noHistory="true"
     android:clearTaskOnLaunch="true"/>

Sonra arayabilir CloseAppActivity.closeApp(fromActivity)ve uygulama kapatılacaktır.


1

Aşağıdaki kodu onBackPressed'e yazmanız yeterlidir:

@Override
public void onBackPressed() {
    // super.onBackPressed();

    //Creating an alert dialog to logout
    AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(this);
    alertDialogBuilder.setMessage("Do you want to Exit?");
    alertDialogBuilder.setPositiveButton("Yes",
            new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface arg0, int arg1) {
                    Intent intent = new Intent(Intent.ACTION_MAIN);
                    intent.addCategory(Intent.CATEGORY_HOME);
                    startActivity(intent);
                }
            });

    alertDialogBuilder.setNegativeButton("No",
            new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface arg0, int arg1) {

                }
            });

    //Showing the alert dialog
    AlertDialog alertDialog = alertDialogBuilder.create();
    alertDialog.show();
}

0

finish () öğesini çağırarak; OnClick düğmesinde veya menüde

case R.id.menu_settings:

      finish();
     return true;

Diğer cevapların yorumlarında belirtildiği gibi finish(), App öldürmez. Önceki Niyet'e geri dönebilir veya Uygulamanın arka planını geri alabilir.
Raptor

0

Etkinliğinizi ve bununla ilgili tüm Alt etkinlikleri kapatacağını düşünüyorum.

public boolean onOptionsItemSelected(MenuItem item) {

        int id = item.getItemId();]
        if (id == R.id.Exit) {
            this.finishAffinity();
            return true;
        }

        return super.onOptionsItemSelected(item);
    }

0

System.exit tablosunu kullanmanın en iyi ve en kısa yolu.

System.exit(0);

VM daha fazla yürütmeyi durdurur ve program kapanır.


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.