본문 바로가기

프로그래밍/Android

안드로이드 하이브리드 앱 소스

웹 프로그래머로 일하다 보니 모바일 웹을 앱처럼 하는 작업이 필요하게 되었다.
나는 이것이 웹앱인줄 알았는데 하이브리드앱이란걸 나중에 알았다. ㅋㅋㅋ
"내가 니 앱이다"라는 말이 떠오른다~

처음에는 안드로이드앱, 웹앱 이런것도 모르고 네이티브앱도 전혀 모르는 상태에서 웹페이지 바로가기 아이콘하나 만드는 것이니
그리 어려울건 없을것이라 생각하고 시작하였다. ㅋㅋㅋ

처음 버전은 단순히 웹만 불러와 화면에 보여주었는데 이것이 자바스크립트도 안먹고, 세로에서 가로로 보면 초기화 되는 문제가 있었고
어찌어찌 1.2버전까지 패치하여 안정화 되었다 ^^;


로드된 hotlist.kr 화면


인터넷 접속 실패창


자바스크립트 호출 알림창




1. 우선 Manifest에 uses-permission을 추가한다.
<manifest xmlns:android…
    …
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
</manifest>


2. 메인화면인 layout/main.xml에 WebView 전체화면으로 구성
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">
 <WebView
        android:id="@+id/wv"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent" />

</LinearLayout>


3. Main.java 메인
public class Main extends Activity {
 WebView wv = null;
 
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
       
        // 인터넷 사용환경 검사 3G,WiFi
        CheckWiFiMobile cwm = new CheckWiFiMobile(this);
        cwm.test();
       
        loadWeb("http://hotlist.kr/"); // 모바일 웹 페이지 URL 지정
}
   
    // 가로,세로 보기 전환시 reload()방지
    @Override
    public void onConfigurationChanged(Configuration newConfig){
     super.onConfigurationChanged(newConfig);
    }
   
    /* 웹뷰 로드 */
    private void loadWeb(String url){
     final Context myApp = this;
     wv = (WebView)findViewById(R.id.wv);
     wv.clearCache(true); // 캐쉬제거
     wv.getSettings().setJavaScriptEnabled(true); // 자바스크립트 실행가능
     wv.setWebChromeClient(new WebChromeClient() { // 자바스크립트 경고창 사용
         @Override
         public boolean onJsAlert(WebView view, String url, String message, final android.webkit.JsResult result)
         {
             new AlertDialog.Builder(myApp)
              .setIcon(R.drawable.icon)
                 .setTitle("알림!") // AlertDialog
                 .setMessage(message)
                 .setPositiveButton(android.R.string.ok,
                         new AlertDialog.OnClickListener()
                         {
                             public void onClick(DialogInterface dialog, int which)
                             {
                                 result.confirm();
                             }
                         })
                 .setCancelable(false)
                 .create()
                 .show();

             return true;
         };
     });

     wv.loadUrl(url); // 웹페이지 로드
     wv.setWebViewClient(new HelloWebViewClient()); // WebViewClient 지정
     wv.setHorizontalScrollBarEnabled(false); // 세로 스크롤 제거
     wv.setVerticalScrollBarEnabled(false); // 가로 스크롤 제거

    }
   
    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event){
     if((keyCode == KeyEvent.KEYCODE_BACK) && wv.canGoBack()){
      wv.goBack();
      return true;
     }
     return super.onKeyDown(keyCode, event);
    }
   
    private class HelloWebViewClient extends WebViewClient{
     @Override
     public boolean shouldOverrideUrlLoading(WebView view, String url){
      view.loadUrl(url);
      return true;
     }
    }
}


4. CheckWiFiMobile.java 인터넷 접속이 되었는지 확인하는 클래스
public class CheckWiFiMobile
{
 Context context = null;
 
 public CheckWiFiMobile(Context context){
  this.context = context;
 }
 
 public boolean test(){
  // 네트워크 연결 관리자의 핸들을 얻습니다.
  ConnectivityManager cm = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);
  
  // 기본 모바일 네트워크 연결자(3G)관련 정보 얻습니다.
  NetworkInfo ni = cm.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
  boolean isMobileConn = ni.isConnected();
  
  // WiFi 관련 정보를 얻습니다.
  ni = cm.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
  boolean isWifiConn = ni.isConnected();
  
  System.out.println("isWifiConn:"+isWifiConn);
  System.out.println("isMobileConn:"+isMobileConn);
  
  if( isWifiConn || isMobileConn ){
   // 인터넷 연결할 수 있음
   return true;
  }else{
   // 인터넷 연결할 수 없음 (경고창 표시)
   Builder alert = new AlertDialog.Builder(context);
   alert.setIcon(R.drawable.icon);
   alert.setTitle("인터넷 접속 실패");
      alert.setMessage("인터넷에 접속할 수 없습니다!\n학인 후 다시 실행해 주십시오.");
      alert.setPositiveButton("OK", new DialogInterface.OnClickListener() {    
         @Override
         public void onClick(DialogInterface dialog, int which) {
           dialog.dismiss();
         }
      });
      alert.show();
      return false;
  }
 }
}


현재 잘 사용하고 있으니 문제는 없다 허나 중복되는 소스도 있고 main.java에 소스가 그대로 있으니 보기에 그리 좋지않다
객체지향으로 개선이 필요한 소스다.


필요하신분은 그냥 쓰시오.