Làm cách nào để thoát ứng dụng Android theo lập trình?


93

Tôi chắc rằng câu hỏi này đã được hỏi nhiều lần vì tôi đã đọc một vài câu. Khách hàng của tôi muốn tôi đặt một nút vào ứng dụng của anh ấy để người dùng có thể nhấp và thoát. Tôi đã đọc điều này và nhận thấy việc gọi điện finish()sẽ làm được. Nhưng, kết thúc chỉ là đóng hoạt động đang chạy hiện tại phải không? Tôi có rất nhiều hoạt động nên trong trường hợp này tôi phải vượt qua từng cá thể của hoạt động và hoàn thành chúng hoặc biến mọi hoạt động thành mô hình Singleton.

Tôi cũng phải biết Activity.moveTaskToBack(true)có thể đưa bạn vào màn hình chính. OK, đây không phải là đóng mà là nền của quá trình. Vậy cách này có hiệu quả không?

Tôi nên sử dụng phương pháp nào để đóng ứng dụng hoàn toàn? Bất kỳ mô tả ở trên hoặc bất kỳ phương pháp / cách sử dụng nào khác của các phương pháp trên?


tại sao không sử dụng thanh hành động. nhấp vào biểu tượng ứng dụng điều hướng đến màn hình chính. bấm backbutton để thoát
Raghunandan

