2014년 11월 25일 화요일

[Android] 메세지 수신시 카카오톡처럼 잠자는 폰에 팝업 띄우기

펌위치 : http://blog.daum.net/_blog/BlogTypeView.do?blogid=0HOSO&articleno=5387546&categoryId=227869&regdt=20120505210314

카카오톡을 보면 메세지 수신시 폰이 잠자고 있어도(화면 꺼짐) 화면이 켜지면서
팝업으로 메세지 수신을 알려준다.
본인은 개인적으로 내 허락없이 잠자는 갤스의 코털을 건드리는 것이 싫어 설정을 꺼놨지만
사용자들에게 호응을 받을 수 있는 기능이라 생각한다.
사족이지만, 마이피플은 해당 기능을 끌 수 있는 설정을 제공하지 않아 본인 폰에서 사라졌다(웃음)

자, 이 포스트는 아무래도 안드로이드 C2DM 포스트의 연장선으로 생각해야 할 것 같다.
앱의 리시버가 메세지를 받으면 폰이 잠자는 중이라도 팝업으로 알려줘야 하기 때문이다.

만약 본 포스트가 이해되지 않는다면 이전 포스트를 필독하시라.

포스트는 메세지를 받은 시점부터 출발한다.
해당 기능을 구현하려는 개발자들은 
리시버가 메세지를 받으면 받은 메세지를 처리하는 부분을 분명 만들어두었을 것이다.
예컨대 다음과 같다.
private void getMessage(Intent intent, Context context) {
    ...
    ...
    ...
}
이 부분에 팝업을 띄울 수 있는 소스를 넣어보자.

private void getMessage(Intent intent, Context context) {
    // 만약 팝업 알림 설정이 켜져있으면 실행한다.
    if (isPopup) {
        // 팝업으로 사용할 액티비티를 호출할 인텐트를 작성한다.
        Intent popupIntent = new Intent(context, Popup.class)
        .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        // 그리고 호출한다.
        context.startActivity(popupIntent);
    }
}

이렇게 놓고 보면 어떻게 꺼진 화면에 팝업을 띄우나 싶으실 것이다.
이제 이 팝업 액티비티에 추가적인 코딩을 해야 한다.
액티비티의 onCreate 메서드에 다음 내용을 추가한다.


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.popup);
        // 이 부분이 바로 화면을 깨우는 부분 되시겠다.
        // 화면이 잠겨있을 때 보여주기
    getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
        // 키잠금 해제하기
        | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD
        // 화면 켜기
        | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);
    TextView tv = (TextView)findViewById(R.id.message);
    tv.setText(getIntent().getStringExtra("답변이 도착했어요!");
    ImageButton ib = (ImageButton)findViewById(R.id.confirm);
    ib.setOnClickListener(new onClickListener() {
        @Override
        public void onClick(View v) {
                        // 확인버튼을 누르면 앱의 런처액티비티를 호출한다.
            Intent intent = new Intent(Popup.this, Main.class);
            startActivityForResult(intent, K.REQUEST_NORMAL);
            finish();
        }
    });
}


생각보다 간단하다.
하지만 본인은 이 기능을 구현하기 위해 본 포스트 내용에 비해 많은 시간을 허비했다.
본 포스트를 구독하는 다른 개발자들을 위해 이 팁을 바친다.

Q&A : lifecluee@gmail.com

댓글 없음:

댓글 쓰기