Cách thoát ứng dụng Android theo chương trình


321

Tôi đã tìm thấy một số mã để thoát khỏi ứng dụng Android theo chương trình. Bằng cách gọi bất kỳ một trong các mã sau đây trong onDestroy () nó sẽ thoát hoàn toàn ứng dụng?

  1. System.runFinalizersOnExit(true)
    (HOẶC LÀ)
  2. android.os.Process.killProcess(android.os.Process.myPid());

Tôi không muốn chạy ứng dụng của mình trong nền sau khi nhấp vào nút thoát. Xin đề nghị tôi có thể sử dụng bất kỳ một trong những mã này để thoát khỏi ứng dụng của mình không? Nếu vậy tôi có thể sử dụng mã nào? Có phải là cách tốt để thoát khỏi ứng dụng trong Android?


Có rất nhiều bài viết đã ở đây. stackoverflow.com/search?q=how+to+exit+an+android+app
Mudassir


sử dụng 'System.exit (0);' khi bạn thực sự muốn thoát khỏi ứng dụng. Tôi đã thực hiện điều đó với một lỗi không thể phục hồi sau khi hiển thị cho người dùng một tin nhắn. Nếu bạn cần, bạn thậm chí có thể tự động khởi chạy lại ứng dụng bằng Báo thức. Xem: blog.janjonas.net/2010-12-20/
Một người nào đó ở đâu đó vào

Câu trả lời:


397

Vì API 16, bạn có thể sử dụng phương thức finishAffinity, dường như khá gần với việc đóng tất cả các hoạt động liên quan theo tên và mô tả Javadoc của nó:

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 một 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 ra khỏi tác vụ hiện tại và vào nhiệm 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ẽ bị xóa khỏi tác vụ ban đầu như một phần của chuyển đổi 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 thực hiện.


Vì API 21, bạn có thể sử dụng một lệnh rất giống nhau

finishAndRemoveTask();

Kết thúc tất cả các hoạt động trong nhiệm vụ này và loại bỏ nó khỏi danh sách nhiệm vụ gần đây.


28
Chắc chắn đây là câu trả lời đúng! Đây không phải là một giải pháp tốt để hoàn thành một ứng dụng System.exit(0);. Cảm ơn bạn vì câu trả lời! Cuối cùng tôi đã tìm thấy một giải pháp tốt.
Antonio

4
Bạn có biết nếu có một giải pháp khác trên API 14 không? Cảm ơn
Script Kitty

2
Bạn có thể kết thúc () từng hoạt động riêng lẻ, khi bạn đóng ứng dụng hoặc bên trong vòng đời hoạt động.
sivi

3
CẢNH BÁO! this.finishAffinity () đóng ứng dụng xóa nó khỏi bộ nhớ, vì vậy bạn sẽ không nhận được tin nhắn đẩy và vì vậy.
Tincho825

7
Giải pháp này hoạt động 99% trường hợp. Tuy nhiên, nó sẽ không phá hủy quy trình, vì vậy, ví dụ Dagger sẽ không bị xóa. Trong những trường hợp hiếm hoi đó, khi yêu cầu giết quá trình, System.exit(0)là giải pháp duy nhất hiệu quả với tôi.
Slav

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

đây là cách tốt nhất để thoát khỏi ứng dụng của bạn. !!!

Giải pháp tốt nhất cho tôi.


yeah, làm việc tuyệt vời Phải gọi nó từ MainActivity để làm cho nó hoạt động!
mz87

Giải pháp hoàn hảo. Không cần phải chấm dứt quá trình, vì Android biết rõ nhất để quản lý bộ nhớ. Tuy nhiên, điều này cung cấp một giải pháp để kết thúc hoạt động, cũng như thoát khỏi ứng dụng để thuận tiện cho người dùng.
IAmTheSquidward

Giải pháp hoàn hảo thực sự. Đã sửa rất nhiều vấn đề. Cảm ơn.
superuserdo

26
Tôi không nghĩ rằng đây là một giải pháp tốt. Bạn không nên hoàn thành chương trình của mình bằng cách sử dụng System.exit(0);. Giải pháp đúng được đăng bởi @sivi (câu trả lời của anh ấy ở trên)
Antonio

