프로그래밍 방식으로 Android 앱을 종료하는 방법은 무엇입니까?


93

나는 몇 번 읽었 기 때문에이 질문이 여러 번 요청되었다고 확신합니다. 내 고객은 사용자가 클릭하고 종료 할 수있는 버튼을 앱에 삽입하기를 원합니다. 나는 이것을 읽고 부름 finish()이 그것을 할 것이라는 것을 발견 했습니다. 하지만 마무리는 현재 실행중인 활동 만 닫는 것입니까? 활동이 많기 때문에이 경우에는 모든 활동의 인스턴스를 전달하고 완료하거나 모든 활동을 Singleton 패턴으로 만들어야합니다.

또한 Activity.moveTaskToBack(true)홈 화면으로 이동할 수 있다는 것도 알게되었습니다 . 좋아, 이것은 닫히지 않고 프로세스를 배경 화합니다. 그래서 이것이 효과적입니까?

앱을 완전히 닫으려면 어떤 방법을 사용해야합니까? 위에 설명 된 것 또는 위 방법의 다른 방법 / 다른 사용법이 있습니까?


액션 바를 사용하지 않는 이유. 앱 아이콘을 클릭하면 홈 화면으로 이동합니다. 출구 BACK 버튼 클릭
Raghunandan

@Raghunandan : 내가 언급했듯이 고객 요구 사항 :(
Lemon Juice

이것이 도움이되는지 확인하십시오 android.os.Process.killProcess (android.os.Process.myPid ());
SANorton Stanley


답변:


71

실제로 모든 사람들은 활동이있을 수있는 onclick 이벤트에서 응용 프로그램을 종료하려고합니다 ....

그래서 친구들은이 코드를 시도합니다. onclick 이벤트에이 코드를 넣으십시오.

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

8
이것은 실제로 앱이 아직 실행 중이기 때문에 PeakGen이 요청한 것처럼 "앱을 완전히 닫지"는 않지만 좋은 대안입니다
La masse

2
FLAG 활동 새 작업을 시작 활동이이 방법을 종료 할 수없는 경우 나는 그렇게 생각하지 않습니다
fozua

51

System.exit (); 호출 할 수 있습니다. 모든 활동에서 벗어나기 위해.

    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
그것은 단지 나를 첫 번째 활동으로 데려가는 것입니다
레몬 주스

8
@AnchitMittal System.exit (1)은 활동 스택 또는 작업 재설정을 보장하지 않습니다 ( developer.android.com/guide/components/… 참조 ). 따라서이 접근 방식은 적절한 시간 내에 앱의 적절한 종료 (모든 활동 삭제)를 보장하지 않습니다.
IgorGanapolsky

모든 활동이 종료되는 것은 아닙니다.
Jitendra

49

API 16에서 출시 된 finishAffinity 메서드는 진행중인 모든 활동을 닫고 앱을 닫습니다.

this.finishAffinity();

이 활동과 동일한 선호도를 가진 현재 작업에서 바로 아래에있는 모든 활동을 완료합니다. 일반적으로 애플리케이션이 다른 작업 (예 : 이해하는 콘텐츠 유형의 ACTION_VIEW에서)으로 시작될 수 있고 사용자가 위쪽 탐색을 사용하여 현재 작업에서 벗어나 자신의 작업으로 전환 한 경우에 사용됩니다. 이 경우 사용자가 두 번째 응용 프로그램의 다른 활동으로 이동 한 경우 작업 전환의 일부로 원래 작업에서 모든 작업을 제거해야합니다.

이 완료로 이전 활동에 결과를 전달할 수 없으며 그렇게하려고하면 예외가 발생합니다.


API 21부터 다음을 사용할 수 있습니다.

finishAndRemoveTask();

이 작업의 모든 활동을 완료하고 최근 작업 목록에서 제거합니다.

대안 :

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

출처 : 프로그래밍 방식으로 Android 애플리케이션을 종료하는 방법


도움이 되었기를 바랍니다. 행운을 빕니다!


2
System.exit ()를 사용하지 마십시오. Android는 앱이 종료 된 후 다시 시작을 시도합니다. 루프에 빠질 수 있습니다.
AndroidDev

42

애플리케이션을 종료하려면 버튼 누름 이벤트 내에서 다음 코드를 사용하세요.

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
System.exit (1)의 차이점은 무엇입니까? 및 System.exit (0);
Pyae Phyo

System.exit (1)은 앱이 일부 오류와 함께 완료되었음을 의미하고 System.exit (0)은 앱이 오류없이 완료되었음을 의미합니다. 이것은 다양한 linux / unix 명령이 종료시 (오류) 조건을 반환하는 방법입니다.
iOS-Coder


13

정확히 두 가지 가능한 상황이 있습니다.

  1. 활동을 종료 할 수 있습니다.
  2. 또는 응용 프로그램을 종료하려는 경우

다음 코드를 사용하여 활동을 종료 할 수 있습니다.

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

그러나 이것은 동일한 응용 프로그램의 기본 활동을 종료하지 않습니다. 이것은 응용 프로그램을 최소화합니다.

응용 프로그램을 종료하려면 다음 코드를 사용하여 프로세스를 종료하십시오.

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

모노 개발을 위해 그냥 사용

process.KillProcess(Process.MyPid());

Mypid ()는 당신의 방법입니다 ... 그래서 어떻게 당신이 Mypid를 작성했는지 ... u는 방법으로 작성해야합니다 .....
Amitsharma

@amitsharma MyPid ()는 프로세스 클래스의 메서드로, killProcess (int) 및 sendSignal (int, int)와 함께 사용할 수있는이 프로세스의 식별자를 반환합니다
Kasun

백그라운드 서비스와 브로드 캐스트 수신기도 중지됩니까? 아니면 앱을 안전하게 닫을까요?
Usman Rana

그래서, 차이 무엇 android.os.Process.killProcess(android.os.Process.myPid()); process.KillProcess(Process.MyPid());?
DysaniazzZ

7

어때 this.finishAffinity()

문서에서

이 활동과 동일한 선호도를 가진 현재 작업에서 바로 아래에있는 모든 활동을 완료합니다. 일반적으로 애플리케이션이 다른 작업 (예 : 이해하는 콘텐츠 유형의 ACTION_VIEW에서)으로 시작될 수 있고 사용자가 위쪽 탐색을 사용하여 현재 작업에서 벗어나 자신의 작업으로 전환 한 경우에 사용됩니다. 이 경우 사용자가 두 번째 응용 프로그램의 다른 활동으로 이동 한 경우 작업 전환의 일부로 원래 작업에서 모든 작업을 제거해야합니다. 이 완료로 이전 활동에 결과를 전달할 수 없으며 그렇게하려고하면 예외가 발생합니다.


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

제 경우에는 이것이 제 생명을 구했습니다. 감사합니다!
Lifka

4

작업 (활동 스택)을 지우고 새 작업을 시작합니다.

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

이 코드를 답변으로 게시 한 이유와 그것이 무엇을하는지 설명하십시오.
M. Adeel Khalid

1
Stack Overflow에 오신 것을 환영합니다! 이 사용자의 문제를 해결했을 수 있지만 코드 전용 답변은 나중에이 질문에 오는 사용자에게 그다지 도움이되지 않습니다. 코드가 원래 문제를 해결하는 이유를 설명하기 위해 답변을 편집하십시오.
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

이것을 onClic에 넣으십시오.

moveTaskToBack(true);
    finish()

반대 투표에 무슨 문제가 있습니다. 이것이 답입니다. 나는 2 개의 활동을 가지고 있고, 첫번째는 loginactivity이고 두번째는 mainactivity입니다 .... 나는 mainactivity 내에서 앱을 종료하고 싶고 loginactivity로 돌아가고 싶지 않습니다 ... 나는이 답변을 삽입하고 이제 mainactivity 내에서 앱을 닫을 수 있습니다.
Azizi Musa

이 작업을 수행하면 응용 프로그램은 여전히 ​​백그라운드에서 실행됩니다
Mohanad Haddadin 2015-08-11

잘 작동합니다. 제 경우는 : splashActivity run MainActivity. 사용자가 MainActivity 응용 프로그램을 다시 누르면 예상대로 종료됩니다. 다른 모든 경우는 스플래시 활동으로 돌아갑니다!
Jviaches 2019 년

글쎄, 당신은 곧 로그인의 완성 :) 그 대답은 물론만큼 로그인 활동을 마친해야 완전히 정확하지 , movewTaskToBack그냥 아무것도 완료되지 숨길 응용 프로그램을, 그리고 finish다른 사람 완료는 현재에 의해 언급 한 바와 같이 activity. 따라서 현재 활동을 종료하고 나머지가 있으면 숨 깁니다. 어쨌든 그것은 단지 이것에 대한 하향 표를 얻어서는 안됩니다 ...
Meow Cat 2012

