Báo cáo đồ án ứng dụng note bằng android

Báo cáo đồ án ứng dụng note bằng android

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (838.84 KB, 44 trang )

Bạn đang đọc: Báo cáo đồ án ứng dụng note bằng android

TRƯỜNG ĐẠI HỌC SƯ PHẠM KỸ THUẬT VINH
KHOA CÔNG NGHỆ THÔNG TIN
BỘ MÔN KHOA HỌC MÁY TÍNH

ĐỒ ÁN MÔN HỌC
PHÁT TRIỂN ỨNG DỤNG DI ĐỘNG
Tên đề tài : XÂY DỰNG ỨNG DỤNG NOTE BẰNG ANDROID
Giáo viên hướng dẫn: Võ Thị Kim Hoa
Sinh viên thực hiện : Phan Thị Linh
Lớp: ĐHCTTCK09Z

Nghệ An – 2017

TRƯỜNG ĐẠI HỌC SPKT VINH
VIỆT NAM
KHOA CÔNG NGHỆ THÔNG TIN
BỘ MÔN: KHOA HỌC MÁY TÍNH
TT
1

Họ và tên
Phan Thị Linh

CỘNG HÒA XÃ HỘI CHỦ NGHĨA
Độc lập – Tự do – Hạnh phúc

MSSV

Điện thoại

Email

0905140786

0964456330

phanlinh25660@gmail.com

PHIẾU GIAO ĐỒ ÁN MÔN HỌC
MÔN HỌC: ỨNG DỤNG DI ĐỘNG ANDROID
Sinh viên/ nhóm sinh viên:
Lớp: DHCTTCKZ09 (Đại học CNTT Khóa 9)
Ngày giao đề tài: 25/09/2017

Ngày hoàn thành: / /2017

1.1 Tên đề tài: Xây dựng ứng dụng Note bằng Android
Yêu cầu: Xây dựng ứng dụng di động trên Android.
1.2. Nhiệm vụ đồ án: .

Yêu cầu 1:
Ngôn ngữ sử dụng:JAVA, máy ảo genimotion, phần mềm Android Studio,
csdl có thể là firefox hoặc sqlite.

Yêu cầu 2: Phân tích yêu cầu và xây dựng ứng dựng bao gồm:
o Ứng dụng cho phép nhập, xem, sửa xóa ghi chú.
o Tìm kiếm ghi chú theo tiêu đề hoặc nội dung hoặc ngày tháng.

Yêu cầu 3: Giao diện người dùng và mỹ thuật:
o Giao diện dễ sử dụng, có tính khoa học, thân thiện với người dùng
o Phối màu sắc, font chữ phù hợp
o Có tính đến ứng dung rộng rãi

2. Báo cáo và chương trình:
– Báo cáo, thuyết minh: file word, file trình chiếu (PowerPoint)
– Mã nguồn: ghi vào đĩa CD.

3. Theo dõi quá trình thực hiện đồ án

Ngày
kiểm tra

Tiến độ công việc (yêu cầu ghi rõ
các nội dung đã hoàn thành)

Nhận xét của
GVHD

Chữ ký
của GVHD

…/…/201
7
…/…/201

7
…/…/201
7
…/…/201
7
4. Điểm hướng dẫn (điểm chữ và số)
…………………………………………………………………
5. Đồng ý cho bảo vệ hay không đồng ý: ……………………………………………

TRƯỞNG BỘ MÔN

GIÁO VIÊN HƯỚNG DẪN

Võ Thị Kim Hoa

SINH VIÊN THỰC HIỆN

Phan Thị Linh

Nhận xét của giáo viên hướng dẫn
………….

Nghệ An, Ngày Tháng

Năm 2017

Giáo Viên hướng dẫn
(Ký ghi rõ họ tên)

Nhận xét của giáo viên chấm
………..
Nghệ An, Ngày Tháng
Giáo Viên chấm
(Ký ghi rõ họ tên)

MỤC LỤC

Năm 2017

PHẦN MỞ ĐẦU
1.1. Lý do chọn đề tài
Khi mà thời đại công nghệ phát triển để bắt kịp thời đại ở Việt Nam hiện nay
Công nghệ Thông tin cũng đã được nghiên cứu và ứng dụng rộng rãi trong nhiều
lĩnh vực, đặc biệt là trong lĩnh vực phần mềm hay lập trình ứng dụng, tin học đã trở

thành một công cụ không thể thiếu.
Gần đây điện thoại thông minh đã trở thành một vật hầu như “cần phải có”
trong cuộc sống hằng ngày của mọi người. Viết phần mềm tiện ích nâng cao giá trị
sử dụng cho chúng cũng trở nên một trào lưu cho các công ty phát triển phần mềm,
các giới lập trình viên chuyên nghiệp cũng như không chuyên. Đặc biệt là những
ứng dụng cho máy chạy trên hệ điều hành Android.
Sau quá trình tìm hiểu hệ điều hành Android thì em nhận thấy trên Android
có thể phát triển một chương trình giúp người dùng lập kế hoạch và quản lí nó một
cách có hiệu quả và chất lượng. Xuất phát từ nhận định này em sẽ xây dựng ứng
dụng Note. Hy vọng đem tới một ứng dụng thuận tiện, hữu ích cho mục đích quản lí
kế hoạch, lịch trình, thời gian biểu cũng như sắp xếp công việc hàng ngày.

Trong quá trình hoàn thành đề tài em đã nhận được nhiều sự giúp đỡ, đặc
biệt là sự hướng dẫn của cô giáo Võ Thị Kim Hoa, em xin gửi lời cảm ơn chân
thành nhất đến cô. Ngoài ra em gửi lời cảm ơn đến các thầy cô giáo trong khoa đã
nhiệt tình giúp đỡ em trong thời gian qua.
1.2. Mục đích nghiên cứu.

Nghiên cứu kiến trúc Android.
Nghiên cứu các thành phần cơ bản trong Android.
Nghiên cứu cách phát triển ứng dụng trên Android.
Xây dựng ứng dụng Note trên nền tảng Android

1.3. Đối tượng nghiên cứu
Với đề tài này em tập trung vào các nội dung :

Cách cài đặt các chương trình để có thể chạy Android

Tìm hiểu về Activity trong Android.
Tìm hiểu về Service trong Android.
Cách tạo giao diện trong Android..
Cách lưu trữ dữ liệu trong Android.
Xây dựng ứng dụng Note trên Android.

1.4. Ý nghĩa lý luận và thực tiễn của đề tài
Ý nghĩa lí luận: Đề tài là tài liệu tham khảo rất hữu ích cho những ai muốn tìm hiểu
về Android. Bên cạnh đó chưa có nhiều tài liệu tham khảo về Android bằng tiếng
Việt, do đó em muốn nghiên cứu muốn đóng góp hiểu biết của mình để làm giàu
thêm tài liệu tham khảo cho chủ đề này.
Ý nghĩa thực tiễn: Hiện tại hệ điều hành Android đang được sử dụng rộng rãi trên
các thiết bị di động. Nhu cầu thư giãn, giải trí, quản lí công việc kế hoạch của người
dùng trên điện thoại rất cao. Chính vì vậy ứng dụng Note là một chương trình giúp
người dùng quản lí lịch trình, lên kế hoạch cho chính bản thân mình một cách có
hiệu quả, thuận tiện và chất lượng.

CHƯƠNG 1: CƠ SỞ LÝ THUYẾT
1.1. Giới thiệu hệ điều hành Android
1.1.1. Lịch sử Android
Ban đầu Android là hệ điều hành cho các thiết bị cầm tay dựa trên lõi Linux
do công ty Android Inc (California, Mỹ) thiết kế. Công ty này sau đó được Google
mua lại vào năm 2005 và bắt đầu xây dựng Android Platform. Các thành viên chủ
chốt tại ở Android Inc gồm có: Andy Rubin, Rich Miner, Nick Sears, and Chris
White.

Hình 1-1 Androidtimeline
Và sau tiếp vào cuối năm 2007 thuộc về Liên minh Thiết bị Cầm tay Mã
Nguồn mở (Open Handset Alliance) gồm các thành viên nổi bật trong ngành viễn

