마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

HOMEKEY종료 문제

+1 추천

안녕하세요.

 

현재 그룹채팅을 PUSH를 이용해서 구현하고 있습니다. 

PUSH를 이용하다보니 입장 퇴장 관리를 입장신호 퇴장신호를 서버에 보내고 있습니다. 

채팅화면에는 상대방의 사진을 클릭하면 프로필로 이동하여 사진확대하여 볼수 있습니다. 

그리고 촬영 앨범에서 사진을 송신하고 저장 하는 기능 보이스 송수신 기능이 있습니다. 

 

채팅화면에서 홈키를 누르면 퇴장신호를 보내고 액티비티를 잘 종료시키고 있습니다. 

 

1채팅화면 (홈키종료가능) -> 상대방 프로필 -> 사진확대

문제점1.프로필,사진확대 화면에서 홈키를 눌렀을때 서버에 퇴장신호를 보내고 채팅화면 액티비티를 종료해야 합니다.

 

2.채팅화면 -> 내장카메라 

문제점2.채팅화면에서 촬영버튼을 눌러 내장 카메라를 기동한후 홈키를 누를 경우 채팅화면을 종료시키고 서버에 퇴장신호를 보내야 합니다. 

 

위두가지를 어찌 해결해야 할지 조언부탁드려도 될까요???

바쁘신 시간 읽어주셔서 감사합니다. 

  (11,920 포인트) 님이 2013년 6월 18일 질문

6개의 답변

+2 추천
 
채택된 답변
다른 앱으로 넘어가서 홈키를 누르거나 하는 경우는 캐치 할 수가 없다고 봐도 무방합니다.

스래드를 돌려서 최상위 액티비티를 짧은 간격으로 조사라도 하지 않는이상 말이지요

 

사진 확대나 카메라 기능을 만드시는 앱의 액티비티 내에서 처리하도록 개발 하시고

onUserLeaveHint를 이용해서 홈키이벤트를 잡는게 한계일 것 같습니다.
고또 (6,100 포인트) 님이 2013년 6월 18일 답변
 님이 2013년 6월 18일 채택됨
역시 그렇군요...... onUserLeaveHint() 요녀석은 시도 때도 불려져서
액티비티 이동할시에는 쓸모가 없더군요...

일정시간 서버 에 신호를 보내지 않으면 서버에서 퇴장을 시키고 어플에 PUSH메시지를 보내서 액티비티를 종료시킬려 하는데

문제는 GCM가 100%라는 확신이 없다능......

다른 방법이 있으면 좋겠네요..
타이머를 둬서 일정시간 이상(10분정도) 해당 액티비티가 onResume로 진입 못하면 접속을 끊어버리고 그 이후에 접속하게 되면 '장시간 대화가 없어 접속이 끊어졌습니다.' 등으 맨트를 팝업으로 띄워주는 정도로 처리하면 어떨까요
앗 그런 방법이 .... 머리에 번쩍했습니다.
감사합니다. 고또님 말씀대로 하는게 지금으로선 가장 좋을꺼 같습니다.
정말 감사합니다.
+4 추천
public class MainActivity extends Activity {

	CloseSystemBroadcastReceiver mReceiver = new CloseSystemBroadcastReceiver();
	
	HomeKeyListener mListener = new HomeKeyListener() {
		
		@Override
		public void onRecentApps() {
			Log.d("NR", "최근 사용목록(홈키 롱 클릭)");
		}
		
		@Override
		public void onHomeKeyPressed() {
			
			Log.d("NR", "홈키 눌렀을때");
		}
	};
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		IntentFilter filter = new IntentFilter();
		filter.addAction(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);
		
		registerReceiver(mReceiver, filter);
		
		mReceiver.setOnHomeKeyListener(mListener);
		
	}

	@Override
	protected void onDestroy() {
		super.onDestroy();
		unregisterReceiver(mReceiver);
	}
	
	public class CloseSystemBroadcastReceiver extends BroadcastReceiver{

	    final String SYSTEM_DIALOG_REASON_KEY = "reason";

	    final String SYSTEM_DIALOG_REASON_RECENT_APPS = "recentapps";

	    final String SYSTEM_DIALOG_REASON_HOME_KEY = "homekey";
		
	    HomeKeyListener mListener;
	    
	    public CloseSystemBroadcastReceiver(){}
	    
	    public CloseSystemBroadcastReceiver(HomeKeyListener listener){
	    	mListener = listener;
	    }
	    
	    public void setOnHomeKeyListener(HomeKeyListener listener){
	    	mListener = listener;
	    }
	    
		@Override
		public void onReceive(Context arg0, Intent arg1) {
			final String action = arg1.getAction();
			
			if (action.equals(Intent.ACTION_CLOSE_SYSTEM_DIALOGS)) {  
				
	            String reason = arg1.getStringExtra(SYSTEM_DIALOG_REASON_KEY); 
	            
	            if (reason != null) {
	            	
	                if(mListener != null){
	                	
	                	if (reason.equals(SYSTEM_DIALOG_REASON_HOME_KEY)) {
	                		mListener.onHomeKeyPressed();
	                	} else if (reason.equals(SYSTEM_DIALOG_REASON_RECENT_APPS)) {
	                		mListener.onRecentApps();
	                	}
	                	
	                }
	                
	            }
	            
	        }
			
		}
		
	}
	
	public interface HomeKeyListener{
		public void onHomeKeyPressed();
		public void onRecentApps();
	}
	