2

전화로 시도하십시오. 나는 때때로 버튼의 onClick에서 그것을 사용합니다.

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

앱을 닫는 대신 대시 보드를 열어 앱이 닫힌 것처럼 보입니다.

더 명확한 안드로이드 를 위해이 질문을 읽으십시오 -애플리케이션 코드 종료


2

this.finishAffinity (); 사용 finish () 대신 해당 버튼에; 작동하지 않으면 매니페스트에 android : noHistory = "true"를 추가하여 시도한 다음 uisng finish (); 또는 finishAffinity ();

도움이 되었기를 바랍니다 .... :)


2

Xamarin.Android에서 달성 :

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

System.Environment.Exit 또는 Android.OS.Environment.Exit에 대한 참조입니까?
Moffen

2

이 두 함수를 호출하십시오.

 finish();
 moveTaskToBack(true);

귀하의 답변은 품질이 낮은 게시물에서 나왔습니다. 코드가 자명 한 경우에도 약간의 설명을 제공하십시오.
Harsha Biyani 2019

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

이 코드를 사용하면 매우 유용하며 모든 활동을 종료 할 수 있습니다.


나는 이것을 한 다음 5 층에서 전화를 던졌고, 모든 활동이 마감되었습니다
Paschalis

1

onCreate에서 singletop 및 finish ()로 호출 된 ghost 활동이 트릭을 수행해야합니다.



