programing

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

oldcodes 2023. 8. 2. 09:24
반응형

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

프로그래밍 방식으로 안드로이드 애플리케이션을 종료하기 위한 코드를 찾았습니다. 사여용하를하에 있는 다음 중 으로써.onDestroy()애플리케이션을 완전히 종료할 것입니까?

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

[종료] 단추를 클릭한 후 백그라운드에서 프로그램을 실행하지 않습니다.이 코드 중 하나를 사용하여 앱을 종료할 수 있는지 알려 주시겠습니까?그렇다면 어떤 코드를 사용할 수 있습니까?안드로이드에서 앱을 종료하는 것이 좋은 방법입니까?

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개의 버튼이 있는 경보 대화상자가 있는 예 YES NO 및 CANCEL

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

애플리케이션을 폐기해야 하는 경우에는 OS가 리소스를 언제 어디서 해제할지 결정하도록 하는 것이 어떻습니까?

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

finish();

@dave 애플턴의 논평에 대한 반응으로:@gabriel 게시된 큰 질문/답변 콤보를 먼저 읽으십시오.애플리케이션을 종료하는 것이 눈살을 찌푸리게 합니까?

그것을 있다고 하면, 을 할 때이제우그가있가면다, 여질여가있고답다지을신, 그는것무하는드필코당당하는, 로이만두있이요신면다고를가으로인엇리가전것기을정한히문지서다고고은▁▁now▁that▁here▁,▁being,▁has▁answer▁an▁still▁that▁we▁if▁the▁is▁code▁you▁with▁have▁need는드코▁assuming하▁quitting는▁anything▁are이로필요▁doing제당이신있면다당하신고리이그만,finish()분명히 당신은 한 가지 이상의 활동 등을 할 수 있지만, 그것이 중요한 것은 아닙니다.몇 .

  1. 메모리 사용량과 "백그라운드에서 실행되지 않음" 때문에 사용자가 모든 것을 종료할 수 있도록 하고 싶으십니까?의심이 가는군.사용자가 백그라운드에서 특정 작업을 중지하도록 허용하지만 OS가 불필요한 리소스를 모두 제거하도록 허용합니다.
  2. 사용자가 앱의 이전 활동에 가지 않기를 원하십니까?그렇지 않도록 구성하거나 추가 옵션이 필요합니다.back= 이전 작업이 대부분 작동하는 경우 사용자가 다른 작업을 원할 경우에는 집을 누르기만 하면 되지 않습니까?
  3. 재설정이 필요한 경우 프로그램이 종료되었는지 여부/방법/등을 확인할 수 있으며, 작업이 다시 집중되면 원래 위치에서 다시 시작하는 대신 새로운 화면을 보여주는 작업을 수행할 수 있습니다.

서결국엔물론, 그래▁so.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);
    }

}

저는 그 애플리케이션이 어떤 경우에는 중지되어야 한다고 생각합니다.예를 들어, 로그인 후에만 사용할 수 있는 앱이 있습니다.로그인 활동에는 '로그인' 및 '취소'의 두 가지 버튼이 있습니다.'취소' 버튼을 클릭하면 확실히 '앱 종료'를 의미합니다.아무도 백그라운드에서 앱이 활성화되는 것을 원하지 않습니다.그래서 저는 앱을 종료해야 하는 경우가 있다는 것에 동의합니다.

Android에서 종료하는 응용 프로그램이 없습니다. SampleActivity.this.finish(); 현재 작업이 종료됩니다.

한 활동에서 다른 활동으로 전환할 때 이전 활동을 계속 끝냅니다.

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

우선, 이 접근 방식에는 minApi 16이 필요합니다.

저는 이 문제를 좀 더 폭넓게 해결하기 위해 이 솔루션을 3가지로 나누겠습니다.

활동에서 응용프로그램을 종료하려면 다음 코드 조각을 사용합니다.

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

활동에 액세스할 수 있는 비활동 클래스의 응용프로그램을 종료하려면 다음 코드 조각을 사용합니다.

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

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

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

활동의 onCreate() 메서드에 추가합니다.

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

또한, onDestroy() 활동 방법에서 등록 취소 수신자에게 전화하는 것을 잊지 마십시오.

mLocalBroadcastManager.unregisterReceiver(mBroadcastReceiver);

종료 신청의 경우 서비스를 확장하는 PlayService 클래스에서 사용하는 LocalBroadcastManager를 사용하여 브로드캐스트를 전송해야 합니다.

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

사용할 수 있습니다.finishAndRemoveTask () 21 API 21에서 제공됩니다.

공용 void 마감 및 작업 제거()

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

앱을 종료하려는 경우:

API > = 21의 경우 다음을 사용합니다.

finishAndRemoveTask();

API < 21의 경우:

finishAffinity();

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

앱을 닫는 안전한 방법은 finishAffinity()입니다.