@Raghunandan: Như tôi đã đề cập, yêu cầu khách hàng :(
Lemon Juice

Kiểm tra xem điều này có giúp android.os.Process.killProcess (android.os.Process.myPid ()) không;
SANorton Stanley


Câu trả lời:


71

Trên thực tế, mọi người đang tìm cách đóng ứng dụng trên một sự kiện onclick, bất cứ nơi nào có thể là hoạt động ....

Vì vậy, các bạn hãy thử mã này. Đặt mã này vào sự kiện onclick

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

8
Điều này thực sự không "đóng ứng dụng hoàn toàn" như PeakGen đã hỏi vì ứng dụng vẫn đang chạy nhưng đó là một lựa chọn thay thế tuyệt vời
La masse

2
Tôi không nghĩ như vậy, nếu một hoạt động bắt đầu với CỜ HOẠT ĐỘNG MỚI TASK, cách này không thể thoát khỏi nó
fozua

51

Bạn có thể gọi System.exit (); để thoát ra khỏi tất cả các hoạt động.

    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
Nó chỉ được đưa tôi tới các hoạt động đầu tiên
Lemon Juice

8
@AnchitMittal System.exit (1) sẽ không đảm bảo việc đặt lại ngăn xếp Hoạt động hoặc các tác vụ (xem developer.android.com/guide/components/… ). Do đó, cách tiếp cận này không đảm bảo việc tắt ứng dụng (hủy tất cả các Hoạt động) đúng thời hạn.
IgorGanapolsky

Không phải tất cả hoạt động để thoát.
Jitendra

49

Phương thức finishAffinity, được phát hành trong API 16, đóng tất cả các hoạt động đang diễn ra và đóng ứng dụng:

this.finishAffinity();

Kết thúc hoạt động này cũng như tất cả các hoạt động ngay bên dưới nó trong nhiệm vụ hiện tại có cùng mối quan hệ. Điều này thường được sử dụng khi một ứng dụng có thể được khởi chạy sang một tác vụ khác (chẳng hạn như từ ACTION_VIEW của loại nội dung mà nó hiểu) và người dùng đã sử dụng điều hướng lên để chuyển khỏi tác vụ hiện tại và chuyển sang tác vụ riêng của nó. Trong trường hợp này, nếu người dùng đã điều hướng xuống bất kỳ hoạt động nào khác của ứng dụng thứ hai, tất cả những hoạt động đó sẽ được xóa khỏi tác vụ ban đầu như một phần của công tắc tác vụ.

Lưu ý rằng kết thúc này không cho phép bạn cung cấp kết quả cho hoạt động trước đó và một ngoại lệ sẽ được đưa ra nếu bạn đang cố gắng làm như vậy.


Kể từ API 21, bạn có thể sử dụng:

finishAndRemoveTask();

Hoàn thành tất cả các hoạt động trong nhiệm vụ này và xóa nó khỏi danh sách nhiệm vụ gần đây.

Các lựa chọn thay thế:

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

Nguồn: Cách thoát ứng dụng Android theo lập trình


Hy vọng nó giúp! Chúc may mắn!


2
Không sử dụng System.exit (). Android sẽ cố gắng khởi động lại ứng dụng sau khi thoát. Bạn có thể kết thúc trong một vòng lặp.
AndroidDev

42

Nếu bạn muốn thoát khỏi ứng dụng của mình, hãy sử dụng mã này bên trong sự kiện được nhấn nút của bạ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
Sự khác biệt giữan System.exit (1); và System.exit (0);
Pyae Phyo

System.exit (1) có nghĩa là ứng dụng đã hoàn thành với một số lỗi, trong khi System.exit (0) có nghĩa là ứng dụng đã hoàn thành mà không có bất kỳ lỗi nào. Đây là cách các lệnh linux / unix khác nhau trả về các điều kiện (lỗi) khi thoát.
iOS-Coder


13

Thực tế có hai trường hợp có thể xảy ra:

  1. Bạn có thể muốn thoát khỏi hoạt động
  2. Hoặc bạn muốn thoát khỏi ứng dụng

Bạn có thể thoát khỏi hoạt động bằng mã sau:

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

Nhưng điều này sẽ không giết chết các hoạt động cơ bản trong cùng một ứng dụng. Điều này sẽ chỉ thu nhỏ ứng dụng.

Nếu bạn muốn thoát khỏi ứng dụng, hãy sử dụng mã sau để kết thúc quá trình của nó:

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

để phát triển mono chỉ cần sử dụng

process.KillProcess(Process.MyPid());

Mypid () là phương thức của bạn hay là gì ...... vậy làm thế nào bạn viết Mypid ... bạn phải viết bằng phương thức .....
Amitsharma

@amitsharma MyPid () là một phương pháp từ lớp Process, mà Trả về nhận dạng của quá trình này, có thể được sử dụng với killProcess (int) và sendSignal (int, int)
Kasun

Nó sẽ dừng dịch vụ nền và bộ thu phát sóng hay chỉ đóng ứng dụng một cách an toàn?
Usman Rana

vì vậy, sự khác biệt giữa android.os.Process.killProcess(android.os.Process.myPid()); và là process.KillProcess(Process.MyPid());gì?
DysaniazzZ

7

Làm thế nào về this.finishAffinity()

Từ các tài liệu,

Kết thúc hoạt động này cũng như tất cả các hoạt động ngay bên dưới nó trong nhiệm vụ hiện tại có cùng mối quan hệ. Điều này thường được sử dụng khi một ứng dụng có thể được khởi chạy cho một tác vụ khác (chẳng hạn như từ ACTION_VIEW của loại nội dung mà nó hiểu) và người dùng đã sử dụng điều hướng lên để chuyển khỏi tác vụ hiện tại và chuyển sang tác vụ riêng của nó. Trong trường hợp này, nếu người dùng đã điều hướng xuống bất kỳ hoạt động nào khác của ứng dụng thứ hai, tất cả những hoạt động đó sẽ được xóa khỏi tác vụ ban đầu như một phần của công tắc tác vụ. Lưu ý rằng kết thúc này không cho phép bạn cung cấp kết quả cho hoạt động trước đó và một ngoại lệ sẽ được đưa ra nếu bạn đang cố gắng làm như vậy.


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

Đối với trường hợp của tôi, điều này đã cứu mạng tôi. Cảm ơn bạn!
Lifka

4

điều này sẽ xóa Nhiệm vụ (chồng hoạt động) và bắt đầu Nhiệm vụ mới

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

Giải thích lý do tại sao bạn đăng mã này như một câu trả lời và nó cũng có tác dụng gì.
M. Adeel Khalid

1
Chào mừng bạn đến với Stack Overflow! Mặc dù bạn có thể đã giải quyết được vấn đề của người dùng này, nhưng các câu trả lời chỉ có mã không hữu ích lắm đối với những người dùng đến câu hỏi này trong tương lai. Vui lòng chỉnh sửa câu trả lời của bạn để giải thích tại sao mã của bạn giải quyết được vấn đề ban đầu.
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

đặt cái này vào onClic của bạn:

moveTaskToBack(true);
    finish()

Có chuyện gì với số phiếu phản đối. Đây là câu trả lời. Tôi đã nhận 2 hoạt động, thứ nhất là hoạt động đăng nhập và hoạt động thứ hai là hoạt động .... tôi muốn thoát ứng dụng trong khả năng kết nối và không muốn quay lại hoạt động đăng nhập ... tôi chèn câu trả lời này và bây giờ tôi có thể đóng ứng dụng trong khả năng hoạt động.
Azizi Musa

nếu bạn làm điều này ứng dụng sẽ vẫn được chạy nền
Mohanad Haddadin

Làm việc tốt. Trường hợp của tôi là: splashActivity chạy MainActivity. Khi người dùng nhấn trở lại ứng dụng MainActivity sẽ thoát ra như mong đợi. Tất cả các trường hợp khác được đưa tôi trở lại hoạt động giật gân!
Jviaches

Chà, bạn nên kết thúc hoạt động đăng nhập ngay sau khi đăng nhập xong :) Và câu trả lời tất nhiên là không hoàn toàn chính xác , movewTaskToBackkhông có gì kết thúc nó chỉ ẩn ứng dụng và finishnhư bất kỳ ai khác đã đề cập chỉ kết thúc hiện tại activity. Vì vậy, nó thoát khỏi hoạt động hiện tại và ẩn phần còn lại, nếu có quà. Dù sao nó không nên được một cuộc bỏ phiếu xuống chỉ cho điều này ...
Meow Cát 2012