thông và thiết bị cầm tay như: Texas Instruments, Broadcom Corporation, Google,
HTC, Intel, LG, Marvell Technology Group, Motorola, Nvidia, Qualcomm,
Samsung Electronics, Sprint Nextel, T-Mobile, ARM Holdings, Atheros
Communications, Asustek Computer Inc, Garmin Ltd, Softbank, Sony Ericsson,
Toshiba Corp, and Vodafone Group,… Mục tiêu của Liên minh này là nhanh chóng
đổi mới để đáp ứng tốt hơn cho nhu cầu người tiêu dùng và kết quả đầu tiên của nó
chính là nền tảng Android. Android được thiết kế để phục vụ nhu cầu của các nhà
sản xuất thiết, các nhà khai thác và các lập trình viên thiết bị cầm tay. Phiên bản
SDK lần đầu tiên phát hành vào tháng 11 năm 2007, hãng T-Mobile cũng công bố
chiếc điện thoại Android đầu tiên đó là chiếc T-Mobile G1- chiếc smartphone đầu
tiên dựa trên nền tảng Android. Một vài ngày sau đó Google lại tiếp tục công bố sự
ra mắt phiên bản Android SDK release Candidate 1.0. Trong tháng 10 năm 2008,
Google được cấp giấy phép mã nguồn mở cho Android Platform. Khi Android được
phát hành thì một trong số các mục tiêu trong kiến trúc của nó là cho phép các ứng
dụng có thể tương tác được với nhau và có thể sử dụng lại các thành phần từ những
ứng dụng khác. Việc tái sử dụng không chỉ được áp dụng cho các dịch vụ mà nó còn
được áp dụng cho cả các thành phần dữ liệu và giao diện người dùng. Vào cuối năm
2008 Google cho phát hành một thiết bị cầm tay được gọi là Android Dev Phone 1
có thể chạy được các ứng dụng Android mà không bị ràng buộc vào các nhà cung
cấp mạng điện thoại di động. Mục tiêu của thiết bị này là cho phép các nhà phát
triển thực hiện các cuộc thí nghiệm trên một thiết bị thực có thể chạy hệ điều hành
Android mà không phải ký một bản hợp đồng nào. Vào khoảng cùng thời gian đó
thì Google cũng cho phát hành một phiên bản vá lỗi 1.1 của hệ điều hành này. Ở cả
hai phiên bản 1.0 và 1.1 Android chưa hỗ trợ soft-keyboard mà đòi hỏi các thiết bị
phải sử dụng bàn phím vật lý. Android cố định vấn đề này bằng cách phát hành
SDK 1.5 vào tháng tư năm 2009 cùng với một số tính năng khác. Chẳng hạn như
nâng cao khả năng ghi âm truyền thông, vật dụng và các live folder.
1.1.2. Kiến trúc của Android

Mô hình sau thể hiện một cách tổng quát các thành phần của hệ điều hành
Android. Mỗi một phần sẽ được đặc tả một cách chi tiết dưới đây.

Hình 1-2 Cấu trúc stack của hệ thống Android
1.1.2.1. Tầng ứng dụng
Android được tích hợp sẵn một số ứng dụng cần thiết cơ bản như: contacts,
browser, camera, Phone,… Tất cả các ứng dụng chạy trên hệ điều hành Android đều
được viết bằng Java.
1.1.2.2. Application framework
Bằng cách cung cấp một nền tảng phát triển mở, Android cung cấp cho các nhà
phát triển khả năng xây dựng các ứng dụng cực kỳ phong phú và sáng tạo. Nhà phát
triển được tự do tận dụng các thiết bị phần cứng, thông tin địa điểm truy cập, các
dịch vụ chạy nền, thiết lập hệ thống báo động, thêm các thông báo để các thanh
trạng thái, và nhiều, nhiều hơn nữa. Nhà phát triển có thể truy cập vào các API
cùng một khuôn khổ được sử dụng bởi các ứng dụng lõi. Các kiến trúc ứng dụng
được thiết kế để đơn giản hóa việc sử dụng lại các thành phần; bất kỳ ứng dụng có
thể xuất bản khả năng của mình và ứng dụng nào khác sau đó có thể sử dụng những
khả năng (có thể hạn chế bảo mật được thực thi bởi khuôn khổ). Cơ chế này cho
phép các thành phần tương tự sẽ được thay thế bởi người sử dụng. Cơ bản tất cả các
ứng dụng là một bộ các dịch vụ và các hệ thống, bao gồm:

Một tập hợp rất nhiều các View có khả năng kế thừa lẫn nhau dùng để thiết
kế phần giao diện ứng dụng như: gridview, tableview, linearlayout,…

Một “Content Provider” cho phép các ứng dụng có thể truy xuất dữ liệu từ
các ứng dụng khác (chẳng hạn như Contacts) hoặc là chia sẻ dữ liệu giữa các
ứng dụng đó.
Một “Resource Manager” cung cấp truy xuất tới các tài nguyên không phải
là mã nguồn, chẳng hạn như: localized strings, graphics, and layout files.
Một “Notifycation Manager” cho phép tất cả các ứng dụng hiển thị các
custom alerts trong status bar. Activity Maanager được dùng để quản lý chu
trình sống của ứng dụng và điều hướng các activity.
1.1.2.3. Library

Android bao gồm một tập hợp các thư viên C/C++ được sử dụng bởi nhiều
thành phần khác nhau trong hệ thống Android. Điều này được thể hiện thông qua
nền tảng ứng dụng Android. Một số các thư viện cơ bản được liệt kê dưới đây:

System C library: a BSD-derived implementation of the standard C system
library (libc), tuned for embedded Linux-based devices.
Media Libraries – based on PacketVideo’s OpenCORE; the libraries support
playback and recording of many popular audio and video formats, as well as
static image files, including MPEG4, H.264, MP3, AAC, AMR, JPG, and
PNG
Surface Manager – Quản lý việc truy xuất vào hệ thống hiển thị.
LibWebCore – a modern web browser engine which powers both the Android
browser and an embeddable web view.

SGL – the underlying 2D graphics engine.
3D libraries – an implementation based on OpenGL ES 1.0 APIs; the libraries
use either hardware 3D acceleration (where available) or the included, highly
optimized 3D software rasterizer.
FreeType – bitmap and vector font rendering. SQLite – a powerful and
lightweight relational database engine available to all applications.
1.1.2.4. Android Runtime

Android bao gồm một tập hợp các thư viện cơ bản mà cung cấp hầu hết các
chức năng có sẵn trong các thư viện lõi của ngôn ngữ lập trình Java. Tất cả các ứng
dụng Android đều chạy trong tiến trình riêng. Máy ảo Dalvik đã được viết để cho
một thiết bị có thể chạy nhiều máy ảo hiệu quả. Các VM Dalvik thực thi các tập tin
thực thi Dalvik (dex). Định dạng được tối ưu hóa cho bộ nhớ tối thiểu. VM là dựa
trên register-based và chạy các lớp đã được biên dịch bởi một trình biên dịch Java
để chuyển đổi thành các định dạng dex. Các VM Dalvik dựa vào nhân Linux cho
các chức năng cơ bản như luồng và quản lý bộ nhớ thấp.

1.1.2.5. Linux kernel
Android dựa trên Linux phiên bản 2.6 cho hệ thống dịch vụ cốt lõi như
security, memory management, process management, network stack, and driver
model. Kernel Linux hoạt động như một lớp trừu tượng hóa giữa phần cứng và phần
còn lại của phần mềm stack.
1.1.3. Các thành phần cơ bản của một ứng dụng Android
1.1.3.1. Activity
Tạo một Activity: Để tạo một Activity mới cần thừa kế từ lớp Activity, sử dụng các
View để cung cấp các tương tác với người dùng, khai báo các thành phần giao diện
và thực thi các chức năng của ứng dụng.
package com.paad.myapplication;
import android.app.Activity;

import android.os.Bundle;
public class MyActivity extends AppCompatActivity
{
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
}
}
Một lớp Activity cơ bản đưa ra một màn hình rỗng chứa cửa sổ hiển thị.Vì vậy việc
cần thực hiện đầu tiên là khai báo bố cục cho nó bằng cách sử dụng các View và
Layout. Activity UI được tạo thành bởi các View. View là các điều khiển giao diện
người dùng, hiển thị dữ liệu và cung cấp tương tác đến người dùng.
Để gắn một giao diện cho một Activity sử dụng phương thức setContentView trong
lớp Activity được kế thừa.
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
MyView myView = new MyView(this);
setContentView(myView);

}
Có 2 cách để thiết lập giao diện cho Activity: Bằng code hoặc thông qua file định
nghĩa layout. Ở trên là cách tạo giao diện bằng code, sau đây là cách tạo giao diện
người thông qua layout truyền tham số vào cho phương thức setContentView là một
resource ID.
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);

setContentView(R.layout.main);
}
Để dùng một Activity cần khai báo bên trong file manifest. Thêm vào một thẻ
activity mới bên trong nút application. Thẻ activity này bao gồm các thuộc tính
cho siêu dữ liệu (label, icon,…). Một Activity mà không được khai báo một thẻ
activity tương ứng sẽ không được khởi chạy.
Ví dụ sau mô tả cách làm thế nào để khai báo Activity đã được tạo ở phần trên:
android:name=”.MyActivity”>

