본문 바로가기
개발

[android] 하이브리드 앱(WebView)에서 뒤로가기 버튼 두번눌러 종료하기(2초동안)

by 테크냥이 2020. 4. 30.

하이브리드 앱에서는 사용자가 뒤로가기를 눌렀을 때 상황에 맞는 동작이 필요합니다.

예를들어 뒤로가기를 아무 처리를 하지 않았다면 하이브리드 앱 특성상 앱이 종료되어 버릴겁니다.

 

그럼 어떻게 처리를 해야 할 까요?

Activity 클래스에서는 뒤로가기를 눌렀을때 동작하는 onBackPressed() 메소드를 오버라이딩 할 수 있습니다. onBackPressed()메소드를 이용해 적절히 철히해주면 됩니다.

 

1. canGoBack() 을이용한 처리

웹뷰에서는 히스토리가 남아있는지를 canGoBack()메소드를 호출해 확인 할 수 있습니다. 히스토리가 있다면 canGoBack()는 true를 히스토리가 없다면 false를 반환합니다.

 

    public static WebView mWebView;

    ...

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        ...
        mWebView = findViewById(R.id.mWebView);
        ...
    }
    
    /**
    * 뒤로가기 종료
    */
    @Override
    public void onBackPressed() {
        if(webView.canGoBack()){
            webView.goBack();
        }else{
            super.onBackPressed();
        }
    }

 

2. 특정 페이지에서 뒤로가기 처리

그리고 특정 페이지에 왔을때 예를들면 홈 URL에 도착했을 때는 더이상 히스토리백을 하지 않고 종료 처리가 필요할 때가 있습니다.

 

	...

    /**
     * 뒤로가기 종료
     */
    @Override
    public void onBackPressed() {
        if (mWebView.getUrl().equalsIgnoreCase("https://www.naver.com")
                || mWebView.getUrl().equalsIgnoreCase("https://m.naver.com")
                ) {
            super.onBackPressed();
        }else if(mWebView.canGoBack()){
            mWebView.goBack();
        }else{
            super.onBackPressed();
        }
    }

 

3. 2초 동안 뒤로가기 2회 눌렀을 때 종료
반응형

또 많이 사용하는 2초동안 뒤로가기가 두번 눌렸을 경우 종료하는 방식이 있습니다.

뒤로가기를 눌렀을 경우 그냥 종료해 버린다면 잘못 눌렀을 경우 등에는 불편할 수 있습니다. 또 창을 띄워 종료 여부를 물어보고 종료를 하기에는 역시 잘못 눌렀을때 취소 버튼 등을 눌러야하고 종료를 하려고 해도 터치부위를 움직여야해서 사용자가 피료감을 느낄 수 있습니다. 그래서 토스트로 의사를 한번 물어보고 2초안에 다시 뒤로가기가 눌렸을 경우 앱이 종료되는 그런 기능을 많이 사용합니다.

 

아래는 많이 사용하는 패턴인듯 합니다.(제가 가지고 있는 소스에 쓰여져 있지만 출처는 불분명합니다)

 

BackPressCloseHandler 클래스

import android.app.Activity;
import android.widget.Toast;

public class BackPressCloseHandler {
	private long backKeyPressedTime = 0;
	private Toast guideToast;

	private Activity activity;

	public BackPressCloseHandler(Activity context) {
		this.activity = context;
	}

	public void onBackPressed() {
		if (System.currentTimeMillis() > backKeyPressedTime + 2000) {
			backKeyPressedTime = System.currentTimeMillis();
			showGuide();
			return;
		}
		if (System.currentTimeMillis() <= backKeyPressedTime + 2000) {
			activity.finish();
			toast.cancel();
		}
	}

	public void showGuide() {
		guideToast = Toast.makeText(activity,
				"뒤로 가기를 한번 더 누르면 종료됩니다.", Toast.LENGTH_SHORT);
		toast.show();
	}
}

 

WebView가 있는 Activity내 onBackPressed() 오버라이딩

    BackPressCloseHandler backPressCloseHandler;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
    	...
        backPressCloseHandler = new BackPressCloseHandler(this);
        ...
    }
    
    /**
     * 2초동안 두번 뒤로가기 종료
     */
    @Override
    public void onBackPressed() {
        if (mWebView.getOriginalUrl().equalsIgnoreCase("https://www.naver.com")
                || mWebView.getOriginalUrl().equalsIgnoreCase("https://m.naver.com")
                ) {
            backPressCloseHandler.onBackPressed();
        }else if(mWebView.canGoBack()){
            mWebView.goBack();
        }else{
            backPressCloseHandler.onBackPressed();
        }
    }

 

 

긴글 봐주셔서 감사합니다.

반응형

댓글