Tải bản đầy đủ (.doc) (25 trang)

Hệ điều hành android và xây dựng ứng dụng contact trên 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 (730.31 KB, 25 trang )

Báo cáo thực tập tốt nghiệp

MỤC LỤC

SV: Trần Quốc Khánh - Lớp: ĐT6 - K53


Báo cáo thực tập tốt nghiệp

LỜI NÓI ĐẦU

Hệ điều hành Android hiện đang là hệ điều hành được ưa chuộng nhất trong thế
giới thiết bị cấm tay. Với sự ra mắt của Android và sự phát triển không ngừng của nền
tảng di động này đã đánh dấu một đối trọng với iOS của Apple trên thị trường di động.
Trong tương lai Android sẽ còn phát triển mạnh mẽ. Vì vậy trong bài thực tập này em
tìm hiểu về : “Hệ điều hành Android và xây dựng ứng dụng Contact trên Android”.
Qua đây em xin chân thành cảm ơn công ty Samsung electronic Vietnam đã tạo
mọi điều kiện cho em trong quá trình thực tập và thầy giáo Phạm Thành Công đã giúp
đỡ ,hướng dẫn cho em hoàn thành tốt đợt thực tập này.

SV: Trần Quốc Khánh - Lớp: ĐT6 - K53

-1-


Báo cáo thực tập tốt nghiệp

Chương 1 Tổng quan về hệ điều hành Android
1.1 Lịch sử Android



Năm 2003, một công ty hoạt động trong lĩnh vực phát triển phần mềm cho các thiết

bị di động mang tên là Android được thành lập bởi 4 thành viên là:
– Andy Rubin (nhà đồng sáng lập công ty Danger - công ty chuyên về các nền
tảng, phần mềm, thiết kế, và dịch vụ cho các thiết bị điện toán di động)
– Rich Miner (nhà đồng sáng lập công ty truyền thông Wildfire
Communications)
– Nick Sears (một trong những vị phó chủ tịch của nhà cung cấp mạng viễn
thông di động T-Mobile ở Mỹ)
– Chris White (trưởng bộ phận thiết kế và phát triển giao diện của WebTV)
• Năm 2005, sau hơn 2 năm hoạt động thì Android được Google mua lại với một
khoản tiền không được tiết lộ và chính thức trở thành một trong những công ty con của
gã khổng lồ ngành tìm kiếm. Đồng thời cả Andy Rubin, Rich Miner và Chris White
đều quyết định tiếp tục làm việc tại chính công ty của mình sau khi được mua lại. Ở
thời điểm đó, nhiều người không thực sự chú ý vào thương vụ này, thế nhưng nó lại
đánh dấu bước đi đầu tiên của Google trong thị trường thiết bị di động thế giới.


Tại Google, một nhóm nghiên cứu đứng đầu là Rubin đã bắt đầu phát triển một nền

tảng dành cho thiết bị di động dựa trên nhân của hệ điều hành Linux. Và sau đó, hệ
điều hành này cũng được giới thiệu đến các nhà phát triển phần cứng lẫn phần mềm,
báo hiệu sự có mặt của một "ngôi sao" khác trên "thiên hà" thị trường công nghệ di
động.


Đến tháng 12 năm 2006, suy đoán về ý định gia nhập thị trường truyền thông di

động của Google tiếp tục được củng cố sau khi BBC và The Wall Street Journal cho
biết rằng hãng này muốn đưa ứng dụng và chức năng tìm kiếm của mình lên các thiết

bị di động. Lập tức ngay sau đó, nhiều tin đồn về chiếc điện thoại mang thương hiệu
Google xuất hiện khắp các phương tiện truyền thông.
• Tháng 5 năm 2007, liên minh các nhà sản xuất thiết bị cầm tay - Open Handset
Alliance (OHA) được thành lập bao gồm Google và một số thành viên khác của cộng
đồng Linux mở như: Broadcom Corporation, Google, HTC, Intel, LG, Marvell
SV: Trần Quốc Khánh - Lớp: ĐT6 - K53

