웹뷰는 안드로이드 위젯의 한 종류로 내장 웹브라우저

안드로이드 앱 안에서 HTML을 호출하여 앱을 구현하는 하이브리드 형태의 앱을 개발하는데도 많이 사용된다.

하이브리드 앱은 네이티브앱에 비해 개발이 비교적 쉽고, 기기간 호환성을 해결하기 상대적으로 편하다는 장점이 있으며,

HTML기반인 만큼 상대적으로 반응성이 약하고, 애니메이션등의 다양한 UI효과를 넣기 어렵다.


그럼에도 불구하고 SNS나 기타 서비스 앱에서는 타 웹사이트 링크로 가는 기능들을 제공하기 위해 웹뷰가 많이 사용된다.

웹뷰에 사용되는 브라우저는 우리가 일반적으로 사용하는 브라우저 수준은 아니며, 

안드로이드 OS에 맞게 일부 기늘들을 제외한 아주 기본적인 웹브라우저이다.


모바일 웹페이지    //    하이브리드 앱    //    네이티브 앱


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
26
27
28
29
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="${relativePackage}.${activityClass}" 
    android:orientation="vertical">
    
    <RelativeLayout 
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
    <EditText 
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_toLeftOf="@+id/main_btn_search"
        android:id="@+id/main_edt_url"/>
    <Button 
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_alignParentRight="true"
        android:id="@+id/main_btn_search"/>
    </RelativeLayout>
    <WebView 
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/main_webView"/>
 
 
</LinearLayout>
 
cs


귄한부여(Manifest)

1
<uses-permission android:name="android.permission.INTERNET"/>
cs



1
2
3
4
5
6
7
    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" 
        android:hardwareAccelerated="true">
  하드웨어가속사용(성능향상) : 웹뷰나 미디어재생같은 기능 사용시
cs

findViewById

1
2
3
4
5
6
7
8
9
10
11
    private EditText uriEdt;
    private Button searchBtn;
    private WebView webview;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        uriEdt = (EditText) findViewById(R.id.main_edt_url);
        searchBtn = (Button) findViewById(R.id.main_btn_search);
        webview = (WebView) findViewById(R.id.main_webView);
    }
cs

1
2
3
4
        //이 함수를 생략하면 어플 위에 새창이 뜬다.
        webview.setWebViewClient(new WebViewClient());
        
        webview.loadUrl("http://pikac.tistory.com");
cs


1
2
3
4
5
6
7
8
9
10
11
12
        searchBtn.setOnClickListener(new View.OnClickListener() {
            
            @Override
            public void onClick(View arg0) {
                // TODO Auto-generated method stub
                String url = uriEdt.getText().toString();
                if(!url.startsWith("http://")){
                    url = "http://" +url;
                }
                webview.loadUrl(url);
            }
        });
cs



1
2
3
4
5
6
7
8
9
10
11
        webview.setWebViewClient(new WebViewClient(){
 
            @Override
            public void onPageFinished(WebView view, String url) {
                // TODO Auto-generated method stub
                super.onPageFinished(view, url);
                urlEdt.setText(url);
                //page가 다 불려졌을때 현재 url을 url입력창에 세팅
            }
            
        });
cs



1. 웹브라우저스럽게 앞으로가기, 뒤로가기 버튼 추가, 눌렸을 때 웹브라우저 히스토리를 이용해 앞 뒤 이동하기

1
2
webview.goBack(); 뒤로가기
webview.goForward(); 앞으로가
cs

1
2
gobackBtn.setEnabled(webview.canGoBack());
goforwardBtn.setEnabled(webview.canGoForward());
   이동할곳 없을 시 비활성화cs



2. 외부가 아닌 html파일을 저장해놓고 로드하기

1
webview.loadUrl("file:///android_asset/ladder.html");
cs


3. 자바스크립트 코드 동작하기

1
webview.getSettings().setJavaScriptEnabled(true);
cs

4. 북마크 저장하기

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
26
27
28
29
30
31
32
public class Bookmark {
    private int _id;
    private String name;
    private String url;
    private Date redDate;
    public int get_id() {
        return _id;
    }
    public void set_id(int _id) {
        this._id = _id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getUrl() {
        return url;
    }
    public void setUrl(String url) {
        this.url = url;
    }
    public Date getRedDate() {
        return redDate;
    }
    public void setRedDate(Date redDate) {
        this.redDate = redDate;
    }
    
} 모델 생성
 
cs


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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.List;
 
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;
 
public class BookmarkDBmanager {
    private static final String DB_NAME = "bookmark.db";
    private static final String TABLE_NAME = "bookmark";
    public static final int dbVersion = 1;
    
    private SQLiteDatabase db;
    private Context context;
    private SQLiteOpenHelper openHelper;
    
    private class MySQLiteOpenHelper extends SQLiteOpenHelper{
        
        
        public MySQLiteOpenHelper(Context context, String name, CursorFactory factory, int version) {
            super(context, name, factory, version);
            // TODO Auto-generated constructor stub
        }
 
