홈키 잡는법 안드로이드 |
void Activity.onUserLeaveHint ()
이 메서드는 사용자에 의해 액티비티가 백그라운드로 전환되기 직전에 onPause 바로 앞에 호출된다. Home 키를 누르기 직전에 호출되며 Back키를 누르거나 전화 통화 앱이 올라올 때, 타이머에 의해 종료될 때는 호출되지 않는다. Home키는 키입력 이벤트로 전달되지 않아 검출이 어려운데 이 메서드가 호출될 때 Home키에 의해 백그라운드가 됨을 알 수 있다. 이 두 메서드는 상태란의 통지를 관리할 때 사용될 수 있으며 액티비티가 통지를 취소할 시점을 결정하는데 도움을 준다. 다음 예제는 사용자가 5초 이상 관심을 보이지 않으면 즉시 종료한다.
검증완료
사이클 순서
onCreate
onStart
onResume
홈키 클릭
onUserLeaveHint
onPause
onStop
activity에서만 가능하므로 다른 java파일은
PhoneWindowManager.java 파일에서 처리하는 해 줘야 한다
홈키시 actvity 종료시키는 방법으로는
androidmanifast.xml에
<activity android:name=".ClassName"
android:launchMode="singleTask"
android:clearTaskOnLaunch="true"
/>
android:launchMode="singleTask"
android:clearTaskOnLaunch="true"
두개의 속성을 추가해준다
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
출처: http://blog.naver.com/schweine7?Redirect=Log&logNo=40124982560
[Android/안드로이드] Manifest <activity> clearTaskOnLaunch 안드로이드(Android) / 프로그래밍 |
(따라서 이 attribute 는 task 의 root 를 차지하는 경우에만 유효하죠 )
- "true" 값일 때 root activity 만 남기고, 이놈은 root activity 를 실행 시킬 때만 작용합니다.
- default 값은 "false" 입니다. 그래서 보통 re-launch 하면 last state 가 보여지는 것이죠.
2. P 에서 Q activity 를 띄웁니다.
3. Q activity 에서 Home 키를 누릅니다.
4. 다시 Homescreen 에서 P activity 를 띄웁니다.
5.
5-1. false (default) 일 때는 P 가 아닌 Q 가 보여집니다. ( last state )
5-2. true 일 때는 Q 는 날아가고 P 를 보여줍니다.
<uses-permission android:name="android.permission.PACKAGE_USAGE_STATS" />
<uses-permission android:name="android.permission.BATTERY_STATS" />
<uses-permission android:name="com.android.launcher.permission.READ_SETTINGS" />
<uses-permission android:name="com.android.launcher.permission.WRITE_SETTINGS" />
<application android:label="@string/settings_label" android:icon="@drawable/ic_launcher_settings" android:taskAffinity="">
<activity android:label="@string/settings_label" android:name="Settings" android:taskAffinity="com.android.settings" android:clearTaskOnLaunch="true" android:launchMode="singleTop" android:screenOrientation="portrait">
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
안드로이드 어플 완전 종료 (Process Kill)
참고 : Android Developers Dev Guide - Framework Topics Activities
위의 링크는 안드로이드 Develop 공식 사이트이며, 그중에 Activity에 대한 내용을 링크해놓은 것입니다. 참고를 하면 도움이 될 것 같습니다.
본격적으로,
Activity를 종료 시키는 방법을 나열한다면,
1
2
1
2
1
2
1
2
3
1
2
3 | // 첫번째 방법 finsish();
// 두번째 방법 System.exit( 0 );
// 세번째 방법
android.os.Process.killProcess(android.os.Process.myPid());
// 네번째 방법
ActivityManager am = (ActivityManager)getSystemService(Activity.ACTIVITY_SERVICE);
am.restartPackage(getPackageName());
// 다섯번째 방법
ActivityManager am = (ActivityManager)getSystemService(Activity.ACTIVITY_SERVICE);
am.killBackgroundProcesses(getPackageName()); |
하지만 두번째 세번째 방법도 Activity를 둘 이상을 사용하게 된다면 Process가 종료되었다가 이전 Activity로 Process가 다시 실행되어 Process가 종료되는 것이 아니라 다시 실행되고 이전 Activity로 돌아가되 됩니다.
네번째 방법과 다섯번째 방법은 구글로 검색하고 포럼에서 게시글을 찾아보고 나온 방법인데요. 이것도 현재 Froyo 버전 이후부터는 작동되지 않는 것을 확인했습니다.(저는 테스트를 2.3.3 버전의 넥서스 원으로 테스트를 하여 확인했습니다.)
따라서 둘 이상의 Activity를 사용할 때는 이전 Activity도 함께 finish를 하고 두번째나 세번째 방법으로 종료를 해야 다시 Process가 살아나지 않는 것으로 확인하였습니다.
출처: http://stackoverflow.com/questions/6693896/home-key-press-event-listener
I am using below lines of code to find if the use press the backkey from android phone,its working fine . But I want to detect home key Button press event,Anyone can guide how it is possible ?
Thanks . . .
| |||||||
feedback |
closed as exact duplicate by Tim Post♦ Sep 19 '11 at 9:01
This question covers exactly the same content as earlier questions on this topic; its answers may be merged with another identical question. See the FAQ for guidance on how to improve it.
2 | You cannot "detect home key Button press event", sorry. | ||||||||||||
feedback |
2 | While technically the people who responded are correct here is a simplistic way to detect the home key press by monitoring two events in your activity, it has worked for my simple needs and maybe it will work for yours as well. I use a 100ms fence around the two events which I find always works for me. NOTE: I have only tested on a handful of phones, like all things in Android your mileage will vary dependent on OS / Hardware (heck even the stuff that's documented and supposed to work sometimes doesn't)
| ||||||||||
feedback |
1 | No, it is not possible. From the documentation of the Home keycode:http://developer.android.com/reference/android/view/KeyEvent.html#KEYCODE_HOME
| ||||
|
안드로이드에서 기본적으로 사용자가 홈 키나 파워키는 핸들링 할 수 없도록 되어있습니다. 이는 플랫폼 상에서 개발자가 악의적인 용도로 사용하는 것을 미연에 방지하기 위함인데 커널 단에서는 이런 부분 역시 수정이 가능합니다, 보안이나 기타적인 이유로 중요하다고 판단되는 키들은 framework layer에서 핸들링할 수 있습니다.
Path는 frameworks/base/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java이고 해당 파일을 열어보면 아래와 같은 코드가 존재합니다.
if (keyCode == KeyEvent.KEYCODE_HOME) {
위 코드를 보면 홈 버튼에 대한 액션이 들어왔을 때 launchHomeFromHotKey()라는 함수를 호출하는데 이 함수를 다시 살펴보면 mKeyguardMediator.verifyUnlock() 를 다시 호출합니다. 여기서 if (!mUpdateMonitor.isDeviceProvisioned())가 T/F이냐에 따라 Home Key에 대한 처리가 이루어지는데 무조건 false를 return하게 되면 Home key에 대한 액션은 무시하게 됩니다!
단순히 홈키 하나를 핸들링 하기 위해 위와 같은 작업을 하는 것은 상당히 무모한 일이지만, 어쩌면 어플을 개발하는 분들의 입장에서 Home과 Power 키를 핸들링 할 수 없을까라는 고민들을 많이 하시는 것 같아 최악이지만, 유일한 방법을 소개해드려 봅니다~안드로이드 커널을 만진지 얼마되지 않았는데 다양한 분야에서 사용할 수 있을 것 같다는 생각이 드네요!
전엔 홈키를 어떻게 처리할 방도를 몰라서
OnResume에 플래그값을 줘서 했었는데..
엄청 유용한 함수가 있네요.
void Activity.onUserLeaveHint ()
이 메서드는 사용자에 의해 액티비티가 백그라운드로 전환되기 직전에 onPause 바로 앞에 호출된다. Home 키를 누르기 직전에 호출되며 Back키를 누르거나 전화 통화 앱이 올라올 때, 타이머에 의해 종료될 때는 호출되지 않는다. Home키는 키입력 이벤트로 전달되지 않아 검출이 어려운데 이 메서드가 호출될 때 Home키에 의해 백그라운드가 됨을 알 수 있다. 이 두 메서드는 상태란의 통지를 관리할 때 사용될 수 있으며 액티비티가 통지를 취소할 시점을 결정하는데 도움을 준다. 다음 예제는 사용자가 5초 이상 관심을 보이지 않으면 즉시 종료한다.
출처: http://www.androidpub.com/?mid=android_dev_qna&document_srl=1694637&rnd=1694734#comment_1694734
저같은고민 안하시길 바랍니다^^
3.전원 관리
1.화면 유지
항상 안정적인 전원에 연결되어 있는 PC와는 달리 모바일 장비는 배터리에만 의존하므로 전원 절약은 모두가 관심을 가져야 할 치명적인 문제이다. 앱은 불필요한 동작을 최대한 자재하며 시스템은 사용자가 관심을 가지지 않을 때 화면이나 키보드 조명을 냉큼 차단하고 WiFi 네트워크 연결도 무자비하게 끊어 버리며 심지어 일정 시간이 지나면 CPU까지도 잠재워 버린다. 스크린 세이버가 반 강제적으로 적용되며 매번 화면을 다시 켜야 하는 불편함이 있지만 사용자들도 너그럽게 이해하는 편이다.
모든 앱이 전원 절약에 협조적인데 비해 배터리를 아무리 많이 소모하더라도 CPU나 화면을 강제로 유지해야 하는 특수한 앱도 존재한다. 대표적인 예가 동영상 재생기인데 영화를 감상하는 중에 배터리 아끼자고 화면을 꺼 버릴 수는 없는 노릇이다. 네비게이션이나 DMB 등 사용자가 지속적으로 화면을 봐야 하는 앱은 화면 유지가 필수적이며 카메라나 카운터 처럼 자주 화면을 봐야 하는 프로그램도 사정은 비슷하다. 백그라운드 작업을 하는 앱은 화면이 꺼지더라도 CPU는 계속 동작해야 한다.
장비의 전원은 시스템이 설정값에 따라 자동으로 관리하지만 일시적으로 예외를 적용해야 하는 경우가 예상외로 빈번하다. 배터리 먹는 하마라는 악평을 듣더라도 기능의 특성상 본질적으로 전원을 소모할 수밖에 없다. 이럴 때는 장비의 전원을 관리하는 PowerManager 클래스로 별도의 정책을 임시적으로 적용한다. 시스템 서비스이므로 객체를 따로 생성할 필요없이 다음 호출문으로 쉽게 얻을 수 있다.
getSystemService(Context.POWER_SERVICE);
전원 관리자 자체는 몇 가지 유틸리티 메서드만 제공할 뿐 전원을 관리하는 기능이 없으므로 다음 메서드를 호출하여 WakeLock 객체를 생성한다. WakeLock 객체는 이름 그대로 장비가 계속 깨어 있도록 잠그는 역할을 한다. 즉, 여기서 잠근다(Lock)의 의미는 끈다는 것이 아니라 화면이나 CPU가 켜진 상태를 유지하도록 강제한다는 뜻이다.
PowerManager.WakeLock newWakeLock (int flags, String tag)
WakeLock 객체를 생성할 때 플래그 인수를 지정함으로써 이후의 전원 관리 수준이 결정된다. 두번째 인수 tag는 디버깅용 정보로만 사용되므로 큰 의미는 없으며 로그상에서 구분 가능한 이름만 부여하면 된다.
잠금수준 | CPU | 화면 | 키보드 조명 |
PARTIAL_WAKE_LOCK | 부분적 동작 | 끔 | 끔 |
SCREEN_DIM_WAKE_LOCK | 동작 | 흐리게 켬 | 끔 |
SCREEN_BRIGHT_WAKE_LOCK | 동작 | 밝게 켬 | 끔 |
FULL_WAKE_LOCK | 동작 | 밝게 켬 | 켬 |
아래쪽으로 내려올 수록 잠금의 강도가 높아지며 배터리 사용량도 비례해서 늘어난다. CPU만 계속 가동하고 싶다면 PARTIAL_WAKE_LOCK으로도 충분하며 화면이나 키보드까지 필요하면 더 높은 잠금 수준을 적용해야 한다. 잠금 수준 외에 화면 관리 방식에 대한 두 개의 옵션을 OR 연산자로 연결하여 추가로 더 지정할 수 있다. 두 플래그는 화면에 대한 옵션이므로 CPU만 동작하는 PARTIAL_WAKE_LOCK에서는 아무 효과가 없다.
■ ACQUIRE_CAUSES_WAKEUP : 화면 잠금 기능은 켜진 화면을 계속 유지하게만 할 뿐이지 꺼진 화면을 켜지는 않는다. 이 플래그를 지정하면 화면이나 키보드 조명을 강제로 켠다. 알람이나 착신 통화처럼 사용자에게 즉시 통보를 하는 앱에 적합하다.
■ ON_AFTER_RELEASE : 화면 잠금이 끝난 후에 화면 타이머를 리셋한다. 잠금이 끝난 후부터 설정의 화면 켜짐 시간만큼은 계속 유지함으로써 화면이 켜진 시간을 좀 더 연장하는 효과가 있으며 잠금과 풀림을 반복할 때 화면이 너무 빨리 꺼지지 않도록 한다.
WakeLock 객체는 전원 관리 방식에 대한 정보만 가질 뿐이어서 이 객체를 생성한다고 해서 바로 잠금이 동작하는 것은 아니다. 객체를 미리 생성해 놓고 필요할 때 다음 메서드로 잠금과 해제를 지시한다. 여러 개의 잠금 객체를 만들어 놓고 선택적으로 사용하는 것도 물론 가능하다.
void acquire ([long timeout])
void release ()
boolean isHeld ()
acquire 메서드를 호출하면 이후부터 객체의 설정 정보대로 전원이 관리된다. timeout 인수는 잠금을 자동으로 풀 시간을 지정하는데 생략시는 별도의 지시가 있을 때까지 잠금이 유지된다. release는 잠금을 해제하며 isHeld 메서드는 현재 잠금 상태인지 아닌지를 조사한다. acquire를 호출한 이후부터 release를 호출할 때까지 CPU, 화면, 키보드 조명이 유지된다고 할 수 있다. 이 기능을 사용하려면 다음 퍼미션이 필요하다.
<uses-permission android:name="android.permission.WAKE_LOCK" />
화면을 강제로 유지하는 것은 배터리 비용을 유발하므로 특별한 퍼미션을 요구한다. 다음 예제는 별다른 작업은 하지 않지만 시스템 설정에 상관없이 화면을 항상 켜진 채로 유지한다.
hard_WakeAlways |
public class hard_WakeAlways extends Activity {
PowerManager mPm;
WakeLock mWakeLock;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.hard_wakealways);
mPm = (PowerManager)getSystemService(Context.POWER_SERVICE);
mWakeLock = mPm.newWakeLock(PowerManager.FULL_WAKE_LOCK,
"hard_WakeAlways");
}
protected void onResume() {
super.onResume();
mWakeLock.acquire();
}
protected void onPause() {
super.onPause();
if (mWakeLock.isHeld()) {
mWakeLock.release();
}
}
}
레이아웃에는 기능을 안내하는 텍스트 뷰 하나가 배치되어 있고 코드도 지극히 간단하다. 실행해 봤자 텍스트 뷰 하나만 나올 뿐이지만 화면이 꺼지지 않는다는 면에서 다른 앱과 다르다.
onCreate에서 WakeLock 객체를 생성하되 CPU, 화면, 키보드 조명을 모두 켜 두는 최상위의 잠금으로 설정했다. 액티비티가 시작되는 onResume에서 잠그고 백그라운드로 전환되는 onPause에서 해제하므로 액티비티가 실행중인 동안에는 화면이 항상 유지된다. 시스템 설정과 무관하게 화면이 항상 켜질 것이며 액티비티를 종료하면 시스템의 설정대로 화면 타이머가 동작한다.
WakeLock 객체는 화면 가용성을 높여준다는 면에서는 편리하지만 배터리 수명에는 중대한 영향을 끼치므로 꼭 필요할 때만 가급적 짧게 사용해야 한다. 위 예제에서는 편의상 액티비티 실행중인 동안 계속 유지하도록 했지만 작업 시작할 때 켰다가 작업 끝난 후 가급적 빨리 해제하는 것이 바람직하다. 동영상 재생기의 경우 동영상을 실제로 재생하지 않을 때는 굳이 잠금을 유지할 필요가 없다. 다음은 PowerManager 클래스의 전원 관리 기능 메서드들이다.
boolean isScreenOn ()
void goToSleep (long time)
void reboot (String reason)
void userActivity (long when, boolean noChangeLights)
화면의 켜짐을 조사하거나 즉시 화면을 끄거나 재부팅하는 등의 기능을 제공한다. 화면을 강제로 끄는 goToSleep 메서드는 전원 버튼을 누르지 않아도 프로그램이 소프트웨어적으로 슬립 모드로 들어갈 수 있어 실용성이 있다. 그러나 아무나 사용할 수 있는 메서드는 아니므로 엄격한 제한이 따른다. 이 메서드를 사용하려면 DEVICE_POWER 퍼미션이 필요하며 또 시스템 앱으로 서명을 해야 한다.
참고로 WakeLock과 유사한 개념의 WifiLock 도 제공된다. 대기 모드로 들어가면 WiFi 네트워크는 자동으로 꺼지는데 이 상태에서 백그라운드 통신을 수행하면 3G 데이터 사용량이 많아지는 문제가 있다. 대기 모드에서도 WiFi를 계속 유지하려면 WifiLock 객체를 사용하며 방법은 WakeLock과 거의 동일하다.
2.독서 도우미
독서 도우미는 책 읽는 것을 도와주는 간단한 유틸리티 프로그램이다. 시작 페이지, 끝 페이지 그리고 각 페이지를 읽을 시간을 미리 입력해 두면 역 카운터를 세면서 빨리 읽어라고 제촉함으로써 일정한 속도로 책을 읽도록 한다. 전에 윈도우즈용으로 만들었던 것인데 도서관에서 사용할 수 있도록 모바일용으로 포팅해 보았다.
무슨 놈의 책을 시간 재가며 읽는가 싶겠지만 따분한 기술 서적이나 원서처럼 의무적으로 읽어야 하는 책은 그럴 필요가 있다. 내용이 지루해서 읽다 보면 책장은 넘어가는데 뭘 읽었는지 머리 속에는 아무 것도 남아 있지 않다거나 30분째 같은 페이지에서 노닥거리기 십상이다. 이럴 때는 목표량을 정해 놓고 읽으면 긴장도를 높일 수 있으며 나름대로 책 읽는 재미도 있어서 본인은 아주 실용적으로 잘 사용하고 있다.
독서뿐만 아니라 일정한 시간 간격으로 해야 할 작업이 있을 때도 나름대로 유용하다. 1시간에 밤 60개를 까야 한다거나 30초에 아빠 흰머리를 하나씩 뽑아 홈 아르바이트를 할 때 실용적이다. 실생활에서나 개발 현장에서나 단순 반복 작업을 해야 할 경우는 예상외로 많은데 시간을 재 가며 진행하면 딴짓거리를 안하게 되고 짧은 시간에 과업을 완수할 수 있어 효율이 증가하고 신바람도 난다.
이 프로그램의 구조나 논리는 아주 단순해서 더 설명이 필요없을 정도다. 시작, 끝 범위 입력받고 타이머 돌리며 역카운트만 해 주면 그만이다. 그러나 모바일 환경에서는 카운트를 하는동안 화면이 꺼져 버려 카운트를 계속 볼 수 없는 문제가 있으며 그렇다고 이 프로그램을 쓸 때만 설정을 조정하기도 귀찮다. 이럴 때 사용하는 기능이 바로 WakeLock이며 앞 예제와 동일한 코드를 사용한다.
hard_ReadingCounter |
==== 소스 생략 ====
레이아웃을 잡는 방법, 입력받은 값의 유효성을 점검하는 방법, 페이지 넘길 때마다 소리를 내고 옵션값을 프레퍼런스에 저장하는 코드 등이 포함되어 있어 예제치고는 코드가 꽤 긴 편이다. 책 읽다가 갑자기 뱃속에서 긴급 신호가 오는 예외 사항을 고려하여 잠시 중지 기능도 애써 작성해 넣었다. 특별히 어려운 논리는 없으므로 지면 절약을 위해 소스 덤프는 생략했다. 주석도 많이 달아 놨으므로 직접 분석하기에 전혀 무리가 없을 것이다. 실행 모습은 다음과 같다.
가급적이면 배터리를 아끼기 위해 어두운 색상을 사용했다. 표준 위젯만 사용해서 UI가 그다지 예뻐 보이지는 않지만 나름대로 실용성있게 만들었으며 본인은 이 예제를 종종 애용한다. 페이지 넘길 때마다 현재 페이지를 예쁘장한 소녀 음성으로 알려 주면 좀 더 활용성이 높아질 것이다. 유료 앱으로 출시해볼까 하다가 돈 내고 쓸 사람은 드물 것 같아 그냥 관두기로 했다. 여기서 소개하고자 하는 것은 이 예제처럼 화면을 항상 유지할 필요가 있을 때 WakeLock 기능을 사용하라는 것이다.
3.사용자 액션 추출
WakeLock 객체는 화면을 켜 둘 수 있어서 편리하기는 하지만 배터리 사용 측면에서는 부작용이 있다. 모바일 장비에서 배터리를 가장 많이 소모하는 부품이 액정이어서 불과 한시간만 켜 놓아도 배터리가 다 소진된다. 기능 구현상 불가피하게 배터리를 소모하는 것은 상관없지만 실수로 켜 둔채로 방치하거나 또는 관리 소홀이나 예외로 인해 잠금을 풀지 않아 배터리가 방전되어 버리면 이는 치명적이다.
카메라의 경우 사진을 찍으려고 대기하는 중에 화면이 꺼져 버리면 곤란해져 보통 촬영중에는 화면을 켜 둔다. 그러나 사용자가 카메라를 켠 둔 채로 그대로 방치했다거나 또는 미스 터치로 인해 카메라가 기동되었다면 의도하지 않게 배터리가 방전될 것이다. 비록 사용자가 허락을 했더라도 일정한 시간동안 사용자가 관심을 가지지 않는다면 잠금을 해제하고 슬립 모드로 들어가도록 허락하는 것이 안전하다.
그렇다면 지금 사용자가 프로그램을 조작하고 있는 중인지, 방치 상태인지는 어떻게 구분할 수 있을까? 이전 버전에서는 onKeyDown이나 onTouchEvent 등이 호출될 때를 감지하여 사용중임을 알아냈었다. 그러나 이 방식은 완벽하지도 않고 여러 군데서 체크를 해야 하므로 불편하기도 하다. 트랙볼이 있는 장비는 트랙볼도 감시해야 하며 뷰 계층이 복잡하면 입력을 받는 모든 뷰를 다 감시해야 한다. 이런 불편함을 해소하기 위해 1.5 버전부터 다음 메서드가 추가되었다.
void Activity.onUserInteraction ()
이 메서드는 키입력이나 터치 입력, 트랙볼 이벤트가 발생할 때마다 호출된다. 어떤 키를 눌렀는지, 화면의 어디를 눌렀는지에 대한 추가 정보는 없으며 단지 사용자가 기기를 조작하고 있는 중이라는 것만 알려줄 뿐이다. 여러 군데서 조사해야 하는 번거로운 작업을 한 메서드에서 일괄적으로 처리할 수 있어 편리하고 완벽하다. 다음 메서드도 유사한 이유로 1.5 버전에서 새로 추가되었다.
void Activity.onUserLeaveHint ()
이 메서드는 사용자에 의해 액티비티가 백그라운드로 전환되기 직전에 onPause 바로 앞에 호출된다. Home 키를 누르기 직전에 호출되며 Back키를 누르거나 전화 통화 앱이 올라올 때, 타이머에 의해 종료될 때는 호출되지 않는다. Home키는 키입력 이벤트로 전달되지 않아 검출이 어려운데 이 메서드가 호출될 때 Home키에 의해 백그라운드가 됨을 알 수 있다. 이 두 메서드는 상태란의 통지를 관리할 때 사용될 수 있으며 액티비티가 통지를 취소할 시점을 결정하는데 도움을 준다. 다음 예제는 사용자가 5초 이상 관심을 보이지 않으면 즉시 종료한다.
hard_UserInteraction |
public class hard_UserInteraction extends Activity {
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.hard_userinteraction);
}
protected Handler mFinishHandler = new Handler() {
public void handleMessage(android.os.Message msg) {
finish();
}
};
void registerFinish() {
mFinishHandler.sendEmptyMessageDelayed(0, 5 * 1000);
}
void unRegisterFinish() {
mFinishHandler.removeMessages(0);
}
void RefreshFinish() {
unRegisterFinish();
registerFinish();
}
protected void onResume() {
super.onResume();
registerFinish();
}
protected void onPause() {
unRegisterFinish();
super.onPause();
}
public void onUserInteraction() {
super.onUserInteraction();
RefreshFinish();
}
protected void onUserLeaveHint () {
super.onUserLeaveHint();
Toast.makeText(this, "Leave by user", Toast.LENGTH_LONG).show();
}
}
mFinishHandler는 메시지를 받자 마자 액티비티를 즉시 종료하도록 되어 있다. 지연된 시간을 지정하여 이 핸들러로 메시지를 보내 놓으면 잠시 후 종료될 것이다. registerFinish 메서드는 5초 후에 메시지를 보내 종료를 예약하며 unRegisterFinish는 큐에 쌓인 메시지를 제거하여 예약을 해제한다. RefreshFinish는 두 메서드를 순서대로 호출하여 취소 후 재예약함으로써 종료 시점을 리셋하는 역할을 한다.
onResume에서 종료를 예약하고 onPause에서 예약을 취소하여 별다른 조치가 없으면 실행 직후 5초가 지나면 종료될 것이다. 이를 방지하기 위해 사용자의 입력을 있을 때 종료 예약을 리셋해야 하는데 이 작업을 할만한 적당한 위치가 바로 onUserInteraction 메서드이다. 터치, 키, 트랙볼 중 어떠한 입력이라도 들어오면 호출된다. 이때마다 예약을 리셋하면 종료 시점을 지속적으로 연장할 수 있다.
예제를 실행해 놓고 5초간 가만히 있으면 종료되지만 화면을 계속 두드리거나 키를 누르면 종료가 연기된다. 그러나 터치한 상태로 이동하거나 터치를 뗄 때는 이 메서드가 호출되지 않는다. 만약 다른 터치 이벤트에 대해서도 종료되지 않도록 하려면 onTouchEvent에서도 리셋 처리를 해야 한다. 예제에서는 테스트의 편의상 5초로 설정했는데 카메라의 경우 1분 정도로 설정해 놓고 사용자가 1분 이상 촬영을 하지 않으면 자동 종료하는 식으로 활용 가능하다.
Home키를 눌러 액티비티를 빠져 나가면 onUserLeaveHint 메서드가 호출되어 토스트가 출력될 것이다. Back키를 누르거나 액티비티 스스로 finish를 호출했을 때는 토스트가 나타나지 않는다. 즉 onUserLeaveHint 메서드가 호출되었다는 것은 아직 액티비티가 살아는 있지만 잠시 백그라운드로 전환되었다는 뜻이다.
'구글과인터넷 > 안드로이드' 카테고리의 다른 글
안드로이드 Activity가 어떤 상태 인지..... (0) | 2012.12.12 |
---|---|
android 안드로이드 용량 제한 (0) | 2012.12.12 |
WebView, 또는 기타 에서 폰트,외부폰트를 적용하는 방법 관련 (0) | 2012.12.12 |