13
đây không phải là giải pháp, nó không hoạt động nếu bạn có một đống hoạt động
user3290180

46

finishAffinity();

System.exit(0);

Nếu bạn sẽ chỉ sử dụng finishAffinity();mà không có System.exit(0);ứng dụng của bạn sẽ thoát nhưng bộ nhớ được phân bổ sẽ vẫn được sử dụng bởi điện thoại của bạn, vì vậy ... nếu bạn muốn xóa sạch và thực sự thoát khỏi ứng dụng, hãy sử dụng cả hai.

Đây là phương pháp đơn giản nhất và hoạt động ở bất cứ đâu, thoát ứng dụng thật, bạn có thể mở rất nhiều hoạt động sẽ vẫn thoát khỏi tất cả mà không có vấn đề gì.

ví dụ trên một nút bấm

public void exitAppCLICK (View view) {

    finishAffinity();
    System.exit(0);

}

hoặc nếu bạn muốn một cái gì đó đẹp, ví dụ với hộp thoại cảnh báo có 3 nút CÓ KHÔNG và HỦY BỎ

// alertdialog for exit the app
AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(this);

// set the title of the Alert Dialog
alertDialogBuilder.setTitle("your title");

// set dialog message
alertDialogBuilder
        .setMessage("your message")
        .setCancelable(false)
        .setPositiveButton("YES"),
                new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog,
                                        int id) {
                        // what to do if YES is tapped
                        finishAffinity();
                        System.exit(0);
                    }
                })

        .setNeutralButton("CANCEL"),
                new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog,
                                        int id) {
                        // code to do on CANCEL tapped
                        dialog.cancel();
                    }
                })

        .setNegativeButton("NO"),
                new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog,
                                        int id) {
                        // code to do on NO tapped
                        dialog.cancel();
                    }
                });

AlertDialog alertDialog = alertDialogBuilder.create();

alertDialog.show();

3
Đây là câu trả lời đúng, tôi đang tìm kiếm. cảm ơn
lũa

Nếu tôi đã sử dụng FCM hoặc các tác vụ nền trong ứng dụng của mình, tôi sẽ không gặp vấn đề gì?
roghayeh hosseini

Đây là những gì tôi cần để xóa ứng dụng khỏi bộ nhớ
A1m

vui lòng không sử dụng System.exit(0);Bạn không nên giải phóng bộ nhớ đó, hệ thống sẽ làm điều đó cho bạn nếu cần. Đây là hành vi dự định.
crgarridos

30

Hãy suy nghĩ thực sự khó khăn nếu bạn cần phải hủy ứng dụng: tại sao không để HĐH tìm ra nơi nào và khi nào giải phóng tài nguyên?

Mặt khác, nếu bạn thực sự chắc chắn, hãy sử dụng

finish();

Như một phản ứng với nhận xét của @dave appleton: Điều đầu tiên là đọc câu hỏi / câu trả lời lớn kết hợp @gabriel đã đăng: Việc bỏ một ứng dụng có được tán thành không?

Bây giờ giả sử chúng ta có điều đó, câu hỏi ở đây vẫn có câu trả lời, đó là mã bạn cần nếu bạn đang làm bất cứ điều gì với việc bỏ thuốc lá finish(). Rõ ràng là bạn có thể có nhiều hơn một hoạt động, v.v., nhưng đó không phải là vấn đề. Hãy chạy theo một số trường hợp sử dụng

  1. Bạn muốn cho phép người dùng thoát mọi thứ vì sử dụng bộ nhớ và "không chạy trong nền? Nghi ngờ. Hãy để người dùng dừng một số hoạt động nhất định trong nền, nhưng hãy để HĐH tiêu diệt mọi sự phục hồi không cần thiết.
  2. Bạn muốn người dùng không đi đến hoạt động trước đó của ứng dụng của bạn? Vâng, hoặc cấu hình nó để nó không, hoặc bạn cần một tùy chọn bổ sung. Nếu hầu hết thời gian back = hoạt động trước hoạt động, người dùng sẽ không nhấn vào nhà nếu anh ấy / cô ấy muốn làm gì khác?
  3. Nếu bạn cần một số loại thiết lập lại, bạn có thể tìm hiểu xem / làm thế nào / vv ứng dụng của bạn đã thoát và nếu hoạt động của bạn được tập trung trở lại, bạn có thể thực hiện hành động đó, hiển thị màn hình mới thay vì khởi động lại nơi bạn đang ở.

