[안드로이드] Back 버튼(뒤로가기) 2번으로 앱 종료하기
[안드로이드]
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가 아닌
대화상자를 하나
띄어서 종료하는
법을 알아보겠습니다.