익명으로 댓글이 달려서

다시 답니다..

매니패스트에 등록이 되는 리시버가 아니니 참고하세요.

슈퍼클래스 (360 포인트) 님이 2013년 6월 18일 답변
너무너무 감사합니다. 채택해드리고 싶은데 한분밖에 안되서;;;
추천 꾹누르고 공책에 적어 열심히 공부 하겠습니다.
감사합니당.....
정말 제가 원하던 답변이네요.... 원하던데로 구현이 되었습니다.
다시한번 감사드립니다^^
+2 추천
이정도면 홈키를 잡을 수 있을 것 같습니다.

확인해보세요.
익명사용자 님이 2013년 6월 18일 답변
2013년 6월 18일 수정
헛 !!!
완전 잘됩니다. 초짜에겐 상상도 할수 없었던 방법이네요..
현어플에서 다른어플 기동후 홈키 눌러도 잘되네요. 신기신기
많은 공부가 되었습니다.
너무너무 감사드립니다.
+1 추천
앱이 Pause상태가 되고 다른 앱이나 액티비티에서 종료될때 홈키 종료 체크를 못하신다는 말씀이시죠?

제가 알기론 방법이 없는것으로 알고 있는데... 저도 궁금하네요.
그후최초 (2,980 포인트) 님이 2013년 6월 18일 답변
액티비티가 포즈 상태고 다른액티비티에서 홈버튼눌렀을시
처음 액티비티를 종료 시킬수 있냐 라는 질문입니다. ^^
+1 추천
현제 만든 앱이 홈키 이벤트 또는 다른 이벤트에 의해서 backgroudn로 내려가는 경우를 찾기 위해서는

onStop() 에서 최상위 activity의 Package명을 구하여 현재 내가 만든 어플의 package와 같지 않은 경우

내 어플은 background상태라고 판단할 수 있을 거 같네요

onStop에 해당 코드를 구현하여 테스트 해보세요
블랙프리 (1,050 포인트) 님이 2013년 6월 18일 답변
답변 감사합니다,
같은 어플내의 액티비티는 가능한데

단말기에 내장되어있는 카메라를 기동후 홈버튼을 눌렀을경우가 막히네요

카메라를 취소할경우는 onActivityResult에 널값이 돌아오는데
홈키를 누르면 포즈 상태로 메인 화면으로 가나봐여...
+1 추천
이건 정책 문제일듯 합니다.

홈키를 누르면 퇴장을 하겠다고 원하신거라면 카메라가동 기타 메시지 수신 전화 등 상황에 따라 다 예외처리를 걸어야 한다는 건데 사실상 불가능 하다고 보여집니다.

제조사의 협력으로 인해 홈키를 잡을 수 있으면 모를까 루팅외에는 홈키 이벤트를 따로 잡을 방법이 없기 때문에 사실상 정책 변경으로 해결하시는게 좋을거 같습니다.

홈키나 기타 메시지 팝업 부수적인 일을 할때는 대기상태로 변경하는 것이 맞아 보이고 프로필 사진 변경 같은 경우도 stop이나 pause를 상태를 읽어 이동 시 그 상태에 맞게 대기 상태를 따로 두시는게 관리하시기 편하실것 같네요. 정말 중요한 back키나 강제종료시에는 채팅방을 나가도록 하는게 모든 예외상황에 대한 시나리오로 봤을때 좀 더 안정적이라고 생각되네요.
헐레벌떡 (310 포인트) 님이 2013년 6월 18일 답변
답변감사합니다.
몇일 고민해보고 조사해보고 질문해보고 하였는데 결론은 헐레님이 말씀하신데로 사양을 바꿔야할것 같네요.

어쩔수없이 카메라 기동후 홈버튼눌른사람이 있다면 서버에서
일정시간 체크해서 퇴실 시키고 어플에 PUSH을 보내어
채팅화면이 있다면 종료시키는 방향으로 갈려 합니다.

여러모로 관심 가져주시고 답변 달아주신분들 진심으로 감사드립니다.
그래도 혹시 방법이 있다 하시는 분은 조언 부탁드려요...
...