Vì vậy, cuối cùng, tất nhiên, finish()không giết chết mọi thứ, nhưng nó vẫn là công cụ bạn cần tôi nghĩ. Nếu có một usecase cho "giết tất cả các hoạt động", tôi chưa tìm thấy nó.


30
Gọi finish()sẽ không giết ứng dụng. finish()được sử dụng mọi lúc: Call this when your activity is done and should be closed.Đó là hiệu ứng tương tự như nhấn nút "quay lại".
Tanner Perrien

Kết thúc sẽ giết chết hoạt động. Làm thế nào là khác nhau sau đó giết chết các tràng pháo tay?
Nanne

Không có gì sai khi "hoàn thiện" hoặc "giết" Activity(không phải Application). Ví dụ: bạn có thể bắt đầu một hoạt động mới để hiển thị cho người dùng một số thông tin. Sau khi hết thời gian hoặc nhấn 'OK', bạn có thể gọi finish()để quay lại hoạt động gọi.
Tanner Perrien

42
Hầu hết các ứng dụng Android có nhiều hơn một hoạt động.
CommonsWare

4
@Nanne - Màn hình khóa là một ví dụ về thời điểm bạn muốn dừng tất cả các hoạt động. Giả sử bạn đăng nhập vào một ứng dụng ngân hàng. Sau một khoảng thời gian nhất định không có tương tác từ người dùng, màn hình khóa sẽ khởi chạy. Bạn sẽ muốn dừng tất cả các hoạt động nếu ai đó nhấn nút quay lại từ màn hình khóa!
Jabari

19

Tôi nghĩ rằng ứng dụng nên được giết trong một số trường hợp. Ví dụ, có một ứng dụng chỉ có thể được sử dụng sau khi đăng nhập. Hoạt động đăng nhập có hai nút, 'đăng nhập' và 'hủy'. Khi bạn nhấp vào nút 'hủy', điều đó chắc chắn có nghĩa là 'Chấm dứt ứng dụng'. Không ai muốn ứng dụng còn sống trong nền. Vì vậy, tôi đồng ý rằng một số trường hợp cần phải tắt ứng dụng.


2
Tôi hoàn toàn đồng ý với trường hợp sử dụng này. Ngoài ra, hãy xem xét ứng dụng bảo mật của tôi phải có sẵn ở một vị trí nhất định và tốt nhất nên đóng nếu người dùng không ở vị trí đó. Tôi làm gì?
Sydwell

18

Tạo một ExitActivityvà khai báo nó trong bảng kê khai. Và gọi ExitActivity.exit(context)cho ứng dụng thoát.

public class ExitActivity extends AppCompatActivity {

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

    public static void exit(Context context) {
        Intent intent = new Intent(context, ExitActivity.class);
        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
        context.startActivity(intent);
    }

}

Đây là câu trả lời được bình chọn nhiều nhất tuy nhiên nó là một hack. Kết thúc cuộc gọi trong onCreate sẽ có vẻ rối mắt trên hầu hết các thiết bị.
DoruChidean

Hmm nó là một hack nhưng không phải là trục trặc. Đầu tiên thoát () bạn sẽ gọi, nó xuất hiện ở đầu tất cả các hoạt động với đầu trang rõ ràng và các nhiệm vụ sau đó tự hoàn thành. Ở đây bạn THOÁT.
vivek

1
Hãy nhớ khai báo lớp này trong bảng kê khai của bạn. +1 cho hack thông minh mặc dù.
TASlim Oseni

Điều này đã làm việc! đã bình chọn
TuấnDPH

17

