안드로이드 웹뷰 내의 javascript와 커뮤니케이션하는 방법은 간단하다. 애플보다 간단하고, (개인적으로) 더 강력하다.
1. Javascript -> Android
2. 그 반대
1번은 정말 간단하고 강력하다. 안드로이드 내에 클래스를 하나 만든다. 어떤 것이든 상관 없다.
그 안에 자바스크립트 내에서 호출할 함수를 작성하고, 그 위에 @JavascriptInterface 어노테이션을 기술한다.
해당 함수가 작성된 클래스 이름이 CommunicationWithJavascript 라고 하면
myWebView.addJavascriptInterface(new CommunicationWithJavascript(this), "자바스크립트에서 사용할 이름");
이후 자바스크립트에서, 본인이 정한 태그(예를 들어 Android)를 이용해 Andoroid.myMethod() 이런 방식으로 호출해서 사용하면 된다. 객체 하나를 import한 것과 같다.
아래는 코드 일부
CommuJavaScript.class
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | public class CommJavaScript implements GoogleMap.OnMyLocationChangeListener{ Context mContext; Location mCurrPosition; public CommJavaScript(Context mContext) { this.mContext = mContext; } @JavascriptInterface public void toast(String msg){ Toast.makeText(mContext, msg, Toast.LENGTH_SHORT).show(); } @JavascriptInterface public void getCurrentPosition(){ Location l = null; if(null == mCurrPosition){ l = new Location(LocationManager.NETWORK_PROVIDER); } else{ l = mCurrPosition; } onMyLocationChange(l); // return new Float[] { (float)l.getLatitude(), (float)l.getLongitude()}; } | cs |
MainActivity.class
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mWebView = (WebView) findViewById(R.id.vw_main_web); mActionBar = getSupportActionBar(); mClient = new WebChromeClient(); mWebView.setWebChromeClient(mClient); mWebView.setWebViewClient(new WebViewClient()); settingForWebView(mWebView.getSettings()); setButtonListener(); mWebView.addJavascriptInterface(new CommJavaScript(this), "Android"); mWebView.loadUrl(URL); | cs |
2번은 정말 간단하다. 자바스크립트 내에 receiveFromAndroid(message) 함수가 있다고 가정하면, 안드로이드의 웹뷰 객체의 loadUrl을 사용하면 된다. 어떻게? 스키마를 통해서.
myWebView.loadUrl("javascript:receiveFromAndroid("my message");
열려 있는 웹페이지에 해당 함수가 없으면
"Uncaught ReferenceError: receiveFromAndroid is not defined", source: 웹페이지 주소
라는 에러를 뱉는다.
기본적으로 애플과 맥락은 같이 하나 더 편하다고 생각한다. 무엇보다 직관적이고 ios처럼 내부적으로 자동 호출되는 부분이 없다. 적어도 사용자가 연결을 시켜야 된다는 점은 초보자에게 오히려 더 쉽게 다가오지 않을까 싶다. ios 방법 찾느라 개고생해서 이런 소리 하는건 아니다..
댓글