모든 처리가 완료되면 앱을 닫습니다.시간이 좀 필요할 수도 있습니다.이 방법으로 앱을 닫고 잠시 후 다시 시작하면 새 프로그램이 동일한 프로세스에서 실행될 수 있습니다.완료되지 않은 모든 프로세스와 이전 응용 프로그램의 싱글톤 개체를 포함합니다.

확실하게 하려면, 앱이 완전히 닫혔는지 확인하려면 System.exit(0);

그러면 앱이 즉시 닫힙니다.그러나 앱이 열려 있는 파일을 손상시키거나 공유 기본 설정에 대한 편집이 완료되지 않을 수 있습니다.그래서 이것을 조심해서 사용하세요.

watchdog를 장시간 실행 중인 작업과 함께 사용하면 다양한 방법의 영향을 확인할 수 있습니다.

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)제거하고 이 코드를 실행한 후 앱을 닫은 후 다시 시작하면 무한 루프가 여전히 실행 중이기 때문에 이상한 동작이 발생합니다.

를 사용하는 것이 좋습니다.finish()이 당신은에약에 Activity또는getActivity().finish()만약 당신이 에 있다면Fragment.

앱을 완전히 종료하려면 다음을 사용합니다.

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

애플리케이션을 쉽고 간편하게 종료하는 방법

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

@MobileMateo와 유사하지만 코틀린에 있습니다.

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

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

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

친구들은 프로그래밍 방식으로 응용 프로그램을 종료하기 위해 이 기능을 추가하기만 하면 됩니다. #java

public void onBackPressed() 
{

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

제 생각에 당신이 찾고 있는 것은 이것입니다.

activity.moveTaskToBack(Boolean nonRoot);

지원서를 그만 두는 것은 눈살을 찌푸리게 하는 것입니까?이 링크를 통과하세요.그것은 당신의 질문에 답합니다.시스템은 응용 프로그램을 종료하는 작업을 수행합니다.

두 가지 활동 A와 B가 있다고 가정합니다.A에서 B로 이동합니다.뒤로 버튼을 클릭하면 활동 B가 백스택에서 팝업되고 삭제됩니다.백스택 활동 A의 이전 활동에 초점이 맞춰집니다.

응용 프로그램을 언제 종료할지 결정하는 것은 시스템에 맡겨야 합니다.

공실finish()

활동이 완료되고 닫아야 할 경우 이를 호출합니다.

여러분이 많은 활동을 한다고 가정합니다.수행 표시줄을 사용할 수 있습니다.홈 아이콘을 클릭하면 프로그램의 기본 활동으로 이동합니다.기본 활동에서 뒤로 버튼을 클릭하여 응용 프로그램을 종료합니다.

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

, 방법과 Kotlin의 이 될 수 .System.exit()는 기본 제공 입니다.

exitProcess(0)

설명서를 참조하십시오.

0파라미터는 출구가 의도된 것이며 오류가 발생하지 않았음을 의미합니다.

이게 눈살을 찌푸리게 하는지는 잘 모르겠지만, 이렇게 하는 거예요...

1단계 - 일반적으로 전역적으로 액세스하려는 메서드와 변수를 포함하는 클래스가 있습니다.이 예에서는 "App" 클래스라고 부릅니다.앱에 있는 각 활동에 대해 클래스 내부에 정적 활동 변수를 만듭니다.그런 다음 "닫기"라는 정적 방법을 만들어 다음을 실행합니다.finish() 활동 변수에 대한 메서드(null이 아닌 경우).기본/상위 활동이 있는 경우 마지막으로 종료합니다.

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()" 래클스정로변를수 " 설니다합 "와 합니다.thisonDestroy()…과 .null예를 들어, "활동1" 클래스에서는 다음을 수행합니다.

@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()어디서나인스턴스화된 모든 활동이 종료됩니다!당신은 활동을 닫을 뿐 앱 자체를 죽이지는 않기 때문에 (당신의 예와 같이) 안드로이드는 그곳에서 자유롭게 인계받고 필요한 모든 정리를 할 수 있습니다.

다시 말하지만, 저는 이것이 어떤 이유로든 인상을 찌푸리게 될지 모르겠습니다.그렇다면 왜 그런지, 어떻게 개선될 수 있는지 댓글을 읽고 싶습니다!

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

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()방법들.

버튼 클릭 시 앱을 종료하는 정확하고 정확한 솔루션은 아래 코드를 사용하는 것입니다.

//켜기 버튼 뒤로 누름 이벤트

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

Android의 논리를 깨지 않고 기존 활동에 코드를 추가하거나 추가하지 않고 활동에서 응용 프로그램을 종료하는 가장 쉬운 방법은 다음과 같습니다.

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:trueMainActivity에서 반환되는 앱이 시작되도록 내 활동에 적용됩니다.

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

앱을 종료하는 잔인한 방법 목록에 하나를 추가하는 것:

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

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

반응형