Không có ứng dụng bỏ trong Android , SampleActivity.this.finish (); sẽ kết thúc hoạt động hiện tại.

Khi bạn chuyển từ hoạt động này sang hoạt động khác, hãy hoàn thành hoạt động trước đó

Intent homeintent = new Intent(SampleActivity.this,SecondActivity.class);
startActivity(homeintent);
SampleActivity.this.finish();

13

Trước hết, cách tiếp cận này đòi hỏi tối thiểu Api 16.

Tôi sẽ chia giải pháp này thành 3 phần để giải quyết vấn đề này rộng rãi hơn.

1. Nếu bạn muốn thoát ứng dụng trong Hoạt động, hãy sử dụng đoạn mã này:

if(Build.VERSION.SDK_INT>=16 && Build.VERSION.SDK_INT<21){
    finishAffinity();
} else if(Build.VERSION.SDK_INT>=21){
    finishAndRemoveTask();
}

2. Nếu bạn muốn thoát khỏi ứng dụng trong lớp Không hoạt động có quyền truy cập vào Hoạt động thì hãy sử dụng đoạn mã này:

if(Build.VERSION.SDK_INT>=16 && Build.VERSION.SDK_INT<21){
    getActivity().finishAffinity();
} else if(Build.VERSION.SDK_INT>=21){
    getActivity().finishAndRemoveTask();
}

3. Nếu bạn muốn thoát khỏi ứng dụng trong một lớp Không hoạt động và không thể truy cập vào Hoạt động như Dịch vụ, tôi khuyên bạn nên sử dụng BroadcastReceiver. Bạn có thể thêm phương pháp này vào tất cả các Hoạt động trong dự án của bạn.

Tạo các biến đối tượng LocalBroadcastManager và BroadcastReceiver. Bạn có thể thay thế getPackageName () + ". Đóng lại" nếu bạn muốn.

LocalBroadcastManager mLocalBroadcastManager;
BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        if(intent.getAction().equals(getPackageName()+".closeapp")){
            if(Build.VERSION.SDK_INT>=16 && Build.VERSION.SDK_INT<21){
                finishAffinity();
            } else if(Build.VERSION.SDK_INT>=21){
                finishAndRemoveTask();
            }
        }
    }
};

Thêm chúng vào phương thức Activity của onCreate ().

mLocalBroadcastManager = LocalBroadcastManager.getInstance(this);
IntentFilter mIntentFilter = new IntentFilter();
mIntentFilter.addAction(getPackageName()+".closeapp");
mLocalBroadcastManager.registerReceiver(mBroadcastReceiver, mIntentFilter);

Ngoài ra, đừng quên gọi người nhận không đăng ký tại phương thức Hoạt động của onDestroy ()

mLocalBroadcastManager.unregisterReceiver(mBroadcastReceiver);

Để thoát ứng dụng, bạn phải gửi truyền phát bằng LocalBroadcastManager mà tôi sử dụng trong lớp PlayService mở rộng Dịch vụ.

LocalBroadcastManager localBroadcastManager = LocalBroadcastManager.getInstance(PlayService.this);
localBroadcastManager.sendBroadcast(new Intent(getPackageName() + ".closeapp"));

10

Bạn có thể sử dụng finishAndRemoveTask ()từ API 21

công khai void finishAndRemoveTask ()

Kết thúc tất cả các hoạt động trong nhiệm vụ này và loại bỏ nó khỏi danh sách nhiệm vụ gần đây.


8

Nó phụ thuộc vào tốc độ bạn muốn đóng ứng dụng của bạn.

Một cách an toàn để đóng ứng dụng của bạn là finishAffinity ();

Nó đóng ứng dụng của bạn sau khi tất cả các quá trình xử lý kết thúc. Điều này có thể cần một chút thời gian. Nếu bạn đóng ứng dụng của mình theo cách này và khởi động lại ứng dụng sau một thời gian ngắn, có thể ứng dụng mới của bạn chạy trong cùng một quy trình. Với tất cả các quy trình chưa hoàn thành và các đối tượng đơn lẻ của ứng dụng cũ.