-2-


Báo cáo thực tập tốt nghiệp
Technology Group, Motorola, Nvidia,Qualcomm, Samsung Electronics, Sprint Nextel,
T-Mobile và Texas Instruments. Mục tiêu của OHA là phát triển tiêu chuẩn mở cho
các thiết bị di động và sản phẩm đầu tiên của liên minh này đó là Android, một nền
tảng di động được xây dựng trên nhân Linux phiên bản

Hình 1.1 Liên minh di dộng

1.2 Kiến trúc Android

SV: Trần Quốc Khánh - Lớp: ĐT6 - K53

-3-


Báo cáo thực tập tốt nghiệp
Hính 1.2 Kiến trúc Android

1.2.1 Lớp Application
Android được phát hành cùng với một bộ các ứng dụng gốc bao gồm: email, trình tin

nhắn SMS, lịch, bản đồ, trình duyệt web, danh bạ, và một số ứng dụng khác. Tất cả
các ứng dụng trên được viết bằng ngôn ngữ lập trình Java.
Android đưa ra một cơ chế rất linh động cho phép người sử dụng có thể thay thế các
ứng dụng mặc định này bằng bất kì ứng dụng nào của bên thứ 3.
Trong Android được chia ra làm hai loại ứng dụng :apps và widgets.Apps là các ứng
dụng bao phủ toàn bộ màn hình còn widgets là các ứng dụng mà khi hoạt động nó chỉ
chiếm một phần nhỏ của màn hình thiết bị.
1.2.2 Lớp Application FrameWork
Tầng này cung cấp một nền tảng phát triển ứng dụng mở qua đó cho phép nhà phát
triển ứng dụng có khả năng tạo ra các ứng dụng vô cùng sáng tạo và phong phú .

Hình 1.3 Lớp Application Framework

Activity Manager – Quản lý vòng đời của một ứng dụng
Window Manager – Quản lý hiện thị.
Content Providers –Sử dụng trong việc chia sẻ dữ liệu giữa các ứng dụng.
View System –Chịu .trách nhiệm tạo và quản lý các View
Package Manager –Sử dụng trong việc cái đặt,cập nhật , gỡ bỏ ứng dụng.
Telephony Manager –Sử dụng để cung cấp các dịch vụ thoại như gọi điện...
Resource Manager –Quản lý các nguồn tài nguyên của ứng dụng như :ảnh,nhạc..
Location Manager –Sử dụng để theo dõi vị trí vật lý của điện thoại
Notification Manager –Thông báo khi có các sự kiện xẩy ra như là :tin nhắn,lịch..
1.2.3 Lớp Library & Runtime Layer

SV: Trần Quốc Khánh - Lớp: ĐT6 - K53

-4-


Báo cáo thực tập tốt nghiệp

Lớp tiếp theo được gọi là lớp Thư viện. Nó được chia thành hai phần. Phần đầu tiên
chứa các thiết lập của C / C + + thư viện được sử dụng bởi các thành phần khác
Android và phần thứ hai được gọi là Android Runtime có bao gồm tập hợp các thư
viện lõi Java và máy ảo. Hình dưới đây cho thấy lớp Library Runtime

Hình 1.4 Lớp Library & Runtime Layer