2

Hãy thử điều này trong một cuộc gọi. Đôi khi tôi sử dụng nó trong onClick of a button.

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

Nó thay vì đóng ứng dụng của bạn, mở trang tổng quan để trông giống như ứng dụng của bạn đã đóng.

đọc câu hỏi này để biết rõ hơn về android - thoát mã ứng dụng


2

Sử dụng this.finishAffinity (); trên nút đó thay vì finish (); Nếu nó không hoạt động thì bạn cũng có thể thử bằng cách thêm android: noHistory = "true" vào tệp kê khai của mình và sau đó kết thúc hoạt động của bạn bằng uisng finish (); hoặc finishAffinity ();

Hy vọng nó giúp....:)


2

Đạt được trong Xamarin.Android:

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

Đây có phải là tham chiếu đến System.Enosystem.Exit hay Android.OS.Enosystem.Exit không?
Moffen

2

Chỉ cần gọi hai hàm này

 finish();
 moveTaskToBack(true);

Câu trả lời của bạn đến trong các bài viết chất lượng thấp hơn Vui lòng cung cấp một số giải thích mặc dù mã của bạn là tự giải thích.
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);

Sử dụng Mã này, nó rất hữu ích và bạn có thể thoát khỏi tất cả các hoạt động.


Tôi đã làm điều này, và sau đó ném điện thoại từ tầng 5, tất cả các hoạt động đóng cửa thanx
Paschalis

1

hoạt động ma được gọi với singletop và finish () trên onCreate sẽ thực hiện thủ thuật



1

Thay vì System.exit (1) Chỉ cần sử dụng System.exit (0)


1

Nếu ai đó vẫn còn thắc mắc, đối với Xamarin.Android (trong trường hợp của tôi là Monogame cũng đang chạy trên nó), lệnh FinishAndRemoveTask()trên Activitythực hiện công việc rất tốt!


1

trong mảnh vỡ

getActivity (). finishAndRemoveTask ();

trong Hoạt động

finishAndRemoveTask ();


0

chỉ cần sử dụng mã trong backpress của bạn

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

0

Nếu bạn đang sử dụng EventBus (hoặc thực sự là bất kỳ thư viện pub / sub nào khác) trong ứng dụng của mình để giao tiếp giữa các hoạt động, bạn có thể gửi cho họ một sự kiện rõ ràng:

final public class KillItWithFireEvent
{
    public KillItWithFireEvent() {}

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

Nhược điểm duy nhất của điều này là bạn cần tất cả các hoạt động để lắng nghe sự kiện này để gọi riêng của họ finish(). Đối với điều này, bạn có thể dễ dàng tạo các lớp hoạt động shim thông qua kế thừa chỉ lắng nghe sự kiện này và để các lớp con triển khai mọi thứ khác, sau đó đảm bảo tất cả các hoạt động của bạn kế thừa từ lớp bổ sung này. Người nghe tiêu diệt thậm chí có thể thêm một số chức năng bổ sung thông qua ghi đè, như tránh cái chết trong một số tình huống cụ thể.


0

Chỉ cần chạy hai dòng dưới đây khi bạn muốn thoát khỏi ứng dụng

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

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

đã làm cho tôi


1
Vui lòng thêm một số giải thích vào mã của bạn. Thêm vào đó, có vẻ như câu trả lời khác đã được bảo hiểm đó - vì vậy bạn cũng nên giải thích những gì làm cho giải pháp của bạn tốt hơn so với những người khác
Nico Haase

0

Chỉ cần gọi cái này:

finishAffinity();

Mặc dù mã này có thể trả lời câu hỏi, nhưng việc cung cấp thêm ngữ cảnh liên quan đến lý do và / hoặc cách mã này trả lời câu hỏi sẽ cải thiện giá trị lâu dài của nó.
Igor F.

0

Liên kết phương pháp này với nút thoát / thoát của bạn

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

-1

Nếu bạn sử dụng cả kết thúc và thoát ứng dụng của bạn sẽ đóng một cách phàn nàn

hoàn thành();

System.exit (0);

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.