Nếu bạn muốn chắc chắn, ứng dụng của bạn đã được đóng hoàn toàn, hãy sử dụng System.exit (0);

Điều này sẽ đóng ứng dụng của bạn ngay lập tức. Nhưng có thể, bạn làm hỏng các tệp mà ứng dụng của bạn đã mở hoặc chỉnh sửa các tùy chọn chia sẻ không hoàn thành. Vì vậy, sử dụng cẩn thận.

Nếu bạn sử dụng watchdog kết hợp với một tác vụ chạy dài, bạn có thể thấy ảnh hưởng của các phương thức khác nhau.

new ANRWatchDog(2000).setANRListener(new ANRWatchDog.ANRListener() {
    public void onAppNotResponding(ANRError error) {
        MainActivity.this.finishAffinity();
        System.exit(0);
    }
}).start();
for(int i = 0; i < 10; ++i){
    --i;
}

Điều này sẽ giết ứng dụng của bạn sau 2 giây mà không hiển thị hộp thoại ANR hoặc đại loại như thế. Nếu bạn xóa System.exit (0) , hãy chạy mã này và khởi động lại ứng dụng sau khi đóng, bạn sẽ gặp một số hành vi lạ, bởi vì vòng lặp vô tận vẫn đang chạy.


8

Bạn đã sử dụng tốt hơn finish()nếu bạn đang ở trong Activityhoặc getActivity().finish()nếu bạn đang ở trongFragment .

Nếu bạn muốn thoát hoàn toàn ứng dụng, hãy sử dụng:

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

6

Cách dễ dàng và đơn giản để thoát khỏi ứng dụng

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

Điều này chỉ mang lại màn hình chính hoặc thực sự giết chết ứng dụng?
rpattabi

6

Chúng tôi muốn mã mạnh mẽ và đơn giản. Giải pháp này hoạt động trên các thiết bị cũ và các thiết bị mới hơn.

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
        getActivity().finishAffinity();
    } else{
        getActivity().finish();
        System.exit( 0 );
    }

5

Tôi nghĩ những gì bạn đang tìm kiếm là đây

activity.moveTaskToBack(Boolean nonRoot);


5

Tương tự như @MobileMateo, nhưng trong Kotlin

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
    this.finishAffinity()
} else{
    this.finish()
    System.exit(0)
}

4

Tôi không chắc điều này có được tán thành hay không, nhưng đây là cách tôi làm ...

Bước 1 - Tôi thường có một lớp chứa các phương thức và biến mà tôi muốn truy cập trên toàn cầu. Trong ví dụ này tôi sẽ gọi nó là lớp "Ứng dụng". Tạo một biến Activity tĩnh bên trong lớp cho từng hoạt động mà ứng dụng của bạn có. Sau đó, tạo một phương thức tĩnh gọi là "close" sẽ chạy finish()phương thức trên từng biến Activity đó nếu chúng KHÔNG null . Nếu bạn có một hoạt động chính / phụ huynh, hãy đóng nó lần cuối:

public class App
{
    ////////////////////////////////////////////////////////////////
    // INSTANTIATED ACTIVITY VARIABLES
    ////////////////////////////////////////////////////////////////

        public static Activity activity1;
        public static Activity activity2;
        public static Activity activity3;

    ////////////////////////////////////////////////////////////////
    // CLOSE APP METHOD
    ////////////////////////////////////////////////////////////////

        public static void close()
        {
            if (App.activity3 != null) {App.activity3.finish();}
            if (App.activity2 != null) {App.activity2.finish();}
            if (App.activity1 != null) {App.activity1.finish();}
        }
}

Bước 2 - trong mỗi hoạt động của bạn, ghi đè onStart()onDestroy()phương thức. Trong onStart(), đặt biến tĩnh trong lớp Ứng dụng của bạn bằng " this". Trong onDestroy(), đặt nó bằng null. Ví dụ: trong lớp "Activity1":

@Override
public void onStart()
{
    // RUN SUPER | REGISTER ACTIVITY AS INSTANTIATED IN APP CLASS

        super.onStart();
        App.activity1 = this;
}