Vòng đời của Activity

Hình 1.3. Vòng đời của Activity
Khởi động một Activity
Để khởi động một Activity chúng ta dùng Intent:

Khai báo tường minh: cung cấp chính xác thông tin của activity cần gọi (nếu
cùng ứng dụng chỉ cần cung cấp tên class, nếu ứng dụng khác nhau thì cung
cấp tên package, tên class).
Khai báo không tường minh: cung cấp thao tác cần làm gì, với loại dữ liệu
nào, thao tác thuộc nhóm nào… hệ thống sẽ tìm activity tương ứng để khởi
động. Ví dụ: đoạn code bên dưới sẽ khởi động một activity nào đó đăng có

Xem thêm: ‎FluentWorlds: Học Tiếng Anh

khả năng xem ảnh.

Với cách khởi động activity không tường minh, chúng ta cần phải biết một chút về
Intent-filter.Intent-filter sẽ giúp một activity đăng ký với hệ thống mình có thể làm
được thao tác gì, trong nhóm nào, với loại dữ liệu nào. Như vậy khi intent và intentfilter khớp nhau, activity sẽ được hệ thống khởi động.

1.1.3.2. BroadcastReceiver
BroadcastReceiver là một trong bốn loại thành phần trong ứng dụng Android.Chức
năng của nó là dùng để nhận các sự kiện mà các ứng dụng hoặc hệ thống phát đi.
Có 2 cách phát-nhận đó là:

Không có thứ tự: receiver nào đủ điều kiện thì nhận hết, không phân biệt và
chúng tách rời nhau.
Có thứ tự: receiver nào đăng ký ưu tiên hơn thì nhận trước, và có thể truyền
thêm thông tin xử lý cho các receiver.

BroadcastReceiver chỉ có duy nhất một phương thức onReceive().

Khi có sự kiện mà BroadcastReceiver đã đăng ký nhận được phát đi, thì
phương thức onReceive() của BroadcastReceiver đó sẽ được gọi.
Sau khi thực thi xong phương thức này, vòng đời của BroadcastReceiver kết
thúc.
Lưu ý khi sử dụng: Ngay khi onReceive() kết thúc, hệ thống coi như receiver
đã không còn hoạt động và có thể giải phóng tiến trình chứa receiver này bất
cứ lúc nào.Tránh xử lý các code quá lâu trong onReceive(). Không có xử lý

bất đồng bộ, chờ callback… trong Receiver (cụ thể như
hiển thị Dialog,
kết nối service…)
Một số broadcast thông dụng:
 Báo hệ thống khởi động xong.
 Báo pin có sự thay đổi.
 Báo có package mới cài vào hoặc xóa đi.
 Báo tắt máy.
 Báo cắm sạc, rút sạc.
 Thông báo tin nhắn tới.
 Thông báo cắm, rút thẻ nhớ.
 Thông báo có cuộc gọi đi.

Broadcast do người phát triển ứng dụng tự định nghĩa (giúp liên lạc hoặc thông báo
một sự kiện giữa các ứng dụng).
Hàm onReceive() : Phương thức này được gọi khi có sự kiện tương ứng được phát
đi. Ở trong phương thức này, ta truyền vào context (ngữ cảnh) và intent (nơi nhận).
Context: Vì lớp Receiver không kế thừa từ lớp Context nên cần truyền context mà
receiver này đang chạy vào. Thứ nhất là để có thể xử lý các phương thức yêu cầu
truyền thêm Context, thứ hai là để sử dụng các phương thức của lớp Context.
Intent: Intent được truyền vào sẽ có đầy đủ thông tin như sự kiện nào mà receiver
này đăng ký đã xảy ra dẫn đến onReceive() được gọi, có gửi kèm thông tin gì hoặc
dữ liệu gì hay không. Xem các api:

Intent.getAction();
Intent.get…Extra(String dataName);
1.1.3.3. Service
Service là một trong 4 loại thành phần của một ứng dụng Android. Service chạy nền
và không tương tác trực tiếp với người dùng. Sử dụng Service để:

Dùng trong các ứng dụng nghe nhạc.
Dùng để xử lý các thao tác mất thời gian và không nhất thiết phải hiển thị lên
activity (download, upload…).
Đôi khi cần một ứng dụng vận hành liên tục để xử lý những việc mong muốn
mà không làm phiền người dùng.
Làm những thao tác tính toán, xử lý đều đặn nào đó và kết quả khi nào người
dùng cần thì mới xem.

Tạo ra một Service : Để tạo ra một Service, ta tạo ra một class mới kế thừa lớp
Service và override các phương thức onStart(),onCreate() và onBind().
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
public class MyService extends Service {
@Override
public void onStart(Intent intent, int startId) {
// TODO: Actions to perform when service is started.
}
@Override
public void onCreate() {
// TODO: Actions to perform when service is created.
}
@Override
public IBinder onBind(Intent intent) {
// TODO: Replace with service binding implementation.
return null;
}
}

Để bắt đầu một Service, sử dụng phương thức startService. Nếu Service yêu cầu
quyền truy cập không tồn tại trong ứng dụng thì một ngoại lệ SecurityException sẽ
được đưa ra. Có 2 cách để bắt đầu một Service mới.

Cách 1: khởi động ngầm. Ví dụ:
startService(new Intent(MyService.MY_ACTION));
Cách 2: khởi động tường minh. Ví dụ:
startService(new Intent(this, MyService.class));

Để dừng một Serivce sử dụng phương thức stopService truyền vào Intent xác định
Service cần ngưng hoạt động.
Vòng đời của Services

Hình 1.4 Vòng đời của service
Khi có một context nào đó gọi startService() để khởi động một dịch vụ mong muốn.
Nếu dịch vụ đó chưa được tạo thì sẽ gọi onCreate() rồi gọi tiếp onStart() và khi đó
dịch vụ chạy nền bên dưới.
Nếu sau đó lại có một context muốn khởi độngdịch vụ này mà dịch vụ đã đang chạy
thì chỉ có phương thức onStart() của dịch vụ được gọi.
Dù dịch vụ có được gọi khởi động bao nhiêu lần thì cũng chỉ có thể hiện của dịch
vụ và chỉ cần gọi stopService() một lần để kết thúc dịch vụ.
Khi một Activity được kết nối tới một Service nó duy trì một tham chiếu đến một
thực thể Service. Để kết nối đến thực thể này, thực thi phương thức onBind như sau:
private final IBinder binder = new MyBinder();
@Override
public IBinder onBind(Intent intent) {

return binder;}
public class MyBinder extends Binder {
MyService getService() {
return MyService.this;
}}
Sự kết nối giữa Service và Acitvity được thể hiện qua một ServiceConnection. Điều
cần làm là thực thi một ServiceConnection mới, override phương thức
onServiceConnected và onServiceDisconnected.
// tham chiếu đến dịch vụ
private MyService serviceBinder;
// xử lý kết nồi giữa service và activity
private ServiceConnection mConnection = new ServiceConnection() {
public void onServiceConnected(ComponentName className, IBinder
service) {
// được gọi khi liên kết được thực hiện
serviceBinder = ((MyService.MyBinder)service).getService();
}
public void onServiceDisconnected(ComponentName className) {
// nhận khi dịch vụ ngắt kết nối một cách bất ngờ
serviceBinder = null; }
Để thực hiện việc kết nối gọi phương thức bindService:
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
// kết nối dịch vụ
Intent bindIntent = new Intent(MyActivity.this, MyService.class);
bindService(bindIntent,mConnection, Context.BIND_AUTO_CREATE); }
Hoạt động của bindService(): kết nối dịch vụ

Hình 1.4. Hoạt động kết nối dịch vụ
Thông thường, vòng đời của dịch vụ khi có client kết nối từ đầu như sau:

Cũng bắt đầu bằng onCreate() rồi đến onBind() và dịch vụ chạy dưới nền.
Khi không còn client kết nối tới thì dịch vụ gọi onUnbind() rồi onDestroy().

Có một số trường hợp không thông thường, ví dụ như:

Có một context khởi động một dịch vụ, sau đó có một số client kết nối (bind)
tới service.
Có nhiều client cùng lúc kết nối tới dịch vụ.
Một activity vừa gọi startService() vừa gọi bindService().