Một số C / C + + thư viện được liệt kê dưới đây
LibC- Đây là hệ thống tiêu chuẩn thư viện C.
Media Framework- được sử dụng để hỗ trợ phát và ghi âm của âm thanh và các định
dạng video khác nhau. Cùng một thư viện cũng được sử dụng cho các tập tin hình ảnh.
Surface Manager - Điều này được sử dụng để quản lý quyền truy cập vào hệ thống
con hiển thị.
LibWebCore - được sử dụng như là một công cụ trình duyệt web trên trình duyệt web
và Android xem nhúng
SGL - Điều này được sử dụng để làm đồ họa 2D.
3Dlib -được sử dụng để vẽ đồ họa 3D.
Freetype- sử dụng để làm cho phông chữ. Cả bitmap và vector vẽ phông chữ được hỗ
trợ.
SQLite - được sử dụng để làm việc với RDBMS. Nó là một RDBMS nhẹ thư viện mà
không phải là lớn như các đối tác để bàn của họ nhưng vô cùng hữu ích trong phạm vi
thiết bị cầm tay di động.
Android sử dụng Dalvik Virtual Machine (DVM) :điểm nổi bật DVM là một thiết
bị có thể chạy nhiều trường hợp của nó. Xin lưu ý rằng mặc dù Android sử dụng Java
là ngôn ngữ lập trình của nó, mã thực thi không phải là một tập tin. class. Thay vào đó,
Android có định dạng riêng của mình được biết đến như là định dạng thực thi Dalvik
(dex) được tối ưu hóa cho bộ nhớ tối thiểu.
SV: Trần Quốc Khánh - Lớp: ĐT6 - K53

-5-



Báo cáo thực tập tốt nghiệp
1.2.4 Lớp Linux Kernel

Hình 1.5 Lớp Linux Kernel

Hệ điều hành Android được xây dựng trên bộ nhân Linux 2.6 cho những dịch vụ hệ
thống cốt lõi như bảo mật,quản lý bộ nhớ, quản lý các tiến trình….Bộ nhân này làm
nhiệm vụ như một lớp trung gian kết nối phần cứng thiết bị và phần ứng dụng .

Hình 1.6 Java Native Interface

JNI:Java Native Interface
Java Native Interface :là một bộ framework cho phép mã lệnh viết bằng Java chạy trên
máy cảo Java có thể gọi được hoặc được gọi bởi một ứng dụng viết bằng native
code(Ứng dụng hoặc những bộ thư viện viết bằng C,C++,hoặc Assembly).
Bằng cách sư dụng JNI ,android cho phép các ứng dụng chạy trên máy ảo Dalvik có
thể sử dụng được những phương thức được viết bằng ngôn ngữ cấp thấp như :C,C+
+,Assembly.Qua đó các nhà phát triển ứng dụng có thể xây dựng ứng dụng dựa trên
các bộ thư viện C, C++, Assembly nhằm tăng tốc độ thực thi của ứng dụng hoặc sử
SV: Trần Quốc Khánh - Lớp: ĐT6 - K53

-6-


Báo cáo thực tập tốt nghiệp
dụng các tính năng mức thấp mà ngôn ngữ Java không hỗ trợ. Tuy nhiên người phát
triển ứng dụng cần phải cân nhắc sự gia tăng độ phức tạp của ứng dụng khi quyết định
sử dụng bộ thư viện này.

1.3 Công cụ phát triển Eclipse

Hình 1.7 Thành phần một project Android trong Eclipse

AndroidManifest.xml: file XML mô tả ứng dụng và các thành phần đuợc cung cấp
bởi ứng dụng (activities, services,...).
build.xml: Một file chứa mã script Ant (ant.apache.com) nhằm compile và cài đặt ứng
dụng lên máy.
bin/ : nơi chứa ứng dụng sau khi được compile.
libs/ : nơi chứa các file Java JAR ứng dụng yêu cầu.
src/ : nơi chứa mã nguồn Java của ứng dụng.
res/ : chứa các tài nguyên của ứng dụng, như các icons, GUI layouts,...
res/drawable/ : chứa file hình ảnh (PNG, JPEG,...).
res/layout/ : chứa UI layout, dưới dạng XML.
res/menu/ : chi tiết các menu, dưới dạng XML.
res/raw/ : chứa các file khác (CSV chứa thông tin account,...).
res/values/ : chứa các strings, dimensions,...
res/zml/ : chứa các file XML khác cần cho ứng dụng.
assets/ : nơi chứa các files tĩnh (static) được yêu cầu đi kèm với ứng dụng.
SV: Trần Quốc Khánh - Lớp: ĐT6 - K53