@Override
public void onDestroy()
{
    // RUN SUPER | REGISTER ACTIVITY AS NULL IN APP CLASS

        super.onDestroy();
        App.activity1 = null;
}

Bước 3 - Khi bạn muốn đóng ứng dụng của mình, chỉ cần gọiApp.close() từ bất cứ đâu. Tất cả các hoạt động ngay lập tức sẽ đóng cửa! Vì bạn chỉ đóng các hoạt động và không tự giết ứng dụng (như trong ví dụ của bạn), Android có thể tự do tiếp quản từ đó và thực hiện bất kỳ việc dọn dẹp cần thiết nào.

Một lần nữa, tôi không biết nếu điều này sẽ được nhăn mặt vì bất kỳ lý do. Nếu vậy, tôi rất thích đọc bình luận về lý do tại sao và làm thế nào để cải thiện nó!


Thật thú vị, tôi cũng sẽ quan tâm đến những gì các nhà phát triển Android có kinh nghiệm khác nghĩ về điều này.
Rudi Kershaw

4
Bằng cách giữ một tham chiếu đến hoạt động của bạn, bạn thực sự bị rò rỉ bộ nhớ! Xem điều này cho một cuộc thảo luận sâu sắc.
Managearm

@Managarm Tiền đề đằng sau bài đăng đó là biến tĩnh sẽ tồn tại ngay cả sau khi quá trình (trong trường hợp này, Hoạt động) đã bị hủy. Nếu việc dọn dẹp nhà cửa đúng cách được thực hiện, thì đó không phải là vấn đề ... vì vậy lý do tôi vô hiệu hóa tham chiếu trong phương thức onDestroy () của hoạt động.
Jabari

@Jabari Ah, tôi đã bỏ lỡ phần onDestroy. Trong trường hợp đó, đó không phải là một vấn đề, mặc dù đó không phải là cách thực hành tốt nhất.
Managearm

1
làm việc mà không có vấn đề gì Để api>=16sử dụng finishAffinity()khác sử dụng phương pháp này.
Ông Nobody

4

Là bỏ một ứng dụng nhăn mặt? . Đi qua liên kết này. Nó trả lời câu hỏi của bạn. Hệ thống thực hiện công việc giết một ứng dụng.

Giả sử bạn có hai hoạt động A an B. Bạn điều hướng từ A đến B. Khi bạn nhấp vào nút quay lại, hoạt động B của bạn được bật ở dạng backstack và bị phá hủy. Hoạt động trước trong hoạt động ngăn xếp trở lại A lấy trọng tâm.

Bạn nên để nó vào hệ thống để quyết định khi nào hủy ứng dụng.

khoảng trống công cộng finish()

Gọi đây khi hoạt động của bạn được thực hiện và nên được đóng lại.

Giả sử bạn có nhiều hoạt động. bạn có thể sử dụng thanh Action. Khi nhấp vào biểu tượng trang chủ điều hướng đến MainActivity của ứng dụng của bạn. Trong MainActivity bấm nút quay lại để thoát khỏi ứng dụng.


3

Để thoát khỏi ứng dụng của bạn, bạn có thể sử dụng như sau:

getActivity().finish();
Process.killProcess(Process.myPid());
System.exit(1);

Ngoài ra, để dừng các dịch vụ, hãy gọi phương thức sau:

private void stopServices() {        
    final ActivityManager activityManager = SystemServices.getActivityManager(context);
    final List<ActivityManager.RunningServiceInfo> runningServices = activityManager.getRunningServices(Integer.MAX_VALUE);
    final int pid = Process.myPid();
    for (ActivityManager.RunningServiceInfo serviceInfo : runningServices) {
        if (serviceInfo.pid == pid && !SenderService.class.getName().equals(serviceInfo.service.getClassName())) {
            try {
                final Intent intent = new Intent();
                intent.setComponent(serviceInfo.service);
                context.stopService(intent);
            } catch (SecurityException e) { 
                 // handle exception
            }
        }
    }
}

2

