코드는 Github
KakaoDeveloper2, 참고
일단 로그아웃과 연결 끊기 기능을 구현하기 전에 2개의 버튼이 있는 마이페이지 레이아웃을 간단하게 만들어야한다.
이 레이아웃에서 로그 아웃과 연결 끊기를 진행해보겠다.
⚡ 로그아웃
Logout.setOnClickListener(new Button.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(getApplicationContext(), "로그아웃 성공!", Toast.LENGTH_SHORT).show();
// 로그아웃 부분
UserManagement.getInstance()
.requestLogout(new LogoutResponseCallback() {
@Override
public void onCompleteLogout() {
// 로그아웃이 되었다면 로그인 액티비티로 넘어간다.
Intent intent = new Intent(MypageActivity.this, LoginActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
}
});
}
});
로그아웃은 사용자 액세스 토큰 및 리프레시 토큰을 만료시켜 현재 기기에서의 로그인 상태를 해제한다.
로그아웃 버튼을 눌렀을 때 로그아웃 요청 결과를 받아 처리할 LogoutResponseCallback
을 구현하고 requestLogout
을 호출한다.
로그아웃이 제대로 처리되면 oncompleteLogout
을 호출한다.
로그아웃 성공 시 Kakao SDK는 토큰을 삭제하고 세션 연결을 종료한다.
나는 onCompleteLogout 호출 시 로그인화면으로 넘어가도록 구현했다.
⚡ 연결 끊기
Signout.setOnClickListener(new Button.OnClickListener() {
@Override
public void onClick(View v) {
new AlertDialog.Builder(MypageActivity.this).setMessage("회원 탈퇴를 진행하시겠습니까?")
.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// 연결 끊기 부분
UserManagement.getInstance()
.requestUnlink(new UnLinkResponseCallback() {
@Override
public void onSessionClosed(ErrorResult errorResult) {
Toast.makeText(getApplicationContext(), "에러: "+errorResult+"로그인 세션이 닫혔습니다.", Toast.LENGTH_SHORT).show();
}
@Override
public void onFailure(ErrorResult errorResult) {
int error = errorResult.getErrorCode();
if(error == ApiErrorCode.CLIENT_ERROR_CODE) {
Toast.makeText(getApplicationContext(), "에러: "+error+"\n네트워크 연결이 불안정합니다.", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(getApplicationContext(), "에러: "+error+"\n회원 탈퇴에 실패했습니다.", Toast.LENGTH_SHORT).show();
}
}
@Override
public void onSuccess(Long result) {
Toast.makeText(getApplicationContext(), "성공: "+result+"\n회원 탈퇴 되었습니다.", Toast.LENGTH_SHORT).show();
Intent intent = new Intent(MypageActivity.this, LoginActivity.class);
startActivity(intent);
finish();
}
});
dialog.dismiss();
}
})
.setNegativeButton("No", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
}).show();
}
});
사용자와 앱의 연결을 해제하는 기능으로 연결 끊기 요청 결과를 받아 처리할 UnlinkResponseCallback
을 구현하고 requestUnlink
를 호출한다.
연결 끊기에 성공하면 사용자는 로그아웃되고, 사용자와 앱의 연결이 끊어진다.
먼저 팝업 창(AlertDialog
)을 띄워서 경고 의사를 물어본다.
Yes
onSuccess
: 연결 해제에 성공한 경우 동작한다.(ID를 반환)onSessionClosed
: 세션이 닫혀있어서 실패한 경우 동작한다.(에러 반환)onFailure
: 연결 해제에 실패한 경우 동작한다.(에러 반환)No
: 그냥 팝업창을 닫는다.연결이 정상적으로 해제되면 로그인 창으로 돌아간다.
⚡ 원래 intent
로 액티비티 전환하는 곳에서 MainActivity를 띄워줘야 맞지만 지금은 테스트 단계이므로 바로 MypageActivity를 띄워서 테스트해보았다.(Manifest도 변경해줘야함)
각자 환경에 맞는 액티비티로 변경하자!
로그아웃 시
탈퇴 후 다시 가입
팀원이 만든 메인 레이아웃과 병합을 해야한다.
메인 레이아웃은 Github를 참고
로그인 액티비티 -> 메인 액티비티 -> 1. 축제 정보 액티비티, 2. 마이페이지 액티비티 이런 느낌이다.
InformationActivity
// 로그인 인텐트 부분(코드 병합하고 MainActivity로 옮겨주기)
Intent intent = getIntent();
String id = intent.getStringExtra("ID"); // id가져오기
Toast.makeText(getApplicationContext(), id+" 로그인 성공!", Toast.LENGTH_SHORT).show();
이 부분을 메인 액티비티로 옮겨서 로그인 액티비티에서 보낸 인텐트를 메인 액티비티가 받게 수정한다.
ReviewActivity
protected void onCreate(Bundle savedInstanceState) {
...
// main으로 돌아가는 부분
Button button = findViewById(R.id.go_main2);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = getIntent();
setResult(RESULT_OK, intent);
finish();
}
});
...
}
메인 액티비티와 게시판 액티비티를 연결시켜준다.
LoginActivity
...
public void onSuccess(MeV2Response result) {
Intent intent = new Intent(getApplicationContext(), MainActivity.class);
intent.putExtra("ID", ""+result.getId());
startActivity(intent);
finish();
}
...
메인 액티비티로 intent를 보내준다.
MainActivity
...
protected void onCreate(Bundle savedInstanceState) {
public static final int REQUEST_CODE_MENU = 101;
...
// 로그인 인텐트 부분(코드 병합하고 MainActivity로 옮겨주기)
Intent intent = getIntent();
final String id = intent.getStringExtra("ID"); // id가져오기
Toast.makeText(getApplicationContext(), id+" 로그인 성공!", Toast.LENGTH_SHORT).show();
// 마이페이지로 이동 인텐트
Button btn_page = findViewById(R.id.go_mypage);
btn_page.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(getApplicationContext(), MypageActivity.class);
intent.putExtra("USERID", ""+id); // ID 보내주기
startActivityForResult(intent, REQUEST_CODE_MENU);
}
});
//후기 게시판으로 이동 인텐트
Button btn_review = findViewById(R.id.go_review);
btn_review.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent review_intent = new Intent(getApplicationContext(), ReviewActivity.class);
review_intent.putExtra("USERID", ""+id); // ID 보내주기
startActivityForResult(review_intent, REQUEST_CODE_MENU);
}
});
...
}
...
MypageActivity
protected void onCreate(Bundle savedInstanceState) {
final Intent intent = getIntent();
String userid = intent.getStringExtra("USERID");
//유저 ID 나타내는 부분
TextView ID = findViewById(R.id.ID);
ID.setText(userid);
// main으로 돌아가는 부분
Button button = findViewById(R.id.go_main);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
setResult(RESULT_OK, intent);
finish();
}
});
}
메인 액티비티가 보낸 인텐트를 받고 다시 메인으로 돌아갈 수 있는 코드
이번 포스팅에서는 카카오 api를 이용해 로그아웃과 연결 해제까지 만들었고 팀원이 만든 메인 액티비티와 병합해 전체적인 틀을 만들었다.
(로그인 - 메인 - 마이페이지 - 메인)
다음 포스팅에는 메인 레이아웃에서 축제 정보 레이아웃의 db 구축과 연동을 구현해보도록 하겠다.