=================================
=================================
=================================
출처: http://stackoverflow.com/questions/2208912/how-can-i-detect-user-pressing-home-key-in-my-activity
아래코드와 같이 나갔을때 값이 true 이면 밖으로 진입상태로 된것이라 본다. 이것을 이용하여 backkey 이벤트에서 플래그 값을
따로 둔뒤 아래값이 true 일때 backkey값의 플래그값이 설정이 안되어있으면 homekey로 간주한다.
public boolean isApplicationSentToBackground(final Context context) {
ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
List<RunningTaskInfo> tasks = am.getRunningTasks(1);
if (!tasks.isEmpty()) {
ComponentName topActivity = tasks.get(0).topActivity;
if (!topActivity.getPackageName().equals(context.getPackageName())) {
return true;
}
}
return false;
}
Finally the following worked for me :
Seeing How to check current running applications in Android? you can say that if yours is the recent task that is shown on long pressing the home button, then it was send to background.
@Override
public void onPause() {
if (isApplicationSentToBackground(this)){
// Do what you want to do on detecting Home Key being Pressed
}
super.onPause();
}
Function to check whether yours is the app which has been most recently sent to the background:
public boolean isApplicationSentToBackground(final Context context) {
ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
List<RunningTaskInfo> tasks = am.getRunningTasks(1);
if (!tasks.isEmpty()) {
ComponentName topActivity = tasks.get(0).topActivity;
if (!topActivity.getPackageName().equals(context.getPackageName())) {
return true;
}
}
return false;
}
Thanks to @idish for pointing out that don't forget to include the following permission in your manifest:
<uses-permission android:name="android.permission.GET_TASKS" />
I am not sure whether there are any downsides of this, but it worked for me well. Hope it helps someone someday.
P.S: If you use this method in an Activity which has been launched with FLAG_ACTIVITY_NO_HISTORYflag, then this won't be useful as it checks the recent history for figuring out if Home button was clicked.
=================================
=================================
=================================
boolean back_key = true; @Override public boolean onKeyDown(int keyCode, KeyEvent event) { super.onKeyDown(keyCode, event); switch (keyCode) { case KeyEvent.KEYCODE_BACK: if (back_key == true) { Toast.makeText(this, "Again click to exit", Toast.LENGTH_LONG) .show(); back_key = false; mTimerHander.sendEmptyMessageDelayed(0, 2000); } else { Toast.makeText(this, "Shut down Sound Bucket ", Toast.LENGTH_LONG).show(); offOBD(); sound.stop(); finish(); } break; case KeyEvent.KEYCODE_HOME: Toast.makeText(this, "홈 확인 ", Toast.LENGTH_LONG).show(); sound.stop(); break; } return true; } private Handler mTimerHander = new Handler() { public void handleMessage(Message msg) { if (msg.what == 0) { back_key = true; } } }; |
구글링 해서 나오는 소스를 가지고 이래저래 하고 있는데 이상하게 백키는 if만 작동 되고 else 문은 적용이 안되고
홈키는 아이에 적용이 안되고 있습니다...이렇게 하는거 아닌가요?? 소스들은 대부분 거기서 거기던데 ..ㅜㅜ
안왕초보 (1,390 포인트) 님이 2014년 3월 7일 질문
3개의 답변
+2추천
채택된 답변
홈키의 제어는 불가능하지만 이벤트처리는 가능합니다
http://developer.android.com/reference/android/content/Intent.html#ACTION_CLOSE_SYSTEM_DIALOGS
위의 인텐트를 수신해서 인텐트의 reason값을 보시면 결과값으로 홈키가 눌렸는지(homekey),
멀티키가 눌렸는지(recentapps), 화면이 오프가 되었는지(lock)의 판정이 가능합니다.
레미_21 (2,920 포인트) 님이 2014년 3월 7일 답변
안왕초보님이 2014년 3월 7일 채택됨
굳이 복잡한 방법이 필요 없더라구요 ㅎㅎ 지금 홈키 눌렀다가 다시 하는 것을 하고 있는데
public synchronized void onPause() 이 메소드를 사용하면 간편하게 제어 할 수 있더라구요 ㅎㅎ 홈키를 눌렀을 때 pause 상태가 되어 버리는 것 같습니다. 그리고 restart 하는 것을 찾고 있는데
public synchronized void onResume() 이 메소드에 사운드를 다시 시작 하는 것을 하려니 안되더라구요 일단 찾고 다시 말씀 드리겠습니다.. ㅎㅎ
public synchronized void onResume() 가 다시 시작 하는것이 맞는데 흠...바로 적용이 되는 것인지...
onPause() 는 홈키를 눌러 백그라운드로 넘어갔는지 멀티키등 다른 방법으로 백그라운드로 넘어갔는지를 판별할 수가 없죠. 원하시는게 홈버튼의 이벤트가 아니라 단순히 실행중인 액티비티가 화면에 표시되는중인가 아닌가만을 판별하고싶으신거라면 onPause() 로도 대응가능하지요
아 그런가요?? 딱히 홈버튼 이벤트를 적용 하려는 것은 아닙니다. ㅎㅎ 앱이 백그라운드에 나와 있느냐 아니냐 판단 하는 거라서 ㅎㅎ 그런데 onResume 메소드에
if (mChatService != null) {
// Only if the state is STATE_NONE, do we know that we haven't
// started already
if (mChatService.getState() == BluetoothChatService.STATE_NONE) {
// Start the Bluetooth chat services
mChatService.start();
}else{
if (sound.soundState(SoundControl.BASE) != null) {
sound.play(SoundControl.BASE);
} else if (sound.soundState(SoundControl.ACTION) != null) {
sound.play(SoundControl.ACTION);
} else {
;
}
}
}
이렇게 적용을 하니 앱을 실행 하는 것이 아닌데도 바로 사운드가 나와버리네요 흠...
해결 했습니다 ㅎㅎ
onRestart 함수 사용해서 하니깐 되네요 ㅎㅎ 감사합니다 ㅎㅎ
+2추천
1. 키를 한번 누를 때마다 DOWN , UP 이벤트가 1번씩 발생합니다. API 문서를 보세요.
2. 홈키는 앱에서 제어할 수 없습니다.
익명사용자 님이 2014년 3월 7일 답변
아 키가 업 다운 된다는것을 생각을 못 했내요 ㅎㅎ 감사합니다. 해결 했습니다. 아 홈키가 적용이 안된다는게 아쉽네요...쩝
+1추천
아 죄송합니당 ;ㅅ; 잘못봤네용 자삭!
홈키의 경우 이벤트처리를 하실 수는 없어요. 단지 홈 키가 눌려서 나가질 경우 판별할 수 있는
onUserLeaveHint() 함수가 있지요~
초보개발자ㅠ (33,900 포인트) 님이 2014년 3월 7일 답변
복귀했을 때 다시 사운드가 적용이 안되네요..흠..onPause랑 같은 현상이 흠..
해결 했습니다 ㅎㅎ
onRestart 함수 써서 해결 봤습니다 ㅎㅎ 감사합니다
=================================
=================================
=================================
출처: http://iw90.tistory.com/158
public class AppActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_app);
}
@Override
protected void onUserLeaveHint() {
//이벤트
super.onUserLeaveHint();
}
}
=================================
=================================
=================================
출처: http://biig.tistory.com/81
@Override
protected void onUserLeaveHint() {
//여기서 감지
Log.d(TAG, "Home Button Touch");
super.onUserLeaveHint();
}
=================================
=================================
=================================
'스마트기기개발관련 > 안드로이드 개발' 카테고리의 다른 글
안드로이드 android 상태에 따라 버튼 색깔바꾸기 다른 컨트롤도 응용 가능 관련 (0) | 2020.09.20 |
---|---|
[android] Android Studio를 사용하며 자주 겪는 Gradle 관련 오류 해결 방법 (0) | 2020.09.20 |
[android] 안드로이드에서 비디오 플레이 하기 관련 seekbar 컨트롤 관련 (0) | 2020.09.20 |
안드로이드 MotionEvent.getAction() 사용 관련 (0) | 2020.09.20 |
안드로이드 메모리 초기화 문제(GC)에관한 질문드립니다. 메모리 해제 관련 (0) | 2020.09.19 |
댓글 영역