IT

프로그래밍 방식으로 안드로이드 응용 프로그램을 종료하는 방법

lottoking 2020. 3. 19. 08:30
반응형

프로그래밍 방식으로 안드로이드 응용 프로그램을 종료하는 방법


프로그래밍 방식으로 Android 응용 프로그램을 종료하기위한 코드를 찾았습니다. onDestroy ()에서 다음 코드 중 하나를 호출하면 응용 프로그램이 완전히 종료됩니까?

  1. System.runFinalizersOnExit(true)
    (또는)
  2. android.os.Process.killProcess(android.os.Process.myPid());

종료 버튼을 클릭 한 후 백그라운드에서 응용 프로그램을 실행하고 싶지 않습니다. Pls는이 코드 중 하나를 사용하여 응용 프로그램을 종료 할 수 있다고 제안합니까? 그렇다면 어떤 코드를 사용할 수 있습니까? Android에서 앱을 종료하는 좋은 방법입니까?


API 16부터 finishAffinity 메소드를 사용할 수 있습니다. finishAffinity 메소드는 이름과 Javadoc 설명으로 모든 관련 활동을 닫는 것과 매우 비슷합니다.

this.finishAffinity ();

현재 작업에서 동일한 선호도를 가진 바로 아래의 모든 활동뿐만 아니라이 활동을 완료하십시오. 이것은 일반적으로 응용 프로그램을 다른 작업 (예 : 이해하는 콘텐츠 유형의 ACTION_VIEW에서)으로 시작할 수 있고 사용자가 위로 탐색을 사용하여 현재 작업에서 자체 작업으로 전환 한 경우에 사용됩니다. 이 경우 사용자가 두 번째 응용 프로그램의 다른 활동으로 이동 한 경우 모든 작업을 작업 스위치의 일부로 원래 작업에서 제거해야합니다.

이 마무리를 통해 이전 활동에 결과를 전달할 수 없으며 그렇게하려고하면 예외가 발생합니다.


API 21 부터 매우 유사한 명령을 사용할 수 있습니다

finishAndRemoveTask ();

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


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

이것이 앱을 종료하는 가장 좋은 방법입니다. !!!

나를위한 최고의 솔루션.


finishAffinity();

System.exit(0);

응용 프로그램 finishAffinity();없이 만 사용 System.exit(0);하지만 휴대 전화에서 할당 된 메모리를 계속 사용하고 있다면 깨끗하고 실제로 응용 프로그램을 종료하려면 두 가지를 모두 사용하십시오.

이것은 가장 간단한 방법이며 어디에서나 작동하며 실제 앱을 종료하면 많은 활동을 열 수 있지만 여전히 문제없이 종료됩니다.

버튼 클릭 예

public void exitAppCLICK (View view) {

    finishAffinity();
    System.exit(0);

}

또는 예를 들어 3 개의 버튼이있는 경고 대화 상자를 사용하여 예를 들어 취소하고 취소하는 것이 좋습니다.

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

응용 프로그램을 종료해야 할 경우에 대해 정말로 열심히 생각하십시오.

그렇지 않으면 정말 확실하다면

finish();

@ dave appleton의 의견에 대한 반응으로 : 먼저 큰 질문 / 답변 콤보 @ gabriel를 게시하십시오. 응용 프로그램을 끝내는 것이 찡그림 입니까?

이제 우리가 그것을 가지고 있다고 가정 할 때, 여기 질문은 여전히 ​​답을 가지고 있습니다 finish(). 종료로 무언가를 할 때 필요한 코드는 입니다. 분명히 당신은 하나 이상의 활동 등을 가질 수 있지만, 요점이 아닙니다. 일부 유스 케이스로 실행할 수 있습니다.

  1. 메모리 사용 및 "백그라운드에서 실행되지 않음"으로 인해 사용자가 모든 것을 종료하도록하려고합니다. 의심 할 여지가 없습니다. 사용자가 백그라운드에서 특정 활동을 중지하게하면서 OS가 불필요한 명령을 종료하도록합니다.
  2. 사용자가 앱의 이전 활동으로 이동하지 않기를 원하십니까? 필요하지 않도록 구성하거나 추가 옵션이 필요합니다. 대부분의 경우 back = previous-activity가 작동하는 경우 사용자가 다른 작업을 수행하려는 경우 집으로 돌아 가지 않습니까?
  3. 어떤 종류의 재설정이 필요한 경우 응용 프로그램이 종료되었는지 여부 / 방법 / 등을 확인할 수 있으며 활동에 다시 초점이 맞으면 조치를 취할 수 있습니다.

결국 결국 finish()모든 것을 죽이지 않지만 여전히 내가 생각하는 도구입니다. "모든 활동 종료"에 대한 사용 사례가 있다면 아직 찾지 못했습니다.