1.3.1.4. Content Providers
Có thể coi trình cung cấp nội dung như là một máy chủ cơ sở dữ liệu. Công việc của
nó là quản lý truy cập và chia sẻ dữ liệu đang tồn tại, chẳng hạn như một cơ sở dữ
liệu SQLite. Nó có thể được cấu hình để cho phép các ứng dụng khác truy xuất và
ngược lại. Nếu ứng dụng rất đơn giản thì không nhất thiết phải tạo ra một trình cung
cấp nội dung.
Content Provider giúp tách biệt tầng ứng dụng ra khỏi tầng dữ liệu. Nó có đầy đủ
các quyền điều khiển và được truy xuất thông qua mô hình URI đơn giản như là có
thể thêm, xóa, cập nhật dữ liệu của các ứng dụng.

Tạo một Content Provider mới
Tạo Content Provider

Để tạo một Content Provider cần thừa kế lại từ lớp trừu tượng ContentProvide, ghi
đè lại phương thức onCreate.
import android.content.*;
import android.database.Cursor;
import android.net.Uri;
import android.database.SQLException;
public class MyProvider extends ContentProvider {
@Override
public boolean onCreate() {
// TODO: Construct the underlying database.
return true;
}
}
Nên cung cấp một biến static CONTENT_URI trả về một URI của provider này.
Content URI phải là duy nhất giữa các provider, vì thế nên dựa vào tên package để
xác định URI, hình thức chung cho việc định nghĩa một Content Provider URI là:
content://com..provider./
Ví dụ:
content://com.paad.provider.myapp/items
Content URI có thể ở 2 dạng thể hiện. Ví dụ trên là URI ở dạng request tất cả các
giá trị. Việc thêm vào cuối /, sẽ request một record đơn.
content://com.paad.provider.myapp/items/5
Các đơn giản nhất để làm việc này là sử dụng URIMatcher. Cấu hình UriMatcher
để phân tích hình thức của nó khi provider đang được truy xuất đến thông qua một
Content Resolver.
Có thể cung cấp các truy vấn và thực thi với Content Provdier bằng cách thực hiện
các phương thức delete, insert, update và query. Các phương thức này hoạt động
như các giao tiếp chung đến nguồn dữ liệu bên dưới, chúng cho phép các ứng
Android chia sẽ dữ liệu với nhau mà không phải tạo một giao tiếp riêng cho mỗi

ứng dụng.
Bước cuối cùng trong quá trình tạo một Content Provider là định nghĩa kiểu MIME
kiểu dữ liệu mà Provider trả về, override phương thức getType để trả về một kiểu

String mô tả cho kiểu dữ liệu. Kiểu trả về bao gồm cả 2 hình thức: trường đơn và tất
cả dữ liệu.
Thêm Content Provider vừa tạo vào trong manifest.xml. Sử dụng thẻ authorities để
chỉ định địa chỉ của nó:
android:authorities=”com.paad.provider.myapp”/>
Truy vấn, thêm, cập nhật và xóa nội dung trong Content Provide : Content Provider
được truy xuất thông qua lớp Content Resolver. Mỗi một Context của ứng dụng có
một đối tượng ContentResolver, có thể được truy xuất thông qua phương thức
getContentResolver.
ContentResolver cr = getContentResolver();
Content Resolver bao gồm một vài phương thức để thực thi và truy vấn đến Content
Providers. Một URI dùng để chỉ định Content Provider nào được cung cấp bởi các
quyền được định nghĩa trong manifest của ứng dụng. URI là một chuỗi tùy ý, vì thế
hầu hết các provider đều đưa ra thuộc tính CONTENT_URI. Content Provider
thường đưa ra 2 hình thức URI, một là đưa tất cả các dữ liệu được yêu cầu trên cùng
một dòng đơn lẻ, hoặc là thêm vào / vào phía sau CONTENT_URI.
Truy vấn : Việc truy vấn trên Content Provider có hình thức tương tự như khi truy
vấn trong database, dùng phương thức query của đối tượng ContentResolver với các
tham số truyền vào gồm:

Một URI của Content Provider muốn truy vấn.

Một ánh xạ đại diện cho các cột muốn chứa trong tập kết quả.
Một mệnh đề where chỉ định các dòng nào được trả về. Có thể đưa vào ký tự
đại diện và sẽ được thay thế bởi các giá trị được lưu bên trong các tham số
được chọn.
Một mảng các đối số kiểu String thay thế cho các ký tự đại diện trong mệnh
đề where
Một chuỗi mô tả thứ tự các dòng trả về.

Ví dụ:
// trả về tất cả các dòng
CursorallRows= getContentResolver().query(MyProvider.CONTENT_URI,
null, null, null, null);
// trả về tất cả các cột của các hàng có cột 3 bằng với giá trị thiết đặt và sắp xếp
// theo giá trị của cột 5

String where = KEY_COL3 + “=” + requiredValue;
String order = KEY_COL5;
CursorsomeRows = getContentResolver().query(MyProvider.CONTENT_URI,
null, where, null, order);
Cập nhật : Việc cập nhật cho một Content Provider được điều khiển bởi phương
thức update cùa Content Resolver. Phương thức update nhận URI của Content
Provider đích, một đối tượng ContentValues chứa tập giá trị được ánh xạ đến các
cột cần cập nhật và một mệnh đề where để chỉ định dòng nào được cập nhật.
Khi thực thi mỗi dòng phù hợp với điều kiện trong mệnh đề where sẽ được cập nhật
và trả về số dòng được cập nhật giá trị thành công.
Ví dụ:
// tạo một dòng mới cho các giá trị muốn chèn.
ContentValues newValues = new ContentValues();
// tạo ánh xạ thay thế các cột muốn cập nhật và những giá trị gì để gán cho mỗi cột

newValues.put(COLUMN_NAME, newValue);
// áp dụng cho 5 hàng đầu tiên
String where = “_id < 5”;
getContentResolver().update(MyProvider.CONTENT_URI,
null);

newValues,

where,

1.2. Hệ quản trị cơ sở dữ liệu : SQLite
1.2.1. Giới thiệu SQLite Database
SQLite được Richard Hipp viết dưới dạng thư viện. Trong Android thì hệ cơ sở dữ
liệu được sử dụng là SQLite Database nó được nhúng vào như là một thành phần
bên trong Android.
Trong Android cơ sở dữ liệu mà bạn tạo cho 1 ứng dụng thì chỉ ứng dụng đó có
quyền truy cập và sử dụng, các ứng dụng khác thì không. Khi đã được tạo cơ sở dữ
liệu SQLite được chứa trong thư mục:
/data/data//databases
1.2.2. Các đặc điểm của SQLite

SQLite cơ bản là 1 hệ quản trị cơ sở dữ liệu thu nhỏ, nó không có server,
thao tác trên file và có thể sử dụng bởi bất cứ hệ điều hành nào.

SQLite cần rất ít bộ nhớ lúc chạy (khoảng 250kb) do được tích hợp như một
thư viện, là một phần của chương trình khi được tạo ra nên chạy nhanh hơn
các hệ CSDL mà tạo ra tiến trình chạy song song.
SQLite cung cấp dữ liệu dưới 3 dạng: Text, Integer, Real. Tất cả kiểu khác
phải được chuyển về một trong 3 dạng trên trước khi được lưu trữ. SQLite sẽ
không kiểm tra ràng buộc dữ liệu được lưu.

Khi tạo cơ sở dữ liệu thì dữ liệu sẽ được lưu trong :
DATA/data/APP_NAME/databases/FILENAME
Trong đó thì:

Data: lấy hàm Environment.getDataDirectory() để lấy kết quả (thường là trên
thẻ nhớ)
APP_NAME: tên ứng dụng
FILENAME: tên lúc tạo
Cơ sở dữ liệu do SQLite tạo ra sẽ private.

1.2.3. Các ưu điểm của SQLite
– Tính toàn vẹn: đảm bảo dữ liệu được chuyển đổi đầy đủ, không gây ra mất
mát dữ liệu khi có lỗi phần cứng.
– Cấu trúc gọn nhẹ, không cần cài đặt cấu hình
– Các thao tác đơn giản sẽ nhanh hơn hệ thống server
– Mã nguồn mở.
– Trong Android, chúng ta không cần cài đặt nhiều, chỉ cần cung cấp các hàm
để thao tác và chương trình sẽ quản lí phần còn lại.
1.2.4. Giới thiệu SQLiteOpenHelper
SQLiteOpenHelper là 1 lớp ảo, giống như tên của nó SQLite Open Helper nó được
các nhà phát triển tạo ra để giúp tạo các cơ sở dữ liệu dùng SQLite(vì SQLite không
hỗ trợ các phương thức khởi tạo cơ sở dữ liệu).