-7-


Báo cáo thực tập tốt nghiệp
Ở đây chúng ta phải luôn chú ý tới file manifest để tránh lỗi khi viết các ứng dụng trên
android

Cụ thể những công việc mà AndroidManifest.xml thực hiện:
- Đặt tên cho Java package của ứng dụng.

- Mô tả các thành phần (component) của ứng dụng: activity, service, broadcast
receiver hoặc content provider.
- Thông báo những permission mà ứng dụng cần có để truy nhập các protected
API và tương tác với các ứng dụng khác.
- Thông báo những permission mà các ứng dụng khác cần có để tương tác với
ứng dụng hiện thời.
- Thông báo level thấp nhất của Android API mà ứng dụng cần để chạy.
(Android 1.0 là level 1, 1.1 là level 2, 1.5 level 3, 1.6 level 4 và 2.0 là level 5).

Hình 1.8 Manifest

1.4 Các thành phần cơ bản của một ứng dụng Android
1.4.1 Activity
Actitvity là thành phần quan trọng nhất và đóng vai trò chính trong xây dựng ứng
dụng Android.Activity đảm nhiệm vai trò tương tác với người dùng. Hệ điều hành
Android quản lý Activity theo dạng stack: khi một Activity mới được khởi tạo, nó

SV: Trần Quốc Khánh - Lớp: ĐT6 - K53

-8-


Báo cáo thực tập tốt nghiệp

sẽ được xếp lên đầu của stack và trở thành running activity, các Activity trước đó
sẽ bị tạm dừng và chỉ hoạt động trở lại khi Activity mới được giải phóng.
Một Activity có 4 trạng thái:
Active hay Running: Khi một activity đang chạy trên màn hình.
Paused: Khi một activity vẫn đang chạy trên màn hình nhưng đang bị một activity
trong suốt (transparent) hay không chiếm toàn màn hình hiển thị phía trên. Tuy vẫn

lưu trữ dữ liệu, nhưng các paused activity này sẽ bị hệ thống bắt chấm dứt khi đang
thiếu bộ nhớ trầm trọng.
Stopped: Khi 1 activity bị che khuất hoàn toàn bởi 1 activity khác. Tuy vẫn lưu
trữ dữ liệu, nhưng các stopped activity này sẽ thường xuyên bị hệ thống bắt chấm dứt
để dành chỗ cho các tiến trình khác.
Killed hay Shut down: Khi 1 activity đang paused hay stopped, hệ thống sẽ xóa
activity ấy ra khỏi bộ nhớ.

SV: Trần Quốc Khánh - Lớp: ĐT6 - K53

-9-


Báo cáo thực tập tốt nghiệp

Hình 1.9 Vòng đời một activity

Có 2 phương thức mà gần như mọi lớp con của Activity đều phải hiện thực:
onCreate(Bundle) - Nơi khởi tạo activity. Quan trọng hơn, đây chính người lập
trình gọi setContentView(int) kèm theo layout để thể hiện UI của riêng mình. Đồng
thời còn có findViewById(int) giúp gọi các widget (buttons, text boxes, labels,..) để
dùng trong UI.
SV: Trần Quốc Khánh - Lớp: ĐT6 - K53

-10-


Báo cáo thực tập tốt nghiệp
onPause() - Nơi giải quyết sự kiện người dùng rời khỏi activity. Mọi dữ liệu được
người dùng tạo ra tới thời điểm này cần phải được lưu vào ContentProvider.

Khởi động 1 activity từ 1 activity khác


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).
Intent intent = new Intent(getApplicationContext(),TargetActivity.class);
startActivity(intent);

• 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.
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
startActivity(intent);
Liên lạc giữa 2 activity