Điều này có thể rất muộn và cũng theo hướng dẫn mà bạn không có nghĩa vụ phải tự mình xử lý quy trình vòng đời (như os thực hiện điều đó cho bạn). Một gợi ý là bạn nên đăng ký một máy thu quảng bá trong tất cả các hoạt động của mình bằng " finish()" trong onReceive() & bất cứ khi nào bạn muốn thoát, bạn có thể đơn giản thực hiện một ý định chỉ ra rằng tất cả các hoạt động phải tắt ..... Mặc dù hãy chắc chắn rằng bạn làm " hủy đăng ký "người nhận trong onDestroy()phương thức của bạn .


1

Đó không phải là một quyết định tốt, vì nó chống lại các nguyên tắc xử lý ứng dụng của Android. Android không giết bất kỳ quá trình nào trừ khi nó hoàn toàn không thể tránh khỏi. Điều này giúp các ứng dụng bắt đầu nhanh hơn, vì chúng luôn được giữ trong bộ nhớ. Vì vậy, bạn cần một lý do rất đặc biệt để giết quá trình ứng dụng của bạn.


4
đăng xuất khỏi một ứng dụng đòi hỏi phải thực sự giết ứng dụng. vì vậy cần có một cách để đảm bảo ứng dụng bị tắt sau khi đăng xuất
anonim

1

Giải pháp chính xác và chính xác để thoát khỏi ứng dụng khi nhấp vào nút là sử dụng mã dưới đây:

// Bật nút Quay lại sự kiện

public void onBackPressed()
{ 
   moveTaskToBack(true);
   finish();
}

Đây hoàn toàn là thành phần Android hiện tại (ví dụ như hoạt động), không phải toàn bộ ứng dụng .
Laogeodritt

Điều này sẽ chỉ gửi ứng dụng trong nền
Kumar Gaurav

1

Nếu bạn đang sử dụng Kotlin, cách thích hợp để thoát khỏi ứng dụng và thay thế System.exit()là phương pháp tích hợp sẵn

exitProcess(0)

Xem tài liệu .

Số 0là một tham số có nghĩa là lối ra được dự định và không có lỗi xảy ra.


0

Điều này sẽ giết bất cứ điều gì;)

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

0

Thử cái này

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

0

Cách dễ nhất mà tôi tìm thấy để thoát ứng dụng khỏi một hoạt động, không vi phạm logic của Android và không thêm mã trong các hoạt động hiện có và chuyển các tính năng bổ sung là như sau:

public static void quitApplication (Activity currentActivity) {
    Intent intent = new Intent (currentActivity, QuitApplicationActivity.class);
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);

    currentActivity.startActivity (intent);
    currentActivity.finish ();
}

sự QuitApplicationActivitytồn tại:

public class QuitApplicationActivity extends AppCompatActivity {

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

        finish ();
    }
}

0

Câu trả lời của @Sivi đóng ứng dụng. Nhưng khi trở về, nếu bạn có một số hoạt động trẻ em, một hoạt động chưa hoàn thành khác có thể được mở ra. Tôi đã thêm vào noHistory:truecác hoạt động của mình để ứng dụng trở lại bắt đầu từ MainActivity.

<activity 
      android:name=".MainActivity"
      android:noHistory="true">
</activity>

0

Chỉ cần thêm một vào danh sách các phương thức tàn bạo để chấm dứt Ứng dụng:

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


Process.killProcess(Process.myPid())thực hiện tương tự, nhưng ngắn hơn
ivan8m8

-1

bạn có thể thoát toàn bộ ứng dụng của mình. do đó

Intent intent = getBaseContext().getPackageManager()
             .getLaunchIntentForPackage(getBaseContext().getPackageName());
intent .addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);

nó sẽ hoạt động 100%. May mắn nhất!


1
Nó dường như không có câu trả lời cho câu hỏi này!
Al-Mothafar

-4

Chỉ cần sử dụng kết thúc () trên phím quay lại, nhấn onKeypressed ()


4
finish () sẽ đóng một Activity, nhưng chắc chắn sẽ không đóng toàn bộ ứng dụng một cách chắc chắn.
2Dee
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.