1

System.exit (1) 대신 System.exit (0)을 사용하십시오.


1

누군가 여전히 궁금해한다면 Xamarin.Android (내 경우에도 Monogame가 실행) 명령 FinishAndRemoveTask()Activity수행하는 작업을 아주 잘!



0

백 프레스에서 코드를 사용하십시오.

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

0

당신이 사용하는 경우 EventBus를 활동 사이의 통신에 응용 프로그램에서 (또는 정말 다른 술집 / 서브 라이브러리) 당신은 그 (것)들에게 명시 적으로 이벤트를 보낼 수 있습니다 :

final public class KillItWithFireEvent
{
    public KillItWithFireEvent() {}

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

이것의 유일한 단점은이 이벤트를 청취하기 위해 모든 활동이 필요하다는 것입니다. finish() 입니다. 이를 위해 상속을 통해 shim 활동 클래스를 쉽게 생성 할 수 있습니다. 상속을 통해이 이벤트를 수신하고 하위 클래스가 다른 모든 것을 구현하도록 한 다음 모든 활동이이 추가 계층에서 상속되는지 확인합니다. 킬 리스너는 특정 상황에서 죽음을 피하는 것과 같은 오버라이드를 통해 일부 추가 기능을 추가 할 수도 있습니다.


0

응용 프로그램을 종료하려면 아래 두 줄을 실행하십시오.

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

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

나를 위해 일했다


1
코드에 대한 설명을 추가하십시오. 또한 이미 다룬 다른 답변처럼 보이므로 다른 솔루션보다 더 나은 솔루션을 만드는 이유도 설명해야합니다.
니코 하세

0

이것을 호출하십시오.

finishAffinity();

이 코드가 질문에 답할 수 있지만,이 코드가 질문에 답하는 이유 및 / 또는 방법에 대한 추가 컨텍스트를 제공하면 장기적인 가치가 향상됩니다.
Igor F.

0

이 방법을 종료 / 종료 버튼에 연결

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.