상세 컨텐츠

본문 제목

[android] 안드로이드 android 홈버튼 이벤트, 감지 관련

스마트기기개발관련/안드로이드 개발

by AlrepondTech 2020. 9. 20. 01:51

본문

반응형

 

 

 

=================================

=================================

=================================

 

 

 

 

 

출처: 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.

 

 

=================================

=================================

=================================

 

 

출처: http://www.masterqna.com/android/21875/home-%ED%82%A4-back-%ED%82%A4-%EC%9D%B4%EB%B2%A4%ED%8A%B8-%EC%A0%81%EC%9A%A9%EC%9D%84-%ED%95%98%EB%8A%94%EB%8D%B0-%EC%95%88%EB%90%98%EB%84%A4%EC%9A%94

 

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;


   }


  }


 };

 

 

 

반응형

 

728x90

 

 

 

구글링 해서 나오는 소스를 가지고 이래저래 하고 있는데 이상하게 백키는 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() 이 메소드에 사운드를 다시 시작 하는 것을 하려니 안되더라구요 일단 찾고 다시 말씀 드리겠습니다..  ㅎㅎ

안왕초보 님이 2014년 3월 7일 댓글작성

 

public synchronized void onResume() 가 다시 시작 하는것이 맞는데 흠...바로 적용이 되는 것인지...

안왕초보 님이 2014년 3월 7일 댓글작성

 

onPause() 는 홈키를 눌러 백그라운드로 넘어갔는지 멀티키등 다른 방법으로 백그라운드로 넘어갔는지를 판별할 수가 없죠. 원하시는게 홈버튼의 이벤트가 아니라 단순히 실행중인 액티비티가 화면에 표시되는중인가 아닌가만을 판별하고싶으신거라면 onPause() 로도 대응가능하지요

레미_21 님이 2014년 3월 7일 댓글작성

 

아 그런가요?? 딱히 홈버튼 이벤트를 적용 하려는 것은 아닙니다. ㅎㅎ 앱이 백그라운드에 나와 있느냐 아니냐 판단 하는 거라서 ㅎㅎ 그런데 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 {
                    ;
                }
                        }
        }  

이렇게 적용을 하니 앱을 실행 하는 것이 아닌데도 바로 사운드가 나와버리네요 흠...

안왕초보 님이 2014년 3월 7일 댓글작성

 

해결 했습니다 ㅎㅎ 
onRestart 함수 사용해서 하니깐 되네요 ㅎㅎ 감사합니다 ㅎㅎ

안왕초보 님이 2014년 3월 7일 댓글작성

 

 

+2추천

1. 키를 한번 누를 때마다 DOWN , UP 이벤트가 1번씩 발생합니다. API 문서를 보세요.

2. 홈키는 앱에서 제어할 수 없습니다.

익명사용자 님이 2014년 3월 7일 답변

  

아 키가 업 다운 된다는것을 생각을 못 했내요 ㅎㅎ 감사합니다. 해결 했습니다. 아 홈키가 적용이 안된다는게 아쉽네요...쩝

안왕초보 님이 2014년 3월 7일 댓글작성

 

 

+1추천

아 죄송합니당 ;ㅅ; 잘못봤네용 자삭!

홈키의 경우 이벤트처리를 하실 수는 없어요. 단지 홈 키가 눌려서 나가질 경우 판별할 수 있는

onUserLeaveHint() 함수가 있지요~

초보개발자ㅠ (33,900 포인트) 님이 2014년 3월 7일 답변

  

복귀했을 때 다시 사운드가 적용이 안되네요..흠..onPause랑 같은 현상이 흠..

안왕초보 님이 2014년 3월 7일 댓글작성

 

해결 했습니다 ㅎㅎ
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();

}

 

 

=================================

=================================

=================================

 

 

반응형


관련글 더보기

댓글 영역