[안드로이드] Back 버튼(뒤로가기) 2번으로 앱 종료하기

Posted by ITPangPang
2016. 4. 25. 23:32 안드로이드(android)/안드로이드 기본 Key


[안드로이드] 

Back 버튼(뒤로가기) 2번으로 

앱 종료하기




이번 카테고리에서는 안드로이드에서 물리적으로 사용할 수 있는 기본키 제어하는 방법에 대해 알아보겠습니다.

(소스코드는 맨 아래에 있으니 개념적인 부분 나중에 보실분은 스크롤을 가장 아래로 내려보아요)


그 첫번째로 가장 많이 사용하는 Back버튼(뒤로가기) 2번으로 앱 종료하는 법을 알아보겠습니다.


시작 하기 전에 깜짝 퀴즈를 하나 내보겠습니다.


안드로이드

기본 버튼중 개념적으로

개발자가

이벤트를 훔쳐서

제어 가능한 버튼은 

몇가지 일까요?


ㆍ Back버튼(뒤로가기)


ㆍ 전원버튼


ㆍ 홈 버튼


ㆍ 메뉴 버튼


ㆍ 볼륨 Up 버튼


ㆍ 볼륨 Down 버튼



정답은?

5가지 입니다.


안드로이드에서는

Home버튼은

이벤트를 

훔칠 수 없게 

막아놨습니다


뭐 우회해서 

그럴듯하게 바꾸거나

하는것은 가능하지만

(그리고 예전버전은 가능했고)

기본 개념적으로는 막아놨습니다.

그 이유는 나중 홈버튼 관련글에서

적겠습니다.



자 다시 Back버튼으로 넘어와서

일단 Back버튼을 제어하기 위해서는

가장 많이 사용하는 

onBackPressed()를 오버라이드 

해야 합니다


항상 말하는 단축키

ALT+Insert 눌러서

추가해줍니다.




@Override
public void onBackPressed()
{
super.onBackPressed();
}


자 추가하면 이게 나옵니다.

그리고 이 상태에서 

앱을 돌리고

Back key를 누르면

앱이 종료됩니다.


super.onBackPressed();

요놈이 종료시켜버리는겁니다.

이놈이 뭐길래? 

하시는 분들은 

Ctrl+좌클릭으로

계속 따라가 보시면 됩니다.






뭐 결국 끝은 finish()라는 겁니다..


그럼 요 녀석을 지워버리면?


맞습니다.

Back(뒤로가기) 버튼이

안먹히게 됩니다.


그럼 이제 본격적으로

Back 2번으로 앱 종료시키기

를 해보겠습니다.


사실 이 코드는 

국민소스입니다.

후후후..


자 처음에는 

이걸 넣어줍니다

public class MainActivity extends AppCompatActivity
{

private final long FINISH_INTERVAL_TIME = 2000;
private long backPressedTime = 0;


2000 적혀있는건

2초안에 Back버튼 한번더 

누르면 종료시키겠다는 

변수입니다. 


원하는 시간으로 변경 가능합니다.


그 아래 backPressedTime은

그 2초를 측정하기 위해

사용하는 변수입니다.


그 다음으로

System.currentTimeMillis();를

추가해줍니다.


public class MainActivity extends AppCompatActivity
{

private final long FINISH_INTERVAL_TIME = 2000;
private long backPressedTime = 0;

@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}

@Override
public void onBackPressed()
{
long tempTime = System.currentTimeMillis();
long intervalTime = tempTime - backPressedTime;

}
}


전에는 

SystemClock.elapsedRealtime()

요거를 사용해서 

시간 재는걸 했었는데


이번에는 System.currentTimeMillis()입니다.


이 시간은 1970년 1월 1일? 

제 기억이 맞다면.. 

중요한건 아니고..


현재시각과 

저 날짜와의 차이를

long으로 나타낸 겁니다.


코드를 보면

처음 tempTime은 


엄청나게 긴숫자가 나올겁니다


다음코드는 

intervalTime = tempTime - backPressedTime입니다.

위에서 backPressedTime은 0으로 선언했으므로


처음 intervalTime은 tempTime과 같습니다.



다음 코드를 추가해줍니다

if (0 <= intervalTime && FINISH_INTERVAL_TIME >= intervalTime)
{
super.onBackPressed();
}
else
{
backPressedTime = tempTime;
Toast.makeText(getApplicationContext(), "한번 더 뒤로가기 누르면 꺼버린다.", Toast.LENGTH_SHORT).show();
}


if문을 보니까

intervalTime이 0보다 크거나

FINSH_INTERVAL_TIME보다 작으면

종료시켜버립니다

(super.onvbackPressed)


근데 위에서 구했듯이

처음에는 intervalTime이

엄청나게 큰 숫자입니다..


그러니 else로 빠지겠군요

자 그럼 backPressedTime = tempTime


backPressedTime이 0에서 엄청 

큰 숫자로 바뀌겠군요..?


그리고 Toast를 띄우겠네요


여기까지 딱 이순간.. 

Back버튼 한번 누른순간입니다.


그리고 그 다음 버튼을 누르게 되면



이런식으로 바뀌게 됩니다.


long intervalTime = tempTime - backPressedTime;


이 부분에서 

tempTime은 지금! 버튼 누른 

Long값이 저장되는데


backPressedTime은 그 전에 Back버튼을 

눌렀던 long값을 저장합니다.


그래서 결국 intervalTime이

첫번째 Back 버튼과 

두번째 Back버튼을 누른

시간 차이가 됩니다.


지금 코드로는

2초안에 2번 누르게 되면

앱 종료입니다.

후후후..


아래는

전체코드입니다

public class MainActivity extends ActionBarActivity
{
private final long FINISH_INTERVAL_TIME = 2000;
private long backPressedTime = 0;

@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}

@Override
public void onBackPressed() {
long tempTime = System.currentTimeMillis();
long intervalTime = tempTime - backPressedTime;

if (0 <= intervalTime && FINISH_INTERVAL_TIME >= intervalTime)
{
super.onBackPressed();
}
else
{
backPressedTime = tempTime;
Toast.makeText(getApplicationContext(), "한번 더 뒤로가기 누르면 꺼버린다.", Toast.LENGTH_SHORT).show();
}
}
}


다음 글에서는 

Back 버튼 눌렀을때

Toast가 아닌

대화상자를 하나 

띄어서 종료하는

법을 알아보겠습니다.