        @Override
        public void onCreate(SQLiteDatabase db) {
            // TODO Auto-generated method stub
            String sql = "create table"+TABLE_NAME + "id integer primary key autoincrement,"
                    + " name text, url text, regdate text";
            db.execSQL(sql);
            
        }
 
        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
            // TODO Auto-generated method stub
            
        }
        
    }
    public BookmarkDBmanager(Context context){
        this.context = context;
        this.openHelper = new MySQLiteOpenHelper(context, DB_NAME, null, dbVersion);
        db = openHelper.getWritableDatabase();
    }
    public void insertBookmark(Bookmark bookmark){
        ContentValues params = new ContentValues();
        params.put("name", bookmark.getName());
        params.put("url", bookmark.getUrl());
        params.put("regdate"new SimpleDateFormat("yyyy-MM-dd").format(bookmark.getRedDate()));
        db.insert(TABLE_NAME, null, params);
    }
    public List<Bookmark> selectAll(){
        Cursor cursor = db.rawQuery("select * from "+TABLE_NAME, null);
        List<Bookmark> list = null;
        while(cursor.isAfterLast()){
            Bookmark bookmark = new Bookmark();
            bookmark.setName(cursor.getString(1));
            bookmark.setUrl(cursor.getString(2));
            try {
                bookmark.setRedDate(new SimpleDateFormat("yyyy-MM-dd").parse(cursor.getString(3)));
            } catch (ParseException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            list.add(bookmark);
            cursor.moveToNext();
        }
        return list;
    }
}
 
cs


' IOT 기반 응용 SW과정 > Android, Arduino' 카테고리의 다른 글

Day109 아두이노  (0) 2016.08.29
Day107 안드로이드 브로드캐스트리시버  (0) 2016.08.25
Day103  (0) 2016.08.17
Day102 안드로이드  (0) 2016.08.11
Day101  (0) 2016.08.10

SQLite는 클라이언트 응용 프로그램에 임베디드되어 동작하는 오픈소스 데이터베이스의 일종이다. 

안드로이드iOSOS X에 기본적으로 포함되어 있다.


SQL에서 하는 기능이 SQLite에선 '경량화'의 이유로 제한되는 경우가 많다. 

예를 들자면, 프로토콜 조작을 통해 네트워크에 접근할 수는 있지만, 동시 접근은 제한된다. 

또한 복잡하거나 큰 데이터를 보관하는 데에는 적절하지 않다. 인고팅 역시 유니코드만 사용할  수 있다.(어짜피 혼자 사용)

// 모바일기기에서 내부적으로 데이터관리용도 정도로 사용하는게 적합 


데이터베이스 전체를 파일 하나에 저장하기 때문에, 파일을 통째로 복사하면 백업이 끝난다. 

// 아주 단순한파일관리, 이식편의성이 좋다.


JDBC에서 디비에 연결할때는 Connection객체를 획득해서 Statement객체에 sql구문을 실어서 보냄

쿼리할때는 구문객체 전달의 결과로 ResultSet을 회수함


안드로이드 SQLite에서는 SQliteDatabase객체를 통해서 sql문을 전달함

쿼리결과는 Cursor라는 타입의 객체를 통해서 결과값을 회수할 수 있음.


1. SQLiteDatabase 객체 얻기

1
2
3
4
public class MainActivity extends Activity {
    private SQLiteDatabase db;
    private static final String DBNAME = "person.db";
    private static final String TABLE_NAME = "person";
cs

SQlite에서는 디비 접속및생성이 하나 (없으면 만들어서 쓰고 있으면, 있는거를 사용한다)

SQLite에 접속하는 방법(SQLiteDatabase객체를 획득하는 방법)

1. Context객체의 openOrCreateDatabase메소드 사용

2. SQLiteDatabaseOpenHelper클래스를 이용하는 방법

1
2
3
4
5
public void onClick(View v) {
    db = openOrCreateDatabase(DBNAME, MODE_PRIVATE, null);
    //DB가 존재하면 오픈, 존재하지 않으면 생성 후 오픈
    //DB파일의 생성되는 경로는 /data/data/{AppPackage}/db/여기
}
cs


1
2
3
    private static final String DB_PATH = 
            Environment.getExternalStorageDirectory().getPath().toString();


db = openOrCreateDatabase(DB_PATH + "/" + DBNAME, MODE_PRIVATE, null);
cs
    //DB경로를 SD카드로 지정
cs

외장메모리 접근 권한 부여

1
2
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
cs

2. 1객체를 통해 테이블 생성 명령 날리기

1
db.execSQL("");//sql날리는 가장 단순한 방법
cs


3-1. 2의 테이블에 데이터 삽입하기

쌩 sql 날리기 

1
2
db.execSQL("insert into person (name, phoneNum, gender, age)"
            + " values ('"+ name + "','" + phoneNum + "'," + age + "," + gender + ")");
cs


- android SQLite interface 

1
2
3
4
5
6
ContentValues param = new ContentValues();
param.put("name", name);
param.put("phoneNum", phoneNum);
param.put("age", age);
param.put("gender", gender);
db.insert(TABLE_NAME, null, param);
cs

3-2. 2의 테이블에 데이터 수정하기

1
2
3
4
5
6
ContentValues param = new ContentValues();
param.put("name", name);
param.put("phoneNum", phoneNum);
param.put("age", age);
param.put("gender", gender);
db.update(TABLE_NAME, param, "_id=?", new String[]{id});
cs

3-3. 2의 테이블에서 데이터 삭제하기

1
2
String id = idEdt.getText().toString();
db.delete(TABLE_NAME, "_id=?", new String[]{id});
cs

3-4. 2의 테이블에서 데이터 조회하기


' IOT 기반 응용 SW과정 > Android, Arduino' 카테고리의 다른 글

Day98_2 안드로이드 OpenHelper  (0) 2016.08.05
Day98 안드로이드 db Select문  (0) 2016.08.05
Day95  (0) 2016.08.02
Day94 안드로이드 listview  (0) 2016.08.02
Day93 AlertDialog  (0) 2016.07.29

+ Recent posts