Glacier's Daily Log

Android) 'killProcess' 로 앱을 종료하였지만 앱이 재실행 혹은 이전 액티비티가 나타날 때 해결방법 본문

Coding/Android

Android) 'killProcess' 로 앱을 종료하였지만 앱이 재실행 혹은 이전 액티비티가 나타날 때 해결방법

h__glacier_ 2021. 1. 11. 19:40
반응형

Android) 앱을 종료하여도 강제로 앱이 재실행되거나 이전 액티비티가 실행될 때

"android.os.Process.killProcess(android.os.Process.myPid());" 구문으로 앱을 종료시켰으나 앱이 강제 재실행 될 때 해결법.


정말 오랜만의 블로그 포스팅이다.

최근에 코로나19 상황이 매우 심각해지면서, 강력한 사회적 거리두기 방안이 시행되었다.

따라서 자주 가던 카페도 못가고 9시이후엔 외출자체를 하지 않게 되면서

자연스럽게 블로그 포스팅 주제가 사라졌다.

 

그러던 오늘 오랜만에 안드로이드 개발 포스팅을 하게 되었다.

여러개의 어플을 개발하면서, 한번 이상 겪은 문제여서 포스팅하게 되었다.

 

안드로이드 개발을 독학 후 시작한지 약 10개월 만에

17개의 어플리케이션을 운영하게 되었다.

 

물론 간단한 기능만 있는 매우 기초적인 어플들 뿐이지만

다양한 시도를 해보며 사용자들을 많이 끌어들이는 법, 광고수익을 극대화 시키는 방법 들을 터득하고 있다.

 

이번엔 Firebase를 이용한 실시간 커뮤니티 게시판 어플을 제작해 보고 있는데

개발 중 어플을 종료하는 부분에서 오류가 생겼다.

 

앱 사용중 '뒤로가기' 버튼을 누르면 해당 팝업창이 뜨고, '종료하기' 버튼을 누르면 앱이 종료되게 구현하려 했다.

나의 다른 어플들도 해당 방법으로 구현하고 문제가 없었지만,

이 어플에서는 종료하기를 눌렀을 때 하얀 화면이 나오면서 앱이 재실행되는 문제가 생겼다.

 

앱이 재실행되다 보니 Logcat 에서도 오류코드를 제대로 볼 수 없었다.

도통 이해가 안되어 여러번 코드와 씨름하다가 구글링을 했고

생각보다 금방 해답을 찾을 수 있었다.

 

  d.setNegativeButton("종료하기", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    // TODO Auto-generated method stub
                    android.os.Process.killProcess(android.os.Process.myPid());
                }
            });

이와 같이 종료하기 버튼을 구현했다.

 

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

이 구문이 현재 실행되고 있는 프로세스, 즉 어플을 강제종료 시키는 구문인데

자세히 어떤 이유인지는 모르겠지만 메인 액티비티가 아닌 액티비티에서 어플을 강제종료 하면,

안드로이드 OS 자체에서 이를 비정상적인 종료로 인식하여 어플을 강제 재실행 해주는 듯 보인다.

 

엄연히 말하면 오류가 아니라, 안드로이드의 과한 배려라고 볼 수 있다.

 

그래서 이를 해결하려면

 Intent intent = new Intent(this, 현재클래스);

  intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP|Intent.FLAG_ACTIVITY_SINGLE_TOP);
  intent.putExtra("kill", true);
  startActivity(intent);

killProcess 구문 뒤에 이런 코드를 추가시켜준다.

 

그런 후 원래 가장 처음 실행되게 했던 메인액티비티로 가서

  @Override

    protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
        boolean k_f = intent.getBooleanExtra("kill", false);
        if(k_f == true){
            finish();
        }
    }

이 구문을 추가시켜주자.

 

대충 안드로이드에서 저장한 flag를 초기화 시켜줌으로서

내가 구현한 종료가 비정상적인 종료가 아님을 인식하게 만드는 과정이다.

 

생각보다 간단히 문제를 해결할 수 있었지만

여전히 찝찝함이 남는 문제이다.

 

반응형
Comments