Làm cách nào để đóng ứng dụng Android?


157

Tôi muốn đóng ứng dụng của mình để nó không còn chạy trong nền nữa.

Làm thế nào để làm điều đó? Đây có phải là thực hành tốt trên nền tảng Android?

Nếu tôi dựa vào nút "quay lại", nó sẽ đóng ứng dụng, nhưng nó vẫn ở chế độ nền. Thậm chí còn có ứng dụng có tên "TaskKiller" chỉ để tiêu diệt những ứng dụng đó trong nền.



tự hỏi tại sao người ta không muốn ứng dụng của mình chạy ngay cả trong nền?
Darpan

Câu trả lời:


139

Android có một cơ chế sẵn sàng để đóng ứng dụng một cách an toàn theo tài liệu của nó. Trong Hoạt động cuối cùng được thoát (thường là Hoạt động chính xuất hiện đầu tiên khi ứng dụng bắt đầu), chỉ cần đặt một vài dòng trong phương thức onDestroy (). Cuộc gọi đến System.runFinalulatorsOnExit (true) đảm bảo rằng tất cả các đối tượng sẽ được hoàn thành và rác được thu thập khi ứng dụng thoát. Bạn cũng có thể hủy ứng dụng một cách nhanh chóng thông qua android.os.Process.killProcess (android.os.Process.myPid ()) nếu bạn thích. Cách tốt nhất để làm điều này là đặt một phương thức như sau trong một lớp trợ giúp và sau đó gọi nó bất cứ khi nào ứng dụng cần phải bị giết. Ví dụ: trong phương thức hủy của hoạt động gốc (giả sử rằng ứng dụng không bao giờ giết chết hoạt động này):

Ngoài ra, Android sẽ không thông báo cho ứng dụng về sự kiện phím HOME , do đó bạn không thể đóng ứng dụng khi nhấn phím HOME . Android bảo lưu sự kiện khóa HOME cho chính nó để nhà phát triển không thể ngăn người dùng rời khỏi ứng dụng của họ. Tuy nhiên, bạn có thể xác định bằng phím HOME được nhấn bằng cách đặt cờ thành đúng trong lớp người trợ giúp giả sử rằng phím HOME đã được nhấn, sau đó thay đổi cờ thành sai khi xảy ra sự kiện cho thấy phím HOME không được nhấn và sau đó kiểm tra xem phím HOME được nhấn trong phương thức onStop () của hoạt động.

Đừng quên xử lý phím HOME cho bất kỳ menu nào và trong các hoạt động được bắt đầu bởi các menu. Cũng vậy với khóa TÌM KIẾM . Dưới đây là một số lớp ví dụ để minh họa:

Đây là một ví dụ về hoạt động gốc giết chết ứng dụng khi nó bị hủy:

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);
    }

}

Đây là một hoạt động trừu tượng có thể được mở rộng để xử lý khóa HOME cho tất cả các hoạt động mở rộng nó:

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;
    }
}

Dưới đây là ví dụ về màn hình menu xử lý phím HOME :