어떤 경우에는 응용 프로그램을 종료해야한다고 생각합니다. 예를 들어, 로그인 후에 만 ​​앱을 사용할 수 있습니다. 로그인 활동에는 '로그인'과 '취소'의 두 가지 버튼이 있습니다. '취소'버튼을 클릭하면 '앱 종료'를 의미합니다. 아무도 백그라운드에서 앱을 살기를 원하지 않습니다. 따라서 일부 경우 앱을 종료해야한다는 데 동의합니다.


android에는 응용 프로그램이 종료되지 않습니다 . SampleActivity.this.finish (); 현재 활동을 완료합니다.

한 활동에서 다른 활동으로 전환 할 때 이전 활동을 완료하십시오.

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

ExitActivity만들고 매니페스트에 선언하십시오. 그리고 ExitActivity.exit(context)앱 종료를 요청하십시오 .

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

}

앱을 얼마나 빨리 닫을 지에 따라 다릅니다.

앱을 닫는 안전한 방법은 finishAffinity ();

모든 프로세스가 처리를 마친 후에 앱을 닫습니다. 시간이 좀 걸릴 수 있습니다. 이 방법으로 앱을 닫고 잠시 후에 다시 시작하면 새 응용 프로그램이 동일한 프로세스에서 실행될 수 있습니다. 이전 응용 프로그램의 모든 완료되지 않은 프로세스와 단일 객체로.

확실하게하려면 앱이 완전히 닫혀 있는지 확인하십시오. System.exit (0);

앱이 즉시 닫힙니다. 그러나 앱에서 열었던 파일이 손상되었거나 공유 환경 설정 편집이 완료되지 않을 수 있습니다. 따라서 이것을 신중하게 사용하십시오.

워치 독을 장시간 실행되는 작업과 함께 사용하면 다른 방법의 영향을 볼 수 있습니다.

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

ANR 대화 상자 등을 표시하지 않고 2 초 후에 앱을 종료합니다. System.exit (0) 을 제거 하고이 코드를 실행하고 앱을 닫은 후 앱을 다시 시작하면 끝없는 루프가 계속 실행되므로 이상한 동작이 발생합니다.


finishAndRemoveTask ()API 21에서 사용할 수 있습니다

공공 무효 finishAndRemoveTask ()

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


당신은 더 나은 사용했다 finish()당신이있는 경우 Activity, 또는 getActivity().finish()당신은에있는 경우 Fragment.

앱을 완전히 종료하려면 다음을 사용하십시오.

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

우선,이 접근법에는 최소 Api 16이 필요합니다.

이 문제를보다 광범위하게 해결하기 위해이 솔루션을 3 개 부분으로 나누겠습니다.

1. 활동 에서 응용 프로그램을 종료 하려면이 코드 스 니펫을 사용하십시오.

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

2. Activity 에 액세스 할 수 있는 비 Activity 클래스 에서 응용 프로그램을 종료 하려면이 코드 스 니펫을 사용하십시오.

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

3. 비 활동 클래스에서 응용 프로그램을 종료하고 서비스와 같은 활동에 액세스 할 수없는 경우 BroadcastReceiver를 사용하는 것이 좋습니다. 이 접근 방식을 프로젝트의 모든 활동에 추가 할 수 있습니다.

LocalBroadcastManager 및 BroadcastReceiver 인스턴스 변수를 작성하십시오. 원하는 경우 getPackageName () + ". closeapp"를 바꿀 수 있습니다.

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

Activity의 onCreate () 메소드에 추가하십시오.

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

또한 활동의 ​​onDestroy () 메소드에서 unregister 수신자를 호출하는 것을 잊지 마십시오

    mLocalBroadcastManager.unregisterReceiver(mBroadcastReceiver);

응용 프로그램을 종료하려면 서비스를 확장하는 PlayService 클래스에서 사용하는 LocalBroadcastManager를 사용하여 브로드 캐스트를 보내야합니다.

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

응용 프로그램을 종료하는 쉽고 간단한 방법

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

이것이 찡그림인지 확실하지 않지만, 이것이 내가하는 방법입니다 ...

1 단계- 일반적으로 전 세계에 액세스하려는 메소드와 변수가 포함 된 클래스가 있습니다. 이 예에서는 "App"클래스라고합니다. 앱에있는 각 활동에 대해 클래스 내에 정적 활동 변수를 작성하십시오. 그런 다음 "close"라는 정적 메소드를 작성하여 finish()해당 활동 변수 각각이 널이 아닌 경우 각각의 활동 변수 에서 메소드를 실행하십시오 . 주 / 부모 활동이있는 경우 마지막으로 닫으십시오.

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