Vậy làm sao để sử đụng được SQLiteOpenHelper? Vì SQLiteOpenHelper là 1 lớp
ảo nên ta cần khai báo 1 lớp khác kế thừa nó.
Chú ý: nó có 2 phương thức ảo cũng cần được viết lại là:

onCreate(SQLiteDatabase db) : được gọi khi csdl được tạo, ta dùng khi mà
tạo bảng,tạo view hoặc là trigger.
onUpgrade(SQLiteDatabse db, int oldVersion, int newVersion): được dùng
khi ta sửa cơ sở dữ liệu như thay đổi bảng, xóa, tạo bảng mới.

1.2.5. Các thao tác với SQLite trong Android
Chú ý khi sử dụng SQLite Database trong Android:

Mặc định thì SQLite trên Android không có cung cấp cho ta công cụ tạo và
quản lí cơ sở dữ liệu nên ta phải tự tạo.
Các file (image, audio,..) không được lưu trong cơ sở dữ liệu mà ta phải dùng
đường dẫn như URI).
Các bảng nên có một trường integer làm ID và tự động tăng nhằm dễ dàng
xác định các phần tử. Khi mà ta muốn chia sẻ cho các ứng dụng khác thì
phần này là bắt buộc.

Thiết kế cấu trúc của lớp kế thừa của lớp SQLiteOpenHeper :

Đầu tiên, ta phải tạo một lớp để thao tác với cở sở dữ liệu như tạo lập, chèn,
thêm, xóa dữ liệu,..Vậy ta tạo 1 lớp kế thừa từ lớp SQLiteOpenHelper.
Sau đó ta gọi hàm getReadableDatabase hoặc getWritableDatabase để mở

nhằm tạo ra một thực thể có thể chỉ đọc hay là có khả năng ghi. Gọi phương
thức getWritableDatabase có thể thất bại (dung lượng bộ nhớ, permission,..)