/**
 * @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;
    }

}

Dưới đây là ví dụ về lớp trình trợ giúp xử lý khóa HOME trên ứng dụng:

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
Điều này được cho là sẽ giết toàn bộ ứng dụng có tên System.exit (0) bao gồm tất cả các hoạt động đang chạy như một phần của ứng dụng. Tất cả các ứng dụng khác sẽ tiếp tục chạy. Nếu bạn muốn chỉ giết một hoạt động trong ứng dụng chứ không phải tất cả các hoạt động trong ứng dụng thì bạn cần gọi phương thức finish () của hoạt động mà bạn muốn giết.
Daniel Remington - OMS

2
Cảm ơn rất nhiều cho nfo này. Tôi đang tạo một trò chơi với AndEngine và khi tôi gọi kết thúc, thậm chí trên tất cả các hoạt động, Android vẫn sẽ không hoàn toàn dọn dẹp và khi trò chơi được khởi chạy lại, nó sẽ hoàn toàn bị lỗi kết cấu GL của tôi. Vì vậy, sau khi điều tra, nghĩ rằng đó là AndEngine, tôi nhận ra rằng đó là một sự cố xảy ra vì Android đang cố gắng duy trì quá trình khi tôi muốn thoát khỏi nó. Tất cả các ý kiến ​​"oh bạn không nên gọi thoát, nó làm hỏng trải nghiệm người dùng" là vô nghĩa. Thời tiết một ứng dụng sẽ vẫn mở .......

17
Không có ứng dụng sản xuất nên được sử dụng mã này. Không có ứng dụng sản xuất nào nên gọi bất kỳ mã nào được hiển thị killApp(), vì Google đã chỉ ra rằng nó sẽ dẫn đến hành vi không thể đoán trước.
CommonsWare

1
System.runFinalulatorsOnExit (đúng); phương pháp không được dùng nữa, cách nào khác để đóng ứng dụng một cách an toàn (rác được thu thập)?.
Ajeesh

1
Nó không được phản đối tại thời điểm mà điều này ban đầu được đăng. Vì AP hiện tại là 7 và API hiện tại là 19, nên có lẽ có một cách khác để làm điều này ngay bây giờ.
Daniel Remington - OMS

68

ĐÚNG! Bạn chắc chắn có thể đóng ứng dụng của mình để nó không còn chạy trong nền. Giống như những người khác đã nhận xét finish()là cách Google khuyến nghị không thực sự có nghĩa là chương trình của bạn bị đóng.

System.exit(0);

Quyền đó sẽ đóng ứng dụng của bạn mà không để lại bất cứ thứ gì chạy trong nền. Tuy nhiên, hãy sử dụng nó một cách khôn ngoan và đừng để các tệp mở, xử lý cơ sở dữ liệu mở, v.v. Những thứ này thường sẽ được dọn sạch thông qua finish()lệnh.

Cá nhân tôi ghét khi tôi chọn Thoát trong một ứng dụng và nó không thực sự thoát.


44
Sử dụng System.exit () hoàn toàn không được khuyến khích.
CommonsWare

14
Tôi sẽ không tranh luận rằng đó không phải là cách được đề xuất nhưng bạn có thể vui lòng cung cấp một giải pháp sẽ đảm bảo rằng ứng dụng được thoát khỏi nền ngay lập tức không? Nếu không thì System.exit là cách để đi cho đến khi Google cung cấp một phương pháp tốt hơn.
Cameron McBride

74
Ai quyết định rằng bạn không "được cho là", cùng những người đã tạo ra một phương thức không thực sự thoát ra? Nếu người dùng không muốn các ứng dụng của họ bị đóng thì ứng dụng trả phí phổ biến thứ 5 sẽ không phải là một kẻ giết người. Mọi người cần giải phóng bộ nhớ và hệ điều hành lõi không thực hiện được công việc.
Cameron McBride

19
Đồng ý rằng nó không được khuyến khích, nhưng đã bỏ phiếu để cung cấp một câu trả lời thực sự cho câu hỏi được hỏi. Tôi đang rất mệt mỏi khi nghe "bạn không thực sự muốn làm điều đó", không có lời giải thích tiếp theo. Android là một cơn ác mộng tuyệt đối liên quan đến tài liệu cho những loại điều này so với iPhone.
DougW

11
Không có lợi ích bộ nhớ trong việc sử dụng trình diệt tác vụ với Android. Android sẽ phá hủy và dọn sạch tất cả các ứng dụng không nằm trong nền trước nếu ứng dụng nền trước cần nhiều bộ nhớ hơn. Trong một số trường hợp, Android thậm chí mở lại một Ứng dụng đã bị đóng với nhiệm vụ giết người. Android sẽ lấp đầy tất cả bộ nhớ không cần thiết với các ứng dụng được sử dụng gần đây để giảm thời gian chuyển đổi ứng dụng. KHÔNG XÂY DỰNG ỨNG DỤNG VỚI NÚT EXIT. KHÔNG SỬ DỤNG QUẢN LÝ TASK TRÊN ANDROID. geekfor.me/faq/you-shouldnt-be-using-a-task-killer-with-android android-developers.blogspot.com/2010/04/...
Janusz

23

Đây là cách tôi đã làm:

Tôi chỉ cần đặt

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

bên trong phương thức mở một hoạt động, sau đó bên trong phương thức SOMECLASSNAME được thiết kế để đóng ứng dụng tôi đặt:

setResult(0);
finish();

Và tôi đặt những thứ sau vào lớp Chính của mình:

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

18

Chỉ để trả lời câu hỏi của riêng tôi bây giờ sau rất nhiều thời gian (vì CommonsWare đã nhận xét về câu trả lời phổ biến nhất nói rằng chúng ta KHÔNG nên làm điều này):

Khi tôi muốn thoát khỏi ứng dụng:

  1. Tôi bắt đầu hoạt động đầu tiên của mình (màn hình giật gân hoặc bất kỳ hoạt động nào hiện đang ở dưới cùng của ngăn xếp hoạt động) với FLAG_ACTIVITY_CLEAR_TOP(sẽ thoát khỏi tất cả các hoạt động khác bắt đầu sau đó, có nghĩa là - tất cả chúng). Chỉ cần thực hiện để có hoạt động này trong ngăn xếp hoạt động (không hoàn thành trước vì một số lý do).
  2. Tôi kêu gọi finish()hoạt động này

Đây là nó, hoạt động khá tốt cho tôi.


3
Điều này thực sự không giết ứng dụng của bạn. Nó vẫn sẽ hiển thị trong danh sách ứng dụng. Tôi chỉ giết tất cả các hoạt động của bạn.
Joris Weimar

1
FLAG_ACTIVITY_CLEAN_TOP không hoạt động cho điện thoại thông minh Sony. Bạn có thể giải quyết vấn đề đó bằng cách thêm thuộc tính android: clearTaskOnLaunch = "true" vào hoạt động tại AndroidManifest.xml
Rusfearuth

10

Chỉ cần viết mã này vào nút bấm EXIT của bạn.

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

Và trong phương thức onCreate () của MainActivity. Class, hãy viết mã dưới đây dưới dạng một dòng đầu tiên,

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

9

Không thể sử dụng API khung. Theo quyết định của hệ điều hành (Android) để quyết định khi nào một quá trình sẽ được gỡ bỏ hoặc vẫn còn trong bộ nhớ. Điều này là vì lý do hiệu quả: nếu người dùng quyết định khởi chạy lại ứng dụng, thì nó đã ở đó mà không cần phải tải vào bộ nhớ.

Vì vậy, không chỉ nản lòng , không thể làm như vậy.


4
Bạn luôn có thể làm một cái gì đó như Integer z = null; z.intValue (); // câu trả lời tệ nhất
Joe Plante

6
Đúng là. Bạn cũng có thể đập điện thoại vào tường, điều đó sẽ chấm dứt tất cả các ứng dụng đang mở nếu đủ áp lực. Tôi vẫn sẽ không đề nghị nó. Tôi đã cập nhật bài viết của mình cho phù hợp.
Matthias

@JoePlante cũng để ứng dụng ở chế độ nền khi bạn mở menu ứng dụng. Dường như điều đó là không thể.
peresisUser

8

Đối với cách thoát ứng dụng:

Cách 1:

gọi finish();và ghi đè onDestroy();. Đặt mã sau vào onDestroy():

System.runFinalizersOnExit(true)

hoặc là

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

Cách 2:

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

Cách 3:

Quit();

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

Cách 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();
}

Cách 5:

Đôi khi gọi finish()sẽ chỉ thoát khỏi hoạt động hiện tại, không phải toàn bộ ứng dụng. Tuy nhiên, có một cách giải quyết cho việc này. Mỗi khi bạn bắt đầu một activity, bắt đầu sử dụng nó startActivityForResult(). Khi bạn muốn đóng toàn bộ ứng dụng, bạn có thể thực hiện một số thao tác như sau:

setResult(RESULT_CLOSE_ALL);
finish();

Sau đó, xác định onActivityResult(...)cuộc gọi lại của mọi hoạt động để khi activitytrả về với RESULT_CLOSE_ALLgiá trị, nó cũng gọi finish():

@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);
}

Mục đích ý định = Ý định mới (getApplicationContext (), LoginActivity. Class); aim.setFlags (Intent.FLAG_ACTIVITY_NEW_TASK); aim.putExtra ("EXIT", đúng); startActivity (ý định); đang làm việc siêu tốt.
hitesh141

Tôi đã bắt đầu Hoạt động A-> B-> C-> D. Khi nhấn nút quay lại vào Hoạt động DI muốn chuyển đến Hoạt động A. Vì A là điểm bắt đầu của tôi và do đó, trên ngăn xếp, tất cả các hoạt động ở đầu A đều bị xóa và bạn không thể quay lại bất kỳ Hoạt động nào khác từ A . @Override boolean công khai onKeyDown (int keyCode, sự kiện KeyEvent) {if (keyCode == KeyEvent.KEYCODE_BACK) {Intent a = new Intent (this, A. class); a.addFlags (Ý định.FLAG_ACTIVITY_CLEAR_TOP); startActivity (a); trả lại đúng sự thật; } return super.onKeyDown (keyCode, event); }
hitesh141

5

Đây là cách Windows Mobile đã hoạt động cho ... à ... bao giờ! Đây là những gì Microsoft nói về vấn đề này:

http://bloss.msdn.com/windowsmobile/archive/2006/10/05/The-Emaoh-Has-No-Close.aspx (có buồn không khi tôi nhớ tiêu đề của bài đăng trên blog từ năm 2006? Tôi tìm thấy bài viết trên Google bằng cách tìm kiếm "hoàng đế không có đóng" lol)

Nói ngắn gọn:

Nếu hệ thống cần thêm bộ nhớ trong khi ứng dụng ở chế độ nền, nó sẽ đóng ứng dụng. Nhưng, nếu hệ thống không cần thêm bộ nhớ, ứng dụng sẽ ở trong RAM và sẵn sàng quay lại nhanh vào lần tiếp theo người dùng cần.

Nhiều ý kiến ​​trong câu hỏi này tại O'Reilly cho rằng Android hoạt động theo cách tương tự, đóng các ứng dụng không được sử dụng trong một thời gian chỉ khi Android cần bộ nhớ mà chúng đang sử dụng.

Vì đây là một tính năng tiêu chuẩn, nên việc thay đổi hành vi để đóng mạnh mẽ sẽ thay đổi trải nghiệm người dùng. Nhiều người dùng sẽ quen với việc từ chối nhẹ nhàng các ứng dụng Android của họ, vì vậy khi họ loại bỏ một ứng dụng với ý định quay lại sau khi thực hiện một số tác vụ khác, họ có thể khá thất vọng vì trạng thái của ứng dụng được đặt lại hoặc mất nhiều thời gian hơn mở. Tôi sẽ gắn bó với các hành vi tiêu chuẩn bởi vì đó là những gì được mong đợi.


5

Gọi finish()phương thức trên một Hoạt động có tác dụng mong muốn của bạn đối với hoạt động hiện tại đó.


14
Không, nó không có. Nó kết thúc Hoạt động hiện tại, không phải ứng dụng. Nếu bạn hoàn thành () Hoạt động dưới cùng nhất trên ngăn xếp tác vụ, ứng dụng của bạn sẽ xuất hiện để thoát, nhưng Android có thể quyết định thực sự giữ nó xung quanh miễn là nó thấy phù hợp.
Matthias

Thật vậy, tuy nhiên nếu bạn cần thoát hoàn toàn ứng dụng của mình, bạn cần gọi phương thức kết thúc cho từng hoạt động và cũng suy nghĩ về bất kỳ dịch vụ nào bạn có thể đã bắt đầu. Tôi cũng đã chỉnh sửa câu trả lời ban đầu - xin lỗi vì thiếu sót.
r1k0

3

không có câu trả lời nào ở trên hoạt động tốt trên ứng dụng của tôi

đây là mã làm việc của tôi

trên nút thoát của bạn:

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();

mã đó là để đóng bất kỳ hoạt động nào khác và đưa MainActivity lên hàng đầu ngay bây giờ trên MainActivity của bạn:

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

2

Đặt một finish();tuyên bố như dưới đây:

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

finish();

LoginActivity.this.startActivity(myIntent);

Trong mọi hoạt động.


2
@Override
    protected void onPause() {

        super.onPause();

        System.exit(0);

    }

2

Sao chép mã bên dưới và dán tệp AndroidManifest.xml vào bên dưới Thẻ hoạt động đầu tiê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>     

Ngoài ra, hãy thêm mã dưới đây vào tất cả trong Thẻ hoạt động trong tệp AndroidManifest.xml

 android:finishOnTaskLaunch="true"

1

Không thể với 2.3. Tôi tìm kiếm rất nhiều, và đã thử nhiều ứng dụng. Giải pháp tốt nhất là cài đặt cả (go taskmanager) và (khởi động lại nhanh). Khi sử dụng chúng cùng nhau, nó sẽ hoạt động, và sẽ giải phóng bộ nhớ. Một tùy chọn khác là nâng cấp lên bánh sandwich kem Android 4.0.4 cho phép kiểm soát (đóng) ứng dụng.


1

tôi muốn quay lại màn hình chính của thiết bị Android, vì vậy tôi chỉ cần sử dụng:

moveTaskToBack(true);

Đây không phải là một câu trả lời cho câu hỏi này
Leo hỗ trợ Monica Cellio

1

Sử dụng finishAffinity()có thể là một tùy chọn tốt nếu bạn muốn đóng tất cả Hoạt động của ứng dụng. Theo Tài liệu Android-

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();
    }
}

và trong bảng kê khai:

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

Sau đó, bạn có thể gọi CloseAppActivity.closeApp(fromActivity)và ứng dụng sẽ được đóng lại.


1

Chỉ cần viết mã sau vào onBackPression:

@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

bằng cách gọi kết thúc (); trong nút OnClick hoặc trên menu

trường hợp R.id.menu_sinstall:

      finish();
     return true;

Như đã nêu trong các bình luận của câu trả lời khác, finish()không giết chết Ứng dụng. Nó có thể quay lại Ý định trước hoặc làm nền cho Ứng dụng.
Raptor

0

Tôi nghĩ rằng nó sẽ đóng hoạt động của bạn và tất cả các hoạt động phụ liên quan đến nó.

public boolean onOptionsItemSelected(MenuItem item) {

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

        return super.onOptionsItemSelected(item);
    }

0

Cách tốt nhất và ngắn nhất để sử dụng bảng System.exit.

System.exit(0);

VM dừng thực thi thêm và chương trình sẽ thoát.


0

Sử dụng " this.FinishAndRemoveTask();" - nó đóng ứng dụng đúng cách

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.