2 단계- 각 활동에서 onStart()onDestroy()메소드를 대체하십시오 . 에서 onStart()앱 클래스의 정적 변수 "로 동일하게 설정 this". 에서 onDestroy()로 설정하십시오 null. 예를 들어 "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;
}

3 단계- 앱을 닫으려면 App.close()어디서나 전화 하면됩니다. 모든 인스턴스화 된 활동이 종료됩니다! 활동을 닫고 앱 자체를 종료하지 않기 때문에 (예와 같이) Android는 무료로 가져와 필요한 정리를 수행합니다.

다시 말하지만, 이것이 어떤 이유로 든 눈에 띄게 될지 모르겠습니다. 그렇다면 그 이유와 개선 방법에 대한 의견을 읽고 싶습니다.


나는 당신이 찾고있는 것이 이것이라고 생각합니다.

activity.moveTaskToBack(Boolean nonRoot);

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

응용 프로그램을 종료하는 것은 눈살을 찌푸리고 있습니까? . 이 링크를 통해 이동하십시오. 귀하의 질문에 답변합니다. 시스템은 응용 프로그램을 종료하는 작업을 수행합니다.

두 개의 활동 A a B가 있다고 가정합니다. A에서 B로 이동합니다. 뒤로 단추를 클릭하면 활동 B가 백 스택에서 팝되어 파괴됩니다. 백 스택 활동 A의 이전 활동이 초점을 갖습니다.

애플리케이션 종료시기를 결정하려면 시스템에 그대로 두어야합니다.

공공 무효 finish()

활동이 끝났을 때 전화하십시오.

많은 활동이 있다고 가정하십시오. 작업 표시 줄을 사용할 수 있습니다. 홈 아이콘을 클릭하면 응용 프로그램의 MainActivity로 이동합니다. MainActivity에서 뒤로 단추를 클릭하여 응용 프로그램을 종료하십시오.


우리는 강력하고 간단한 코드를 원합니다. 이 솔루션은 기존 장치 및 최신 장치에서 작동합니다.

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

응용 프로그램을 종료하려면 다음을 사용할 수 있습니다.

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

또한 서비스를 중지하려면 다음 메소드를 호출하십시오.

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

이것은 매우 늦을 수 있으며 지침에 따라 수명주기 프로세스를 스스로 처리하지 않아야합니다 (OS가 당신을 위해하는 것처럼). 모든 액티비티에 브로드 캐스트 리시버를 " finish()"로 등록하고 onReceive()종료 할 때마다 모든 액티비티를 종료해야한다는 의도를 간단히 전달할 수 있습니다 ..... onDestroy()메소드 에서 수신자를 등록 취소하십시오 .


@MobileMateo와 비슷하지만 Kotlin

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

좋은 결정이 아니므로 Android의 응용 프로그램 처리 원칙에 위배됩니다. 안드로이드는 절대 불가피한 경우가 아니면 프로세스를 종료하지 않습니다. 이렇게하면 앱이 더 빨리 시작하여 항상 메모리에 유지됩니다. 따라서 애플리케이션 프로세스를 종료 할 특별한 이유가 필요합니다.


버튼 클릭시종료 하는 정확하고 정확한 해결책 은 아래 코드를 사용하는 것입니다.

// On 버튼 뒤로 눌린 이벤트

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

이것은 아무것도 죽일 것입니다;)

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

이 시도

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

안드로이드의 논리를 깨지 않고 기존 활동에 더 많은 코드를 추가하고 추가 사항을 전달하지 않고 활동에서 응용 프로그램을 종료하는 가장 쉬운 방법은 다음과 같습니다.

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

QuitApplicationActivity존재 :

public class QuitApplicationActivity extends AppCompatActivity {

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

        finish ();
    }
}

@Sivi의 답변으로 앱이 닫힙니다. 그러나 돌아 왔을 때 일부 어린이 활동이 있으면 완료되지 않은 다른 활동이 열릴 수 있습니다. noHistory:true돌아 왔을 때 앱이 MainActivity에서 시작되도록 내 활동에 추가 했습니다.

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

앱을 종료하는 잔인한 방법 목록에 하나를 추가하기 만하면됩니다.

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


Kotlin을 사용하는 경우 앱을 종료하는 적절한 방법 System.exit()은 내장 방법입니다.

exitProcess(0)

설명서를 참조하십시오 .

0매개 변수로서의 숫자 는 종료가 의도되었으며 오류가 발생하지 않았 음을 의미합니다.


전체 앱을 종료 할 수 있습니다. 그러므로

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

100 % 작동합니다. 행운을 빌어 요!


뒤로 키를 누르면 finish ()를 사용하십시오.

참고 URL : https://stackoverflow.com/questions/6330200/how-to-quit-android-application-programmatically

반응형