Cấu trúc như sau:
public class DatabaseHelper extends SQLiteOpenHelper {
//các khai báo biến để lưu các giá trị tên cơ sở dữ //liệu, tên bảng, tên cột.
static final String databaseName=”dulieu.sqlite”;
static final String table1=”Table1″;
static final String colID=”ID”;
static final String colNumber1 = “Col1”;
static final String view1=”View1″;
//The Constructor
public DatabaseHelper(Context context) {
super(context, dbName, null,33);
//overwrite lại 2 hàm onCreate và hàm onUpgrate
}
Hàm khởi tạo có các thông số sau:

Context con: context của database
DataBaseName: Tên của cơ sở dữ liệu
CursorFactory: Đôi lúc thì chúng ta có thể extend lớp cursor để kế thừa một
số phương thức và truy vấn,..trong trường hợp đó, ta dùng một instance của
CursorFactory để tham chiếu đến lớp chúng ta tạo thay cho mặc định. Khi
dùng mặc định thì ta để nó null.

Version: Version của cơ sở dữ liệu

Hai hàm cần được override: onCreate và onUpgrade

onCreate(SQLiteDatabase): phương thức này sẽ tạo bảng với các cột, view
và trigger. Phương thức được gọi một khi cơ sở dữ liệu được tạo ra. Do đó,
chúng ta sẽ tạo các bảng với các cột trong phương thức này. Khi csdl chưa có
trên bộ nhớ thì mới được gọi, và nó chỉ được gọi lần đầu tiên mà ứng dụng
chạy trên thiết bị
SQLiteDatabase db: kiểu trả về là một cơ sở dữ liệu của Sqlite, ở đây là đối
tượng chúng ta sẽ thao tác.
db.execSQL (): hàm dùng để thực thi câu lệnh SQL. Về chi tiết các câu lệnh
sẽ nói cụ thể ở phần sau (khá giống SQL)

1.2.6. Các thao tác cơ bản trên cơ sở dữ liệu
Thực thi câu lệnh SQL : Ta dùng hàm execSQL (sqlString) để thực thi câu lệnh.
Ngoài ra ta có thể thực thi cả những câu lệnh không truy vấn về kết quả như insert,
delete, update, … khi dung execSQL. Ngay cả việc tạo, sửa database.
Thực thi Query có 2 cách: rawQuery và query.
Cursor getAllRows()
{
SQLiteDatabase db=this.getReadableDatabase();
Cursor cur=db.rawQquery(“SELECT “+colID+” as _id,
“+colName+” from “+TableName,whereString);
return cur;
}
Các tham số của rawQuery:

Xem thêm: Cách chuyển danh bạ từ iPhone sang iPhone thành công 100%

String query: câu lệnh select.
whereString: câu lệnh điều khiển.

Chú ý:

Kết quả trả về là kiểu Cursor
Nếu cột ID có tên khác _id thì ta phải dùng alias là _id, nếu k sẽ gây ra một
exception

Cách khác là dùng query
public Cursor getEmpByDept(String Dept)
{
SQLiteDatabase db=this.getReadableDatabase();

String [] columns=new String[]{“_id”,colName,col2,…};
Cursor c=db.query(tableName, columns, whereString, null, groupby, order);
return c;
}
db.query có các tham số:

String Table Name: tên của bảng hay là View cần truy vấn
String [ ] columns: tập hợp các cột cần lấy
String WHERE: điều kiện lọc
String Group by: nhóm theo …
String Having: Having clause
String Order By: sắp xếp.

Quản lý Cursors :

Kết quả trả về là kiểu Cursor với sẵn các phương thức để quản lý như:
 boolean moveToNext(): chuyển đến hàng tiếp theo, false nếu đang ở
hàng cuối cùng
 boolean moveToFirst(): trở về hàng đầu, false nếu cursors rỗng.
 boolean moveToPosition(int position): Chuyển đến vị trí xác định,
false nếu vị trí không thể tới.
 boolean moveToPrevious(): chuyển đến hàng trước đó, false nếu đang
ở đầu.
 boolean moveToLast(): chuyển đến vị trí cuối cùng, false nếu danh

sách rỗng.
 Ngoài ra thì còn một số hàm kiểm tra khác như :boolean isAfterLast(),

isBeforeFirst(),isNull(columnIndex) …
Lấy dữ liệu từ Cursor: Để lấy dữ liệu từ Cursor, trước hết cần chuyển đến vị trí xác
định bằng hàm moveTo. Sau đó dùng hàm get(columnIndex)
(như getString ) để trả về giá trị cần lấy.
Chèn thêm records : Ta sử dụng những câu lệnh dưới đây để chèn record vào bảng
(ngoài cách dùng execSQL)
SQLiteDatabase db=this.getWritableDatabase();
ContentValues cv=new ContentValues();
cv.put(col_1, 1);
cv.put(col_2, “Some values”);
db.insert(table, null, cv);
db.close();

Email09051407860964456330phanlinh25660@gmail.comPHI ẾU GIAO ĐỒ ÁN MÔN HỌCMÔN HỌC : ỨNG DỤNG DI ĐỘNG ANDROIDSinh viên / nhóm sinh viên : Lớp : DHCTTCKZ09 ( Đại học CNTT Khóa 9 ) Ngày giao đề tài : 25/09/2017 Ngày triển khai xong : / / 20171.1 Tên đề tài : Xây dựng ứng dụng Note bằng AndroidYêu cầu : Xây dựng ứng dụng di động trên Android. 1.2. Nhiệm vụ đồ án :. Yêu cầu 1 : Ngôn ngữ sử dụng : JAVA, máy ảo genimotion, ứng dụng Android Studio, csdl hoàn toàn có thể là firefox hoặc sqlite. Yêu cầu 2 : Phân tích nhu yếu và kiến thiết xây dựng ứng dựng gồm có : o Ứng dụng cho phép nhập, xem, sửa xóa ghi chú. o Tìm kiếm ghi chú theo tiêu đề hoặc nội dung hoặc ngày tháng. Yêu cầu 3 : Giao diện người dùng và mỹ thuật : o Giao diện dễ sử dụng, có tính khoa học, thân thiện với người dùngo Phối màu sắc, font chữ phù hợpo Có tính đến ứng dung rộng rãi2. Báo cáo và chương trình : – Báo cáo, thuyết minh : file word, file trình chiếu ( PowerPoint ) – Mã nguồn : ghi vào đĩa CD. 3. Theo dõi quy trình triển khai đồ ánNgàykiểm traTiến độ việc làm ( nhu yếu ghi rõcác nội dung đã triển khai xong ) Nhận xét củaGVHDChữ kýcủa GVHD. .. / … / 201 … / … / 201 … / … / 201 … / … / năm trước. Điểm hướng dẫn ( điểm chữ và số ) … … … … … … … … … … … … … … … … … … … … … … … … … 5. Đồng ý cho bảo vệ hay không đồng ý chấp thuận : ……………… TRƯỞNG BỘ MÔNGIÁO VIÊN HƯỚNG DẪNVõ Thị Kim HoaSINH VIÊN THỰC HIỆNPhan Thị LinhNhận xét của giáo viên hướng dẫn ………. Nghệ An, Ngày ThángNăm 2017G iáo Viên hướng dẫn ( Ký ghi rõ họ tên ) Nhận xét của giáo viên chấm ……………………. Nghệ An, Ngày ThángGiáo Viên chấm ( Ký ghi rõ họ tên ) MỤC LỤCNăm 2017PH ẦN MỞ ĐẦU1. 1. Lý do chọn đề tàiKhi mà thời đại công nghệ tiên tiến tăng trưởng để bắt kịp thời đại ở Nước Ta hiện nayCông nghệ tin tức cũng đã được điều tra và nghiên cứu và ứng dụng thoáng rộng trong nhiềulĩnh vực, đặc biệt quan trọng là trong nghành nghề dịch vụ ứng dụng hay lập trình ứng dụng, tin học đã trởthành một công cụ không hề thiếu. Gần đây điện thoại thông minh mưu trí đã trở thành một vật phần nhiều “ cần phải có ” trong đời sống hằng ngày của mọi người. Viết ứng dụng tiện ích nâng cao giá trịsử dụng cho chúng cũng trở nên một trào lưu cho những công ty tăng trưởng ứng dụng, những giới lập trình viên chuyên nghiệp cũng như không chuyên. Đặc biệt là nhữngứng dụng cho máy chạy trên hệ quản lý và điều hành Android. Sau quy trình khám phá hệ quản lý và điều hành Android thì em nhận thấy trên Androidcó thể tăng trưởng một chương trình giúp người dùng lập kế hoạch và quản lí nó mộtcách có hiệu suất cao và chất lượng. Xuất phát từ nhận định và đánh giá này em sẽ thiết kế xây dựng ứngdụng Note. Hy vọng đem tới một ứng dụng thuận tiện, có ích cho mục tiêu quản líkế hoạch, lịch trình, thời hạn biểu cũng như sắp xếp việc làm hàng ngày. Trong quy trình hoàn thành xong đề tài em đã nhận được nhiều sự trợ giúp, đặcbiệt là sự hướng dẫn của cô giáo Võ Thị Kim Hoa, em xin gửi lời cảm ơn chânthành nhất đến cô. Ngoài ra em gửi lời cảm ơn đến những thầy cô giáo trong khoa đãnhiệt tình trợ giúp em trong thời hạn qua. 1.2. Mục đích điều tra và nghiên cứu. Nghiên cứu kiến trúc Android. Nghiên cứu những thành phần cơ bản trong Android. Nghiên cứu cách tăng trưởng ứng dụng trên Android. Xây dựng ứng dụng Note trên nền tảng Android1. 3. Đối tượng nghiên cứuVới đề tài này em tập trung chuyên sâu vào những nội dung : Cách thiết lập những chương trình để hoàn toàn có thể chạy AndroidTìm hiểu về Activity trong Android. Tìm hiểu về Service trong Android. Cách tạo giao diện trong Android .. Cách tàng trữ tài liệu trong Android. Xây dựng ứng dụng Note trên Android. 1.4. Ý nghĩa lý luận và thực tiễn của đề tàiÝ nghĩa lí luận : Đề tài là tài liệu tìm hiểu thêm rất có ích cho những ai muốn tìm hiểuvề Android. Bên cạnh đó chưa có nhiều tài liệu tìm hiểu thêm về Android bằng tiếngViệt, do đó em muốn điều tra và nghiên cứu muốn góp phần hiểu biết của mình để làm giàuthêm tài liệu tìm hiểu thêm cho chủ đề này. Ý nghĩa thực tiễn : Hiện tại hệ quản lý và điều hành Android đang được sử dụng thoáng đãng trêncác thiết bị di động. Nhu cầu thư giãn giải trí, vui chơi, quản lí việc làm kế hoạch của ngườidùng trên điện thoại cảm ứng rất cao. Chính thế cho nên ứng dụng Note là một chương trình giúpngười dùng quản lí lịch trình, lên kế hoạch cho chính bản thân mình một cách cóhiệu quả, thuận tiện và chất lượng. CHƯƠNG 1 : CƠ SỞ LÝ THUYẾT1. 1. Giới thiệu hệ quản lý và điều hành Android1. 1.1. Lịch sử AndroidBan đầu Android là hệ quản lý và điều hành cho những thiết bị cầm tay dựa trên lõi Linuxdo công ty Android Inc ( California, Mỹ ) phong cách thiết kế. Công ty này sau đó được Googlemua lại vào năm 2005 và mở màn kiến thiết xây dựng Android Platform. Các thành viên chủchốt tại ở Android Inc gồm có : Andy Rubin, Rich Miner, Nick Sears, and ChrisWhite. Hình 1-1 AndroidtimelineVà sau tiếp vào cuối năm 2007 thuộc về Liên minh Thiết bị Cầm tay MãNguồn mở ( Open Handset Alliance ) gồm những thành viên điển hình nổi bật trong ngành viễnthông và thiết bị cầm tay như : Texas Instruments, Broadcom Corporation, Google, HTC, Intel, LG, Marvell Technology Group, Motorola, Nvidia, Qualcomm, Samsung Electronics, Sprint Nextel, T-Mobile, ARM Holdings, AtherosCommunications, Asustek Computer Inc, Garmin Ltd, Softbank, Sony Ericsson, Toshiba Corp, and Vodafone Group, … Mục tiêu của Liên minh này là nhanh chóngđổi mới để cung ứng tốt hơn cho nhu yếu người tiêu dùng và tác dụng tiên phong của nóchính là nền tảng Android. Android được phong cách thiết kế để ship hàng nhu yếu của những nhàsản xuất thiết, những nhà khai thác và những lập trình viên thiết bị cầm tay. Phiên bảnSDK lần tiên phong phát hành vào tháng 11 năm 2007, hãng T-Mobile cũng công bốchiếc điện thoại cảm ứng Android tiên phong đó là chiếc T-Mobile G1 – chiếc smartphone đầutiên dựa trên nền tảng Android. Một vài ngày sau đó Google lại liên tục công bố sựra mắt phiên bản Android SDK release Candidate 1.0. Trong tháng 10 năm 2008, Google được cấp giấy phép mã nguồn mở cho Android Platform. Khi Android đượcphát hành thì một trong số những tiềm năng trong kiến trúc của nó là được cho phép những ứngdụng hoàn toàn có thể tương tác được với nhau và hoàn toàn có thể sử dụng lại những thành phần từ nhữngứng dụng khác. Việc tái sử dụng không chỉ được vận dụng cho những dịch vụ mà nó cònđược vận dụng cho cả những thành phần tài liệu và giao diện người dùng. Vào cuối năm2008 Google cho phát hành một thiết bị cầm tay được gọi là Android Dev Phone 1 hoàn toàn có thể chạy được những ứng dụng Android mà không bị ràng buộc vào những nhà cungcấp mạng điện thoại di động. Mục tiêu của thiết bị này là được cho phép những nhà pháttriển thực thi những cuộc thí nghiệm trên một thiết bị thực hoàn toàn có thể chạy hệ điều hànhAndroid mà không phải ký một bản hợp đồng nào. Vào khoảng chừng cùng thời hạn đóthì Google cũng cho phát hành một phiên bản vá lỗi 1.1 của hệ quản lý này. Ở cảhai phiên bản 1.0 và 1.1 Android chưa tương hỗ soft-keyboard mà yên cầu những thiết bịphải sử dụng bàn phím vật lý. Android cố định và thắt chặt yếu tố này bằng cách phát hànhSDK 1.5 vào tháng tư năm 2009 cùng với 1 số ít tính năng khác. Chẳng hạn nhưnâng cao năng lực ghi âm truyền thông online, đồ vật và những live thư mục. 1.1.2. Kiến trúc của AndroidMô hình sau bộc lộ một cách tổng quát những thành phần của hệ điều hànhAndroid. Mỗi một phần sẽ được đặc tả một cách cụ thể dưới đây. Hình 1-2 Cấu trúc stack của mạng lưới hệ thống Android1. 1.2.1. Tầng ứng dụngAndroid được tích hợp sẵn một số ít ứng dụng thiết yếu cơ bản như : contacts, browser, camera, Phone, … Tất cả những ứng dụng chạy trên hệ điều hành quản lý Android đềuđược viết bằng Java. 1.1.2. 2. Application frameworkBằng cách phân phối một nền tảng tăng trưởng mở, Android phân phối cho những nhàphát triển năng lực kiến thiết xây dựng những ứng dụng cực kỳ nhiều mẫu mã và phát minh sáng tạo. Nhà pháttriển được tự do tận dụng những thiết bị phần cứng, thông tin khu vực truy vấn, cácdịch vụ chạy nền, thiết lập mạng lưới hệ thống báo động, thêm những thông tin để những thanhtrạng thái, và nhiều, nhiều hơn nữa. Nhà tăng trưởng hoàn toàn có thể truy vấn vào những APIcùng một khuôn khổ được sử dụng bởi những ứng dụng lõi. Các kiến trúc ứng dụngđược phong cách thiết kế để đơn giản hóa việc sử dụng lại những thành phần ; bất kể ứng dụng cóthể xuất bản năng lực của mình và ứng dụng nào khác sau đó hoàn toàn có thể sử dụng nhữngkhả năng ( hoàn toàn có thể hạn chế bảo mật thông tin được thực thi bởi khuôn khổ ). Cơ chế này chophép những thành phần tương tự như sẽ được sửa chữa thay thế bởi người sử dụng. Cơ bản toàn bộ cácứng dụng là một bộ những dịch vụ và những mạng lưới hệ thống, gồm có : Một tập hợp rất nhiều những View có năng lực thừa kế lẫn nhau dùng để thiếtkế phần giao diện ứng dụng như : gridview, tableview, linearlayout, … Một “ Content Provider ” được cho phép những ứng dụng hoàn toàn có thể truy xuất tài liệu từcác ứng dụng khác ( ví dụ điển hình như Contacts ) hoặc là san sẻ tài liệu giữa cácứng dụng đó. Một “ Resource Manager ” phân phối truy xuất tới những tài nguyên không phảilà mã nguồn, ví dụ điển hình như : localized strings, graphics, and layout files. Một “ Notifycation Manager ” được cho phép tổng thể những ứng dụng hiển thị cáccustom alerts trong status bar. Activity Maanager được dùng để quản trị chutrình sống của ứng dụng và điều hướng những activity. 1.1.2. 3. LibraryAndroid gồm có một tập hợp những thư viên C / C + + được sử dụng bởi nhiềuthành phần khác nhau trong mạng lưới hệ thống Android. Điều này được bộc lộ thông quanền tảng ứng dụng Android. Một số những thư viện cơ bản được liệt kê dưới đây : System C library : a BSD-derived implementation of the standard C systemlibrary ( libc ), tuned for embedded Linux-based devices. Media Libraries – based on PacketVideo’s OpenCORE ; the libraries supportplayback and recording of many popular audio and video formats, as well asstatic image files, including MPEG4, H. 264, MP3, AAC, AMR, JPG, andPNGSurface Manager – Quản lý việc truy xuất vào mạng lưới hệ thống hiển thị. LibWebCore – a modern web browser engine which powers both the Androidbrowser and an embeddable web view. SGL – the underlying 2D graphics engine. 3D libraries – an implementation based on OpenGL ES 1.0 APIs ; the librariesuse either hardware 3D acceleration ( where available ) or the included, highlyoptimized 3D software rasterizer. FreeType – bitmap and vector font rendering. SQLite – a powerful andlightweight relational database engine available to all applications. 1.1.2. 4. Android RuntimeAndroid gồm có một tập hợp những thư viện cơ bản mà phân phối hầu hết cácchức năng có sẵn trong những thư viện lõi của ngôn từ lập trình Java. Tất cả những ứngdụng Android đều chạy trong tiến trình riêng. Máy ảo Dalvik đã được viết để chomột thiết bị hoàn toàn có thể chạy nhiều máy ảo hiệu suất cao. Các VM Dalvik thực thi những tập tinthực thi Dalvik ( dex ). Định dạng được tối ưu hóa cho bộ nhớ tối thiểu. VM là dựatrên register-based và chạy những lớp đã được biên dịch bởi một trình biên dịch Javađể quy đổi thành những định dạng dex. Các VM Dalvik dựa vào nhân Linux chocác tính năng cơ bản như luồng và quản trị bộ nhớ thấp. 1.1.2. 5. Linux kernelAndroid dựa trên Linux phiên bản 2.6 cho mạng lưới hệ thống dịch vụ cốt lõi nhưsecurity, memory management, process management, network stack, and drivermodel. Kernel Linux hoạt động giải trí như một lớp trừu tượng hóa giữa phần cứng và phầncòn lại của ứng dụng stack. 1.1.3. Các thành phần cơ bản của một ứng dụng Android1. 1.3.1. ActivityTạo một Activity : Để tạo một Activity mới cần thừa kế từ lớp Activity, sử dụng cácView để phân phối những tương tác với người dùng, khai báo những thành phần giao diệnvà thực thi những công dụng của ứng dụng. package com.paad.myapplication ; import android.app. Activity ; import android.os. Bundle ; public class MyActivity extends AppCompatActivity / * * Called when the activity is first created. * / @ Overridepublic void onCreate ( Bundle icicle ) { super. onCreate ( icicle ) ; Một lớp Activity cơ bản đưa ra một màn hình hiển thị rỗng chứa hành lang cửa số hiển thị. Vì vậy việccần thực thi tiên phong là khai báo bố cục tổng quan cho nó bằng cách sử dụng những View vàLayout. Activity UI được tạo thành bởi những View. View là những tinh chỉnh và điều khiển giao diệnngười dùng, hiển thị tài liệu và phân phối tương tác đến người dùng. Để gắn một giao diện cho một Activity sử dụng phương pháp setContentView tronglớp Activity được thừa kế. @ Overridepublic void onCreate ( Bundle icicle ) { super. onCreate ( icicle ) ; MyView myView = new MyView ( this ) ; setContentView ( myView ) ; Có 2 cách để thiết lập giao diện cho Activity : Bằng code hoặc trải qua file địnhnghĩa layout. Ở trên là cách tạo giao diện bằng code, sau đây là cách tạo giao diệnngười trải qua layout truyền tham số vào cho phương pháp setContentView là mộtresource ID. @ Overridepublic void onCreate ( Bundle icicle ) { super. onCreate ( icicle ) ; setContentView ( R.layout.main ) ; Để dùng một Activity cần khai báo bên trong file manifest. Thêm vào một thẻactivity mới bên trong nút application. Thẻ activity này gồm có những thuộc tínhcho siêu dữ liệu ( label, icon, … ). Một Activity mà không được khai báo một thẻactivity tương ứng sẽ không được khởi chạy. Ví dụ sau miêu tả cách làm thế nào để khai báo Activity đã được tạo ở phần trên : android : name = ”. MyActivity ” > Vòng đời của ActivityHình 1.3. Vòng đời của ActivityKhởi động một ActivityĐể khởi động một Activity tất cả chúng ta dùng Intent : Khai báo tường minh : cung ứng đúng chuẩn thông tin của activity cần gọi ( nếucùng ứng dụng chỉ cần phân phối tên class, nếu ứng dụng khác nhau thì cungcấp tên package, tên class ). Khai báo không tường minh : cung ứng thao tác cần làm gì, với loại dữ liệunào, thao tác thuộc nhóm nào … mạng lưới hệ thống sẽ tìm activity tương ứng để khởiđộng. Ví dụ : đoạn code bên dưới sẽ khởi động một activity nào đó đăng cókhả năng xem ảnh. Với cách khởi động activity không tường minh, tất cả chúng ta cần phải biết một chút ít vềIntent-filter. Intent-filter sẽ giúp một activity ĐK với mạng lưới hệ thống mình hoàn toàn có thể làmđược thao tác gì, trong nhóm nào, với loại tài liệu nào. Như vậy khi intent và intentfilter khớp nhau, activity sẽ được mạng lưới hệ thống khởi động. 1.1.3. 2. BroadcastReceiverBroadcastReceiver là một trong bốn loại thành phần trong ứng dụng Android. Chứcnăng của nó là dùng để nhận những sự kiện mà những ứng dụng hoặc mạng lưới hệ thống phát đi. Có 2 cách phát-nhận đó là : Không có thứ tự : receiver nào đủ điều kiện kèm theo thì nhận hết, không phân biệt vàchúng tách rời nhau. Có thứ tự : receiver nào ĐK ưu tiên hơn thì nhận trước, và hoàn toàn có thể truyềnthêm thông tin giải quyết và xử lý cho những receiver. BroadcastReceiver chỉ có duy nhất một phương pháp onReceive ( ). Khi có sự kiện mà BroadcastReceiver đã đăng ký nhận được phát đi, thìphương thức onReceive ( ) của BroadcastReceiver đó sẽ được gọi. Sau khi thực thi xong phương pháp này, vòng đời của BroadcastReceiver kếtthúc. Lưu ý khi sử dụng : Ngay khi onReceive ( ) kết thúc, mạng lưới hệ thống coi như receiverđã không còn hoạt động giải trí và hoàn toàn có thể giải phóng tiến trình chứa receiver này bấtcứ khi nào. Tránh giải quyết và xử lý những code quá lâu trong onReceive ( ). Không có xử lýbất đồng điệu, chờ callback … trong Receiver ( đơn cử nhưhiển thị Dialog, liên kết service … ) Một số broadcast thông dụng :  Báo mạng lưới hệ thống khởi động xong.  Báo pin có sự biến hóa.  Báo có package mới cài vào hoặc xóa đi.  Báo tắt máy.  Báo cắm sạc, rút sạc.  Thông báo tin nhắn tới.  Thông báo cắm, rút thẻ nhớ.  Thông báo có cuộc gọi đi. Broadcast do người tăng trưởng ứng dụng tự định nghĩa ( giúp liên lạc hoặc thông báomột sự kiện giữa những ứng dụng ). Hàm onReceive ( ) : Phương thức này được gọi khi có sự kiện tương ứng được phátđi. Ở trong phương pháp này, ta truyền vào context ( ngữ cảnh ) và intent ( nơi nhận ). Context : Vì lớp Receiver không kế thừa từ lớp Context nên cần truyền context màreceiver này đang chạy vào. Thứ nhất là để hoàn toàn có thể giải quyết và xử lý những phương pháp yêu cầutruyền thêm Context, thứ hai là để sử dụng những phương pháp của lớp Context. Intent : Intent được truyền vào sẽ có vừa đủ thông tin như sự kiện nào mà receivernày ĐK đã xảy ra dẫn đến onReceive ( ) được gọi, có gửi kèm thông tin gì hoặcdữ liệu gì hay không. Xem những api : Intent. getAction ( ) ; Intent. get … Extra ( String dataName ) ; 1.1.3. 3. ServiceService là một trong 4 loại thành phần của một ứng dụng Android. Service chạy nềnvà không tương tác trực tiếp với người dùng. Sử dụng Service để : Dùng trong những ứng dụng nghe nhạc. Dùng để giải quyết và xử lý những thao tác mất thời hạn và không nhất thiết phải hiển thị lênactivity ( tải về, upload … ). Đôi khi cần một ứng dụng quản lý và vận hành liên tục để giải quyết và xử lý những việc mong muốnmà không làm phiền người dùng. Làm những thao tác thống kê giám sát, giải quyết và xử lý đều đặn nào đó và hiệu quả khi nào ngườidùng cần thì mới xem. Tạo ra một Service : Để tạo ra một Service, ta tạo ra một class mới thừa kế lớpService và override những phương pháp onStart ( ), onCreate ( ) và onBind ( ). import android.app. Service ; import android.content. Intent ; import android.os. IBinder ; public class MyService extends Service { @ Overridepublic void onStart ( Intent intent, int startId ) { / / TODO : Actions to perform when service is started. @ Overridepublic void onCreate ( ) { / / TODO : Actions to perform when service is created. @ Overridepublic IBinder onBind ( Intent intent ) { / / TODO : Replace with service binding implementation.return null ; Để mở màn một Service, sử dụng phương pháp startService. Nếu Service yêu cầuquyền truy vấn không sống sót trong ứng dụng thì một ngoại lệ SecurityException sẽđược đưa ra. Có 2 cách để khởi đầu một Service mới. Cách 1 : khởi động ngầm. Ví dụ : startService ( new Intent ( MyService. MY_ACTION ) ) ; Cách 2 : khởi động tường minh. Ví dụ : startService ( new Intent ( this, MyService. class ) ) ; Để dừng một Serivce sử dụng phương pháp stopService truyền vào Intent xác địnhService cần ngưng hoạt động giải trí. Vòng đời của ServicesHình 1.4 Vòng đời của serviceKhi có một context nào đó gọi startService ( ) để khởi động một dịch vụ mong ước. Nếu dịch vụ đó chưa được tạo thì sẽ gọi onCreate ( ) rồi gọi tiếp onStart ( ) và khi đódịch vụ chạy nền bên dưới. Nếu sau đó lại có một context muốn khởi độngdịch vụ này mà dịch vụ đã đang chạythì chỉ có phương pháp onStart ( ) của dịch vụ được gọi. Dù dịch vụ có được gọi khởi động bao nhiêu lần thì cũng chỉ có biểu lộ của dịchvụ và chỉ cần gọi stopService ( ) một lần để kết thúc dịch vụ. Khi một Activity được liên kết tới một Service nó duy trì một tham chiếu đến mộtthực thể Service. Để liên kết đến thực thể này, thực thi phương pháp onBind như sau : private final IBinder binder = new MyBinder ( ) ; @ Overridepublic IBinder onBind ( Intent intent ) { return binder ; } public class MyBinder extends Binder { MyService getService ( ) { return MyService. this ; } } Sự liên kết giữa Service và Acitvity được biểu lộ qua một ServiceConnection. Điềucần làm là thực thi một ServiceConnection mới, override phương thứconServiceConnected và onServiceDisconnected. / / tham chiếu đến dịch vụprivate MyService serviceBinder ; / / giải quyết và xử lý kết nồi giữa service và activityprivate ServiceConnection mConnection = new ServiceConnection ( ) { public void onServiceConnected ( ComponentName className, IBinderservice ) { / / được gọi khi link được thực hiệnserviceBinder = ( ( MyService. MyBinder ) service ). getService ( ) ; public void onServiceDisconnected ( ComponentName className ) { / / nhận khi dịch vụ ngắt liên kết một cách bất ngờserviceBinder = null ; } Để triển khai việc liên kết gọi phương pháp bindService : @ Overridepublic void onCreate ( Bundle icicle ) { super. onCreate ( icicle ) ; / / liên kết dịch vụIntent bindIntent = new Intent ( MyActivity. this, MyService. class ) ; bindService ( bindIntent, mConnection, Context. BIND_AUTO_CREATE ) ; } Hoạt động của bindService ( ) : liên kết dịch vụHình 1.4. Hoạt động liên kết dịch vụThông thường, vòng đời của dịch vụ khi có client liên kết từ đầu như sau : Cũng khởi đầu bằng onCreate ( ) rồi đến onBind ( ) và dịch vụ chạy dưới nền. Khi không còn client liên kết tới thì dịch vụ gọi onUnbind ( ) rồi onDestroy ( ). Có một số ít trường hợp không thường thì, ví dụ như : Có một context khởi động một dịch vụ, sau đó có một số ít client liên kết ( bind ) tới service. Có nhiều client cùng lúc liên kết tới dịch vụ. Một activity vừa gọi startService ( ) vừa gọi bindService ( ). 1.3.1. 4. Content ProvidersCó thể coi trình cung ứng nội dung như thể một sever cơ sở tài liệu. Công việc củanó là quản trị truy vấn và san sẻ tài liệu đang sống sót, ví dụ điển hình như một cơ sở dữliệu SQLite. Nó hoàn toàn có thể được thông số kỹ thuật để cho phép những ứng dụng khác truy xuất vàngược lại. Nếu ứng dụng rất đơn thuần thì không nhất thiết phải tạo ra một trình cungcấp nội dung. Content Provider giúp tách biệt tầng ứng dụng ra khỏi tầng tài liệu. Nó có đầy đủcác quyền tinh chỉnh và điều khiển và được truy xuất trải qua quy mô URI đơn thuần như là cóthể thêm, xóa, update tài liệu của những ứng dụng. Tạo một Content Provider mớiTạo Content ProviderĐể tạo một Content Provider cần thừa kế lại từ lớp trừu tượng ContentProvide, ghiđè lại phương pháp onCreate. import android.content. * ; import android.database. Cursor ; import android.net. Uri ; import android.database. SQLException ; public class MyProvider extends ContentProvider { @ Overridepublic boolean onCreate ( ) { / / TODO : Construct the underlying database.return true ; Nên phân phối một biến static CONTENT_URI trả về một URI của provider này. Content URI phải là duy nhất giữa những provider, vì vậy nên dựa vào tên package đểxác định URI, hình thức chung cho việc định nghĩa một Content Provider URI là : content : / / com .

Source: https://mindovermetal.org
Category: Ứng dụng hay

5/5 - (2 votes)

Bài viết liên quan

Subscribe
Notify of
guest
0 Comments
Inline Feedbacks
View all comments