• Bên phía activity được khởi động, có thể lấy dữ liệu được gửi như sau:
getIntent().getExtras().getString("value1");
getIntent().getExtras().getLong("value2");
• Khi khởi động một activity, ta có thể gửi kèm dữ liệu trong intent như ví dụ
sau:
intent.putExtra("value1", new String("Hello"));
intent.putExtra(“value2", new Long(100));
• Bên phía activity được khởi động, có thể lấy dữ liệu được gửi như sau:
getIntent().getExtras().getString("value1");
getIntent().getExtras().getLong("value2");
1.4.2 Service
Một service là một thành phần của ứng dụng, thể hiện mong muốn ứng dụng thực
hiện các hành động trong khi không tương tác với người dùng hoặc cung cấp chức
năng cho các ứng dụng khác sử dụng. Nói một cách đơn giản, service là các tác vụ

SV: Trần Quốc Khánh - Lớp: ĐT6 - K53

-11-


Báo cáo thực tập tốt nghiệp
(task) chạy ngầm dưới hệ thống nhằm thực hiện một nhiệm vụ nào đó. Mỗi class
Service phải chứa thẻ <service> được khai báo trong file AndroidManifext.xml.
Services có thể được bắt đầu bởi Context.startService() và Context.bindservice()
Cũng như các đối tượng của ứng dụng khác, services chạy trên luồng (Thread) của
tiến trình chính. Có nghĩa là nếu service của bạn dự định chạy các hành vi có cường độ
lớn hoặc các hành vi có thể gây nghẽn mạch, nó sẽ tự sinh ra luồng (Thread) của chính
nó để làm thực hiện các tác vụ được đặc tả trong Service.
Service không phải là một tiến trình độc lập. Đối tượng Service không chạy trên
tiến trình (process) của riêng nó (trừ khi có một yêu cầu đặt biệt), Service chạy trên
tiến trình của chương trình.
Service không phải là một luồng (thread).
Service có chứa 2 đặc trưng cơ bản sau:
• Là một chức năng để ứng dụng thông báo với hệ thống về việc mà nó muốn
thực hiện ở phía dưới nền (ngay cả khi người dùng không tương tác trực tiếp tới
ứng dụng). Điều này tương ứng với việc gọi phương thức Context.startservice(),
nó sẽ yêu cầu hệ thống lên lịch cho service để chạy cho đến khi bị chính service
hay người nào đó dừng nó lại.
• Là một chức năng cho phép ứng dụng để cung cấp các chức năng của nó cho
các ứng dụng khác. Điều đó tương ứng với việc gọi Context.bindService(), cho
phép một long-standing connection được tạo ra để service có thể tương tác với
nó.
Khi một Service được tạo ra, việc hệ thống cần làm là tạo ra thành phần và gọi
hàm onCreate() và bất kỳ lệnh callback thích hợp nào trên luồng chình. Nó phụ thuộc
vào Service thi hành hành vi thích hợp nào, chẳng hạn tạo luồng thứ hai để thực hiện

tiến trình.
Vòng đời của một Service
Có 2 lý do để một service được chạy bởi hệ thống. Bằng cách gọi phương thức
Context.startService() và Context.bindService(). Nếu người dùng gọi phương thức
Context.startService() thì hệ thống sẽ nhận về một đối tượng service (tạo mới nó và
gọi hàm onCreate() nếu cần thiết) và sau đó lại gọi phương thức
onStartCommand(Intent, int ,int) với các biến được cung cấp bởi client. Service mới
được tạo ra này sẽ chạy cho tới khi có lệnh gọi phương thức Context.stopService()
SV: Trần Quốc Khánh - Lớp: ĐT6 - K53

-12-


Báo cáo thực tập tốt nghiệp
hoặc stopSelf(). Dù cho một service có được start bao nhiêu lần đi nữa thì nó sẽ bị tắt
ngay khi phương thức Context.stopService() hoặc phương thức stopSelf() được
gọi.Service có thể dùng phương thức stopSelf(int) để đảm bảo rằng service sẽ không
được tắt cho đến khi Intent đã khởi tạo nó được xử lý.

Hình 1.10 Vòng đời một Service

Dựa theo hình trên, 1 service được bắt đầu bởi phương thức startService() là service
dùng để thực hiện các tác vụ ngầm dưới nền, service được bắt đầu bởi phương thức
bindService() là service được dùng để cung cấp các chức năng cho các chương trình
khác.



BroadcastReceiver (có thể gọi là Receiver là một trong bốn loại thành phần


trong ứng dụng Android. Chức năng 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à
cũ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 sau.

• Thực ra lifecycle của 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
SV: Trần Quốc Khánh - Lớp: ĐT6 - K53

-13-


Báo cáo thực tập tốt nghiệp

đ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, lifercycle của Receiver kết thúc.
• Ngay khi onReceive() kết thúc, hệ thống coi như receiver đã không còn hoạt động
và có thể kill process 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…).
1.4.3 ContentProvider
Là nơi lưu trữ và cung cấp cách truy cập dữ liệu do các ứng dụng tạo nên. Đây là
cách duy nhất mà các ứng dụng có thể chia sẻ dữ liệu của nhau.Android cung cấp sẵn
content providers cho 1 số kiểu dữ liệu thông dụng như âm thanh, video, thông tin sổ
điện thoại,... (Xem thêm trong gói android.provider). Người lập trình cũng có thể tự

tạo ra các class con (subclass) của Content Provider để lưu trữ kiểu dữ liệu của riêng
mình.
Cách thức hoạt động của Content Provider:
Mọi content provider, tuy có thể khác nhau về cách thức lưu trữ dữ liệu, đều sử
dụng chung 1 interface để tìm và trả về dữ liệu, bao gồm việc thêm, bớt và sửa dữ liệu.
Việc này được thực hiện thông qua các đối tượng ContentResolver khi gọi
getContentResolver()
ContentResolver cr = getContentResolver();
Content providers sử dụng dữ liệu dưới dạng 1 table đơn giản, trong đó mỗi hàng là
1 record và mỗi cột là dữ liệu của 1 kiểu nhất định.
Mỗi record có 1 trường “_ID” độc nhất để liên kết với các bảng khác.
URI (Uniform Resource Identifier) là dãy các ký tự string được dùng để:

Mở 1 trang web trong trình duyệt, bắt đầu với “http://”
Chỉ tới các file tài nguyên có sẵn trong máy (VD: 1 file video, danh sách
contacts,...), bắt đầu với "content://"

SV: Trần Quốc Khánh - Lớp: ĐT6 - K53

-14-


Báo cáo thực tập tốt nghiệp
Dựa vào hình 13 sau:

Hình 14 – Các thành phần của 1 URI
A – Tiền tố mặc định của 1 URI, không thay đổi được.
B – Xác định content provider. Đối với các ứng dụng hãng thứ 3, đây
chính là tên đầy đủ của 1 lớp.
C – Xác định loại dữ liệu nào cần lấy về. Nếu nguồn cung cấp chỉ cho

lấy 1 loại duy nhất thì có thể để trống, hoặc nếu có nhiều loại thì có thể phân ra từng
phần 1 (land/bus, land/train, sea/ship,…)
D – ID của 1 record, khi cần lấy về chỉ duy nhất 1 record.
Khi tạo 1 content provider, Android tự động tạo 1 constant cho URI của provider đó
để đảm bảo code hiệu quả và dễ cập nhật sau này. Constant này - CONTENT_URI - sẽ
xác định cho ContentProvider phải liên kết với bảng nào của nguồn cung cấp.
Ví dụ:
 URI cho bảng liên kết số điện thoại với tên người là:
android.provider.Contacts.Phones.CONTENT_URI
 URI cho bảng liên kết hình đại diện với tên người là:
android.provider.Contacts.Photos.CONTENT_URI
Tìm kiếm một ContentProvider
Để băt đầu tìm kiếm (query) 1 content provider, trước nhất người lập trình cần có
trong tay các yếu tố sau:
 URI xác định provider.
 Tên các trường (field) dữ liệu sẽ lấy về.
 Các kiểu dữ liệu của những trường trên.
 ID, chỉ khi cần tìm 1 record xác định nào đó.
Để bắt đầu tìm kiếm, người lập trình có thể dùng 1 trong 2 phương thức:
ContentResolver.query() hoặc Activity.managedQuery(). Cả 2 phương thức trên đều
có chung arguments và đều trả về 1 đối tượng con trỏ (Cursor)

SV: Trần Quốc Khánh - Lớp: ĐT6 - K53

-15-


Báo cáo thực tập tốt nghiệp

public final Cursor query (Uri uri, String[] projection, String selection,

String[] selectionArgs, String sortOrder)
public final Cursor managedQuery (Uri uri, String[] projection, String
selection, String[] selectionArgs, String sortOrder)

Đầu tiên, dù với query() hay managedQuery() thì ta đều cần cung cấp URI của bên
cung cấp, tức CONTENT_URI. Chú ý nếu muốn giới hạn chỉ tìm kiếm 1 URI duy
nhất, ta thêm ID vào cuối URI như sau: “content://.../23”, với 23 là ID ta cần tìm kiếm
Các biến truyền vào khác của query() và managedQuery() là:
 projection - Tên của cột dữ liệu cần trả về. Nếu NULL thì trả về tất cả
các cột.
 selection - Tên các hàng dữ liệu sẽ trả về. Sử dụng với WHERE giống
như khi truy vấn SQL. Nếu NULL thì trả về tất cả các hàng.
 selectionArgs - quy định giá trị trả về,VD:

selectionArgs =

{value_as_string} sẽ ép kiểu dữ liệu trả về dưới dạng string.
 sortOrder - Xác định thứ tự sắp xếp các hàng. Sử dụng với ORDER BY
giống như khi truy vấn SQL. Nếu NULL thì không theo thứ tự gì cả.
Tạo mới 1 Content provider
Để tạo mới 1 content provider, cần phải thoả mãn các điều kiện:
 Thiết lập hệ thống lưu trữ dữ liệu như thế nào: bằng các file hay sử dụng
cơ sở dữ liệu SQLite.
 Extend lớp ContentProvider.
 Khai báo 1 content provider trong file AndroidManifest.xml
Để định nghĩa 1 lớp con ContentProvider, ta cần hiện thực 6 phương thức trừu tượng
(abstract) được khai báo trong lớp ContentProvider:
query()
insert()
update()

delete()
getType()
onCreate()
SV: Trần Quốc Khánh - Lớp: ĐT6 - K53

-16-


Báo cáo thực tập tốt nghiệp
Phương thức query() phải trả về 1 đối tượng Cursor. Mặc dù Cursor về cơ bản là
một interface, Android cung cấp sẵn 1 số đối tượng Cursor tạo sẵn. Ví dụ;
SQLiteCursor dành cho cơ sở dữ liệu SQLite, MatrixCursor cho dữ liệu không lưu
trong SQLite.
Android cũng khuyên nên gọi ContentResover.notifyChange() để báo cho các
listeners biếtdữ liệu sẽ được hiệu chỉnh. Ngoài ra người lập trình cũng nên thêm vài
thao tác sau để giúp việc truy xuất các lớp hiệu quả hơn:
Định nghĩa một Uri dạng public static final, với tên là CONTENT_URI (như đã
trình bày ở trên).
Định nghĩa tên các cột mà content provider sẽ trả về. Thôg thường thì đây cũng
chính là tên các cột trong cơ sở dữ liệu SQLite mà chúng đại diện. Tiếp theo, người
lập trình nên định nghĩa các public static String constants để cac1 ứng dụng khác có
thể ghi rõ tên các cột và các hướng dẫn khác 1 cột interger tên "_id" (với constant _ID)
cũng cần được định nghia để sử dụng khi cần lấy về các record độc nhất. Trong
SQLite,

trường

_ID

nên




kiểu

như

sau:INTEGER

PRIMARY

KEY

AUTOINCREMENT, trong đó thành phần AUTOINCREMENT không nhất thiết phải
có, nhưng nên được đưa vào để đảm bảo các ID luôn độc nhất, tránh trường hợp khi
xóa 1 row thì ID của row tiếp theo sẽ được cấp ID giống hệ của row vừa bị xóa.
Các ghi chú giúp người khác ghi đọc biết đọc dữ liệu như thế nào.
Nếu content provider này xử lý 1 kiểu dữ liệu hoàn toàn mới, người lập trình cần định
nghĩ 1 kiểu MIME mới để trả về trong sự thể hiện của ContentProvider.getType().
Để khai báo 1 Content Provider mới, trước nhất cần phải khai báo trong tag
của file AndroidManifest.xml.

Trong đó, thuộc tính name là tên đầy đủ của lớp con ContentProvider, và authorities
là phần xác định provider của URI "content:"

SV: Trần Quốc Khánh - Lớp: ĐT6 - K53

-17-



Báo cáo thực tập tốt nghiệp

Chương 2 Xây dựng ứng dụng Contact trên Android
2.1 Thiết kế hệ thống
2.1.1 Thiết kế tổng quan
Xây dựng ứng dụng Contact có các chức năng được thể hiện như trong sơ đồ
sau:

Hình 2.1 Hệ thống và chức năng Contact

SV: Trần Quốc Khánh - Lớp: ĐT6 - K53

-18-


Báo cáo thực tập tốt nghiệp

-Chức năng Edit và Save

Hình 2.2 Chức năng Edit và Save

-

Chức năng Delete

Hình 2.3 Chức năng Delete

SV: Trần Quốc Khánh - Lớp: ĐT6 - K53

-19-



Báo cáo thực tập tốt nghiệp

Hình 2.4 Delete theo lựa chọn

2.1.2 Thiết kế cụ thể các thành phần
Ứng dụng gồm :
• 4 Activity :
 MainListActivity :Hiện thị giao diện về Contact
 FriendsDeleteActivity:Hiện thị giao diện để xóa Contact
 FriendViewActivity:Hiện thị nội dung liên lạc của một người
 FriendsEditActivity:Thay đổi nội dung liên lạc của một người
• Một FriendEditService có 4 chức năng
 getFriendList():Lấy về danh sách
 addFriend(ItemFriend item):thêm mới
 updateFriend(ItemFriend item):cập nhật contact
 deleteFriend(int id):xóa contact
• Một ContentProvider có tên là FriendListProvider để chia sẻ dữ liệu cho
các ứng dụng khác.
• Một file Friend.db để chứa cơ sở dữ liệu

SV: Trần Quốc Khánh - Lớp: ĐT6 - K53

-20-


Báo cáo thực tập tốt nghiệp

Hình 2.5 Mô hình xây dựng ứng dụng


2.2 Kết quả chạy chương trình

SV: Trần Quốc Khánh - Lớp: ĐT6 - K53

-21-


Báo cáo thực tập tốt nghiệp

SV: Trần Quốc Khánh - Lớp: ĐT6 - K53

-22-


Báo cáo thực tập tốt nghiệp

SV: Trần Quốc Khánh - Lớp: ĐT6 - K53

-23-


Báo cáo thực tập tốt nghiệp

KẾT LUẬN

Qua đợt thực tập này em đã hiểu và nắm vững được về hệ điều hành Android
:cấu trúc,xây dựng ứng dụng trên Android như thế nào ,sử dụng công cụ pháp triển ra
sao.Em xin chân thành cảm ơn Công ty Samsung Electronic Vietnam đã tạo mọi điều
kiện cho em và thầy Phạm Thành Công đã hướng dẫn ,giúp đỡ em trong quá trình

thực tập.

SV: Trần Quốc Khánh - Lớp: ĐT6 - K53

-24-


×