Chương 1 Tổng quan về hệ điều hành Android1.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
Trang 1MỤC LỤC
MỤC LỤC
LỜI NÓI ĐẦU 1
Chương 1 Tổng quan về hệ điều hành Android 2
1.1 Lịch sử Android 2
1.2 Kiến trúc Android 3
1.2.1 Lớp Application 4
1.2.2 Lớp Application FrameWork 4
1.2.3 Lớp Library & Runtime Layer 4
1.2.4 Lớp Linux Kernel 6
1.3 Công cụ phát triển Eclipse 7
1.4 Các thành phần cơ bản của một ứng dụng Android 8
1.4.1 Activity 8
1.4.2 Service 11
1.4.3 ContentProvider 13
Chương 2 Xây dựng ứng dụng Contact trên Android 17
2.1 Thiết kế hệ thống 17
2.1.1 Thiết kế tổng quan 17
2.1.2 Thiết kế cụ thể các thành phần 19
2.2 Kết quả chạy chương trình 20
KẾT LUẬN 23
Trang 2LỜ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ềntả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ạomọ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
Trang 3Chươ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ềntả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 WildfireCommunications)
– Nick Sears (một trong những vị phó chủ tịch của nhà cung cấp mạng viễnthô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ộtkhoả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ềntả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
Trang 4Technology 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
Trang 5Hí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 tinnhắ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 ứngdụ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
Trang 6Lớ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 vithiế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
Trang 71.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àmnhiệ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ênmá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ử
Trang 8dụ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.
Trang 9Ở đâ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ênandroid
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, broadcastreceiver hoặc content provider
- Thông báo những permission mà ứng dụng cần có để truy nhập các protectedAPI 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)
Trang 10sẽ đượ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ớ
Trang 11Hì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 Đồngthời còn có findViewById(int) giúp gọi các widget (buttons, text boxes, labels, ) đểdùng trong UI
Trang 12onPause() - 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ếucùng ứng dụng chỉ cần cung cấp tên class, nếu ứng dụng khác nhau thì cung cấptê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:
Trang 13Service 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ủatiế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êntiế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êntiế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ốnthự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 servicehay 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ó chocác ứng dụng khác Điều đó tương ứng với việc gọi Context.bindService(), chophép một long-standing connection được tạo ra để service có thể tương tác vớinó
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ọihàm onCreate() và bất kỳ lệnh callback thích hợp nào trên luồng chình Nó phụ thuộcvà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ệntiế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() 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
Trang 14ngay 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à servicedù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
• 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
Trang 15đ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ẵncontent 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êngmì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ọigetContentResolver()
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áchcontacts, ), bắt đầu với "content://"