Ví dụ, nếu nhu cầu ứng dụng của bạn để hiển thị một danh sách các di chuyển hình ảnh và các ứng dụng khác đã phát triển một thanh cuộn phù hợp và đã tạo cho nó có sẵn sàng đối với những
Trang 1CƠ SỞ TẠI THÀNH PHỐ HỒ CHÍ MINH
ĐIỆN THOẠI DI ĐỘNG
Giáo viên hướng dẫn : Ninh Xuân Hải
Sinh viên thực hiện : Vũ Đức Mạnh
Mã số sinh viên : 405170038
Năm 2009
Trang 2Thành phố Hồ Chí Minh, ngày…tháng … năm 200…
PHIẾU NHẬN XÉT ĐỒ ÁN TỐT NGHIỆP HỆ ĐẠI HỌC
(Dành cho người hướng dẫn – Biểu 2)
1 Tên đề tài tốt nghiệp : Thiết kế phần mềm tìm kiếm trên bản đồ số của Google maps dựa trên nền tảng Android dành cho điện thoại di động
Mã đề tài : 09405170031
Ngày sinh : 04/11/1987 MSSV:405170038
Tổng quát về số liệu các kết quả thực hiện:
Số trang:……… Số chương (phần):………
Số bảng số liệu:……… Số hình vẽ:………
Số tài liệu tham khảo:……… Phần mềm sử dụng:………
Hiện vật (sản phẩm phần mềm, phần cứng):………
3 Những ưu điểm chính của đồ án tốt nghiệp: 4.1.Nội dung thực hiện:………
………
………
4.2.Kết quả sản phẩm:………
………
………
4.3.Khả năng áp dụng:………
………
………
4.4.Hình thức trình bày:………
………
………
4 Những thiếu sót chính của đồ án tốt nghiệp: ………
………
………
5 Đề nghị : Được bảo vệ Bổ sung thêm để bảo vệ Không được bảo vệ 6 Đánh giá chung: Điểm số :………./10; Điểm chữ:………
Xác nhận của Bộ môn/ Khoa Giáo viên hướng dẫn
Trang 3Thành phố Hồ Chí Minh, ngày…tháng … năm 200…
PHIẾU NHẬN XÉT ĐỒ ÁN TỐT NGHIỆP HỆ ĐẠI HỌC
(Dành cho người đọc duyệt – Biểu 3)
1 Tên đề tài tốt nghiệp:………
………
Mã đề tài:………
2 Họ tên sinh viên thực hiện:………Lớp:………
Ngày sinh:……… MSSV:………
3 Tổng quát về số liệu các kết quả thực hiện: Số trang:……… Số chương (phần):………
Số bảng số liệu:……… Số hình vẽ:………
Số tài liệu tham khảo:……… Phần mềm sử dụng:………
Hiện vật (sản phẩm phần mềm, phần cứng):………
4 Những ưu điểm chính của đồ án tốt nghiệp: 4.1.Nội dung thực hiện:………
………
4.2.Kết quả sản phẩm:………
………
4.3.Khả năng áp dụng:………
………
4.4.Hình thức trình bày:………
………
5 Những thiếu sót chính của đồ án tốt nghiệp: ………
………
Đề nghị : Được bảo vệ Bổ sung thêm để bảo vệ Không được bảo vệ 6 3 câu hỏi sinh viên trả lời trước Hội đồng: a) ……… …………
………
b) ……….……
………
c) ……… …………
………
7 Đánh giá chung: Điểm số: …… /10; Điểm chữ:………
Xác nhận của Bộ môn/ Khoa Giáo viên đọc duyệt
Trang 4Lời cảm ơn
Sau những năm học tại trường, em đã được học và tiếp thu nhiều kiến thức mới từ sự chỉ bảo tận tình của các Thầy Cô, đã được sống trong tình thương, tình cảm trìu mến của bạn bè đây là khoảng thời gian này ý nghĩa Đề tài thực tập tốt nghiệp đánh dấu một bước ngoặc mới trong cuộc đời em
Em xin chân thành cảm ơn khoa công nghệ thông tin
II, Học viện công nghệ bưu chính viễn thông cơ sở tại TP
Hồ Chí Minh đã tạo điều kiện để em hoàn thành tốt đề tài thực tập tốt nghiệp này
Em xin gởi lời cảm ơn chân thành đến thầy Ninh Xuân Hải , thầy đã hỗ trợ cho em rất nhiều để em hoàn thành
đề tài thực tập tốt nghiệp này
Em xin gởi lời cảm ơn quý thầy cô trong học viện đã tận tình giảng dạy, trang bị cho tôi những kiến thức quý báu trong suốt quá trình học tập tại trường
Một lần nữa, em xin chân thành cảm ơn
Sinh viên
Trang 5
Mục Lục
Phần I : Lý thuyết
Chương I : Giới Thiệu về nền tẳng Android của Google………2
1.1 Android là gì ? ………2
1.2 Sự ra đời của liên minh thiết bị cầm tay mở OHA……….2
1.3 Sự phát triển của Android……… 3
1.3.1 Điều kiện phát triển……… 3
1.3.2 Xu hướng phát triển……….……….5
Chương II : Tổng quan các thành phần của Android……….… 7
1.1 Những đặc trưng của và kiến trúc của Android……….…….… 7
1.1.1 Những đặc trưng của Android……… …… 7
1.1.2 Tổng quan kiến trúc của Android……… …… 7
1.2 Các quy tắc cơ bản của ứng dụng trong Android……….……… 9
1.2.1 Khái quát các thành phần ứng dụng của Android……… 10
1.2.2 Activities và Tasks……… 14
1.2.3 Processes và Threads……… 16
1.2.4 Vòng đời của Android……….…19
Chương III : Trình bày một số công cụ lập trình trên Android… 30
1.1 Cài đặt bộ công cụ Android SDK và plugin (ADT) cho Eclipse………… 30
1.2 Tổng quan các công cụ được dùng trong bộ Android SDK……… 30
1.2.1 Khái quát các công cụ trong Android SDK……… 33
1.2.2 Android Emulator………36
1.2.2.a Tổng quan Emulator……… 37
Trang 61.2.2.b Khởi động và dừng Emulator……….37
1.2.2.c AVDs và Emulator……….38
1.2.2.d Điều khiển Emulator……… 39
1.2.2.f Làm việc với các Disk Image của Emulator……… 40
1.2.2.g Kết nối mạng trên Emulator……… 43
1.2.2.h Sử dụng Console Emulator………47
1.2.2.i Sử dụng các Skin Emulator………56
1.2.2.j Chạy nhiều Emulator một lúc………58
1.2.2.k Cài đặt ứng dụng trên Emulator……….58
1.2.2.l Mô phỏng SD Card………60
1.2.2.m Khắc phục các vấn đề Emulator……….60
1.2.2.n Giới hạn các khả năng mô phỏng của Emulator Android… 60
1.3 Hello World , Android……….60
Phần II: Thiết kế phần mềm tìm kiếm trên bản đồ số của Google… 65
Chương I: Giới thiệu về dịch vụ vị trí và bản đồ trong android…………65
1.1 Dịch vụ vị trí……….65
1.2 Thư viện bên ngoài của google maps……… 65
1.3 Cấu trúc dữ liệu của bản đồ số trên google maps……….67
Chương II: Chi tiết cách lấy dữ liệu bản đồ số của google maps……… 67
2.1 Đăng ký api key và hiện map đơn giản với một MapActivity……… 67
2.2 Tìm vị trí và đường đi trên google maps………75
2.3 Mô phỏng GPS trên emulator ………76
Phần kết luận………72
Phần tham khảo……… 73
Trang 7Danh mục hình vẽ
Số Hình Tên Hình Trang
Trang 8Các thuật ngữ
Emulator Networking Mô phỏng mạng của android
Java Virtual Machine Máy ảo java
Trang 9Một công cụ của android sdk
những ứng dụng android
xuất từ UNIX
một inch vuông
Evolution
Một công nghệ di động được nâng cấp từ GPRS
nâng cấp từ GPRS
được phát triển trên nền tảng công nghệ thông tin di động toàn cầu (GSM)
Communication
Hệ thống thông tin di động toàn cầu thế hệ thứ 2 (2G)
Protocol
Giao thức hoạt động trên layer
2 - Internetwork trong mô hình TCP/IP
protocol
Giao thức quản lý nhóm Internet
nhỏ của Sun Microsystems
Applet
Các ứng dụng của J2ME
trợ ngôn ngữ c/c++
Trang 10NMEA National Marine Electronics
Association
Định nghĩa tổng hợp điện tử
và dữ liệu
quyền của Apple
sử dụng trên các mạng TCP/IP
vận
lõi bên cạnh TCP trong bộ giao thức TCP/IP
Telecommunications System
Mạng di động thế hệ thứ 3
Trang 12Chương I : Giới Thiệu về nền tảng Android của google
1.1 Android là gì ?
Hình 1.1: Logo đại diện cho android
Nền tảng android hay còn gọi là hệ điều hành android của Google nó bao gồm một
hệ điều hành dựa trên mã nguồn mở Linux OS (Kernel 2.6) ,(midware) phần mềm trung
gian và các ứng dụng cơ bản
Chúng ta có thể hiểu nó 1 cách đơn giản android là hệ điều hành mã nguồn mở
dành cho thiết bị cầm tay
Một số hỗ trợ của android cho các thiết bị :
• Màn hình cảm ứng
• 3GWifire
• Trình duyệt dựa trên webkit
• Tin nhắn (SMS) theo luồng
• Định dạng MPEG-4, H.264, MP3, AACBộ tăng tốc đồ họa 3D
1.2 Sự ra đời của liên minh thiết bị cầm tay mở OHA
Dự án xây dựng nền tảng nguồn mở cho những chiếc điện thoại Android của
Google tuy còn đang phát triển nhưng đã tạo nên khá nhiều sự quan tâm và tò mò của
những người yêu thích công nghệ,những lời đồn thổi xung quanh những từ về công nghệ
điện thoại đại loại “Gphone” hay “Google Phone” với những chức năng hiếm có xuất hiện
từ cuối năm 2004 đã tốn khá nhiều giấy mực của giới báo chí, truyền thông
Eric Schmidt cho biết Google đã lập tổ chức Open Handset Alliance (OHA – một tổ chức
đa quốc gia) bao gồm 34 thành viên với các công ty hàng đầu về công nghệ và di động
toàn cầu như Qualcomm, Intel, Motorola, Texas Instruments và LG Electronics, các nhà
mạng như T-Mobile, Sprint Nextel, NTT DoCoMo và China Mobile… nhằm tập trung
xây dựng một chiếc điện thoại di động tốt hơn dựa trên hệ điều hành Android – một hệ
điều hành mã nguồn mở dùng cho tất cả các thiết bị cầm tay
Trang 13Hình 1.2: Các thành phần trong liên minh OHA
Vài nét về Tổ chức Open Handset Alliance (OHA):OHA được xây dựng từ những
tổ chức phát triển điện thoại di động bao gồm các công ty cung cấp dịch vụ điện thoại di
động, sản xuất thiết bị cầm tay, sản xuất phần mềm, dụng cụ bán dẫn, và các công ty kinh
doanh Tổ chức này đang mở cửa cho tất cả các công ty khác nhau và người sử dụng có
thể chọn một trong các nhà cung cấp dịch vụ tốt hơn thông qua OHA với tính năng sẵn có
của hệ điều hành mở Android
1.3 Sự hướng phát triển của android
1.3.1 Điều kiện phát triển
Trên bước đường tạo dựng nền tảng, phát triển thì Google Android cũng gặp
không ít “kẻ ngáng đường” Trong số đó, đối thủ mạnh nhất của nó về phương diện mã
nguồn mở là LiMo Dù rằng cả hai hệ điều hành LiMo và Android đều phát triển dựa trên
nhân Linux nhưng chúng không giống nhau mà có sự khác biệt rất lớn LiMo được hỗ trợ
từ quỹ LiMo (quỹ này được hình thành bởi các hãng lớn Motorola, NEC, NTT DoCoMo,
Orange, Panasonic, Samsung và Vodafone) Nên cả hai nền tảng đều có những “ông
Trang 14trùm” tài chính mạnh làm đối tác nhưng Android được chính Google đứng ra phát triển
trong khi LiMo hoàn toàn không có một công ty cụ thể nào đứng ra bảo trợ chính
SDK 1.0 Đây là công cụ giả lập thiết bị ảo trên máy tính để phát triển ứng dụng với các
hàm API hỗ trợ cho những người mới lập trình trên các thiết bị di động sử dụng nền tảng
Android thông qua ngôn ngữ lập trình Java,cùng theo đó là sự ra đời của android-market
nơi các lập trình viên rao bán các ứng dụng của mình , nó cũng giống như app-store của
apple
Android có lợi thế lớn so với đa số hệ điều hành dành cho di động đang phát triển
mạnh trên thị trường như osx(iphone), symbian , là nó một hệ điều hành mở và hoàn
toàn miễn phí nên các lập trình viên rất dễ dành phát triển nó và giá thành cũng rẻ hơn cả
về mặt thiết bị lẫn ứng dụng.Một điểm nữa cũng rất quan trọng đó là nó được phát triển
và hậu thuẫn mạnh từ Google và liên minh OHA
Các ứng dụng của android phát triển trên ngôn ngữ lập trình java có thể kể ra 3
• Các ứng dụng viết ra sẽ có giá thành rẻ hơn
Nhưng sử dụng ngôn ngữ java cũng có điểm bất lợi là các ứng dụng sẽ chạy chậm
hơn so ứng dụng chạy trên nên c/c++.Chính vì vậy google đã cho ra phiên bản android
NDK mới 1.5 hỗ trợ lập trình bằng ngôn ngữ là c/c++
Trang 15Hình 1 3 : Một số nền tảng lập trình di động
1.3.2 Xu hướng phát triển
Hiện tại android đang phát triển rất nhanh cả về thiết bị lẫn ứng dụng :
• Về mặt thiết bị thì từ cuối năm 2008 HTC đã tung ra sản phẩm đầu tiên chạy hệ
điều hành android có tên gọi là “ Dream ” hay còn gọi là G1 ,đến nửa đầu năm
2009 thì một số các nhà sản xuất lớn đã tung ra các sản phẩm sử dụng hệ điều
hành android như HTC-mobile, Samsung , và có một số khác đang chuẩn bị
tung ra sản phẩm của mình như Motorola…
Trang 16Hình 1.4 : HTC Dream (G1
đẩy sự phát triển của android mới đây google đã tung ra phiên bản android-sdk 1.5
thay thế cho phiên bản android-sdk 1.1 cũ với nhiều tính năng cải tiến hấp dẫn
.Ngoài ra còn tổ chức cuộc thi viết phần mềm cho android trên toàn thế giới như
giải ADC1 vào 17/3/2008 với tổng giá trị giải thưởng lên đến 10 triệu USD đã thu
hút hơn 1700 sản phẩm tham dự Số lượng sản phẩm đoạt giải chiếm khá nhiều
liên quan đến thông tin địa lý như : BreakCrumbz(tìm đường bằng hình
ảnh),Locale(ứng dụng tự động cấu hình thiết bị dựa theo vị trí tọa
lạc),piggyback(ứng dụng lên lịch lữ hành hợp đồng xe)…
Có vẻ như dịch vụ dựa trên vị trí (Location Based Service) sẽ là con át chủ bài của
Android để cạnh tranh với iPhone Khi đã có sẵn trong tay các vũ khí cực mạnh
như Google Maps, Google Earth, thì việc chiến thắng trên lĩnh vực LBS không
phải là khó đối với Android Bên cạnh đó cũng còn có nhiều dịch vụ trực tuyến
miễn phí mà google cung cấp như google docs,mail,google ladtitude
Tiếp sau đó là phiên bản android-sdk 1.6 với tên mã Donut nổi bật trong các chức
năng mới là công cụ tìm kiếm giúp người dùng điện thoại có thể tìm kiếm thông tin
trong chính máy của mình, một điểm nữa là Donut có chức năng nhận dạng chữ viết
tay của người dùng trên màn hình cảm ứng rồi chuyển thành những ký tự chuẩn nhờ
vậy việc viết tin nhắn dễ dàng hơn bao giờ hết và mới đây nhất là bản 2.0 tên mã
Eclair với nhiều sự thay đổi về mạng xã hội , giao diện , bộ sdk mới cho các nhà lập
trình Trong một vài năm tới ngoài điện thoại di động ra android còn hướng đến các
thiết bị khác nữa như netbook,laptop,PC,….Nó đều có thể thích ứng để hoạt động
Trang 17Chương II : Tổng quan các thành phần của Android
1.1 Những đặc trưng và kiến trúc của Android
1.1.1 Những đặc trưng của android
• Application framework (Nền tảng ứng dụng ): hỗ trợ sử dụng lại và thay thế các thành phần
• Dalvik virtual machine (Máy di động ảo Dalvik ): Giả lập thiết bị di động sử dụng Android
• Integrated browser (Tích hợp trình duyệt web) : cung cấp mã nguồn mở bộ phát triển trình duyệt Webkit
• Optimized graphics (Tăng tốc đồ họa ) : cung cấp các thư viện đồ họa 2D, 3D sử dụng OpenGL ES 1.0 (phụ thuộc vào thiết bị phần cứng)
• SQLite : Cấu trúc dữ liệu lưu trữ
• Media support (Hỗ trợ đa phương tiện ): Hỗ trợ phần lớn các định dạng âm thanh, hình ảnh, video phổ biến như (MPEG4, H.264, MP3, AAC, AMR, JPG, PNG, GIF)
• Công nghệ GSM – GSM Telephony (phụ thuộc nền tảng phần cứng)
• Hỗ trợ Bluetooth, EDGE, 3G, and WiFi (phụ thuộc thiết bị phần cứng)
• Hỗ trợ Camera, GPS, compass, and accelerometer (phụ thuộc thiết bị phần cứng)
thiết bị giả lập,Công cụ bắt lỗi, kiểm soát bộ nhớ và độ ổn định, và các plugin của Eclipse IDE
1.1.2 Tổng quan kiến trúc của Android
Trước tiên chúng ta sẽ xem sơ đồ các thành phần chính của android gồm : Application , Application Framework , Libraries , Android Runtime , Linux Kernel
Trang 18Hình 2.1 : Sơ đồ các thành phần chính của hệ điều hành Android
Từng thành phần chính trong cấu trúc :
• Application : android sẽ cung cấp một tập hợp của các ứng dụng lõi bao gồm emai client , chương trình SMS , lập lịch , bản đồ , trình duyệt , danh bạ và những ứng dụng khác nữa Khi nhà phát triển viết một ứng dụng dành cho Android, anh ta thực hiện các đoạn mã trong môi trường Java Sau đó, nó sẽ được biên dịch sang các bytecode của Java, tuy nhiên để thực thi được ứng dụng này trên Android thì nhà phát triển phải thực thi một công cụ có tên là dx Đây là công cụ dùng để chuyển đổi bytecode sang một dạng gọi là dex bytecode "Dex" là từ viết tắt của "Dalvik executable" đóng vai trò như cơ chế
trông giống như máy ảo Java (Java Virtual Machine) nhưng như đã đề cập ở trên Dalvik thực thi dex bytecode chứ không phải Java bytecode Hơn thế nữa giữ chúng tồn tại những điểm khác nhau về class file
• Application Framework : các lập trình viên có đầy đủ quyền truy cập các khung api sử dụng các lõi ứng dụng Kiến trúc của những ứng dụng đó được thiết kế
để đơn giản hóa việc sử sụng lại các thành phần.Bất kỳ ứng dụng nào cũng có thể khai báo những khả năng của nó và những ứng dụng khác sau đó có thể sử
Trang 19dụng lại những khả năng đó.Khi các cơ chế giống nhau thì sẽ cho phép người
sử dụng thay thế các thành phần đó
Những ứng dụng thiết lập lên những dịch vụ và hệ thống bao gồm :
9 Content Provider - cung cấp chức năng truy vấn dự liệu giữa các ứng dụng của Android
9 A Resource Manager - cung cấp chức năng truy cập tài nguyên ngoại trừ mã nguồn
9 A Notification Manager - cung cấp chức năng tùy chỉnh những cảnh báo lên màn hình ở thanh status
9 A Activity Manager - quản lý vòng đời của các ứng dụng
• Libraries :
9 System C library – Một BSD thực thi của hệ thống thư viện C chuẩn
9 Media Libraries - dựa trên chuẩn opencore của packetvideo’s, thư viện này
hỗ trợ playback và recording của những định dạng audio và video phổ biến ,có cả định dạnh những file ảnh tĩnh , bao gồm các định dạng : MPEG4, H.264, MP3, AAC, AMR, JPG, and PNG
9 Surface Manager – quản lý việc truy cập hệ thống phụ và ghép những đường nối của những lớp đồ họa 2D và 3D từ nhiều ứng dụng
9 LibWebCore – là một công cụ trình duyệt web hiện đại mà những khả năng của nó có cả trình duyệt android và web nhúng
9 SGL – công cụ đồ họa 2D nằm phía dưới
9 3D Libraries – Một sự bổ sung dựa trên OpenGL ES 1.0 APIs , thư viện này
sử dụng cả phần cứng gia tốc 3D
9 FreeType – biến đổi những font và ảnh bitmap
9 SQLite – công cụ cơ sở dữ liệu mạnh mẽ và nhẹ được dùng cho tất cả các ứng dụng
• Anroid Runtime : Android bao gồm tập hợp các thư viện lõi , nó cung cấp hầu hết các chức năng sẵn có trong ngôn ngữ java
• Linux kernel : Android dựa vào dịch vụ hệ thống nhân của phiên bản linux 2.6 như bảo mật ,quản lý bộ nhớ,quản lý quy trình ,ngăn xếp mạng và các kiểu driver.Nhân này cũng hoạt động như lớp trừu tượng giữa phần cứng và phần còn lại của ngăn xếp phần mềm
1.2 Các quy tắc cơ bản của ứng dụng trong Android
Các ứng dụng Android được viết bằng các ngôn ngữ lập trình Java Việc biên soạn
mã Java - cùng với bất kỳ dữ liệu nào và các tập tin theo yêu cầu của ứng dụng đó – được gói lại bởi công cụ appt trong gói phần mềm android, một file lưu trữ được đánh dấu bởi một file có đuôi * Apk file này là một phương tiện truyền tải cho các ứng dụng và cài đặt
nó trên các thiết bị di động, đó là file để người dùng tải về các thiết bị của họ Tất cả các
mã trong một file * Apk được coi là một trong những ứng dụng
Trang 20• Theo mặc định, tất cả các ứng dụng chạy trong xử lý Linux của riêng của nó Android bắt đầu tiến trình khi có một đoạn code của ứng dụng cần phải được thực hiện, và tiến trình tắt khi nó không còn cần thiết, và nguồn tài nguyên hệ thống được yêu cầu cho các ứng dụng khác
• Mỗi tiến trình riêng của chúng có máy ảo Java (VM) riêng, do đó, các đoạn code ứng dụng chạy tách biệt khỏi các code của tất cả các ứng dụng khác
• Theo mặc định, mỗi ứng dụng đều được cấp một User ID Linux duy nhất Quyền được thiết lập để cho các file của ứng dụng chỉ được nhìn thấy bởi user
đó
Có thể sắp xếp cho hai ứng dụng để chia sẻ cùng một ID người dùng, trong đó có trường hợp họ sẽ có thể xem các file của nhau Để bảo tồn nguồn tài nguyên hệ thống, các ứng dụng có cùng ID cũng có thể sắp xếp để chạy trong cùng một tiến trình Linux, chia sẻ cùng một VM
1.2.1 Khái quát các thành phần ứng dụng của android
Một trong những đặc trưng chính của android là một ứng dụng có thể sử dụng các thành phần của những ứng dụng khác Ví dụ, nếu nhu cầu ứng dụng của bạn để hiển thị một danh sách các di chuyển hình ảnh và các ứng dụng khác đã phát triển một thanh cuộn phù hợp và đã tạo cho nó có sẵn sàng đối với những người khác, bạn có thể gọi thanh cuộn để làm công việc, thay vì bạn phải tự phát triển của riêng bạn.Các đoạn code của bạn không kết hợp các đoạn code của các ứng dụng khác hoặc liên kết đến nó, thay vào đó, nó đơn giản chỉ khởi động các đoạn code của các ứng dụng khác khi cần sử dụng
Để làm việc này, hệ thống phải có khả năng bắt đầu tiến trình ứng dụng khi bất kỳ phần nào của nó cần sử dụng, và khởi tạo các đối tượng Java cho phần đó Vì vậy, không giống như các ứng dụng trên hầu hết các hệ thống khác, các ứng dụng Android không có một mục nhập cho tất cả mọi thứ trong các ứng dụng (không có hàm main()) Thay vào
đó, chúng có thành phần chủ yếu là hệ thống có thể khởi tạo và chạy khi cần thiết Có bốn loại thành phần:
• Activities(android.app.Activity) - đây là lớp khỏi tạo giao diện ứng dụng nội bộ trên nên Android tương tư như MIDlet trong J2ME.Một hoạt động thể hiện một hình ảnh giao diện người dùng cho một sự cố gắng tập trung để người sử dụng
có thể thực hiện Ví dụ, một activitiy có thể trình bày một danh sách các mục để người dùng có thể lựa chọn hoặc nó có thể hiển thị hình ảnh cùng với các chú thich Một tin nhắn văn bản ứng dụng có thể có một activity hiển thị một danh sách các địa chỉ liên lạc để gửi tin nhắn đến một activity thứ hai để viết tin nhắn này ứng với các địa chỉ liên lạc, và các activity khác để xem xét lại các tin nhắn
cũ hoặc thay đổi cài đặt Mặc dù chúng làm việc cùng nhau để tạo thành một giao diện người dùng liền nhau nhưng mỗi activity độc lập với những activity khác Mỗi activity đều triển khai thực hiện như là một lớp phụ của lớp activity
cơ bản
Trang 21• Service(android.app.Service): cung cấp các dịch vụ liên quan đến client/service Một Service sẽ chạy ngầm bên dưới, sau đó các client (Activity)
sẽ kết nối và truy xuất các hàm trên dịch thông qua Interface class.Một service không có trực quan giao diện người sử dụng nhưng sẽ chạy ngầm trong nền của giao diện người dùng đó
• Broadcast receiver (android.content.BroadcastReceiver): đây là một ứng dụng chạy ngầm dùng để dọc và cập nhật thông tin trên UI, vi dụ như cập nhật sự thay đỗi giờ, pin
Một cái máy thu broadcast sẽ nhận và phản hồi lại những thông báo broadcast Có rất nhiều broadcast bắt nguồn từ code hệ thống như broadcast thông báo thay đổi múi giờ, pin thấp …
• Content Provider : cung cấp chức năng truy vấn dự liệu giữa các ứng dụng của Android.Một content provider chỉ dẫn thiết lập cở sở dữ liệu của một ứng dụng sẵn sàng cho các ứng dụng khác.dữ liệu này có thể được lưu trong file hệ thống trong database của SQLite Bất cứ khi nào có một yêu cầu cần được xử lý bởi một thành phần, Android bảo đảm rằng các tiến trình ứng dụng của các thành phần sẽ được chạy, nó bắt đầu nếu cần thiết và luôn giữ cho các thành phần đó sẵn sằng
Thành phần kích hoạt – intents : Các content provider được kích hoạt khi được
một yêu cầu từ một ContentResolver Ba thành phần khác là activities,broadcast
và receivers được kích hoạt bởi thông báo không đồng bộ gọi từ intents Một intent là một đối tượng mà nó giữ những nội dung của thông báo Đối với các activity và service, đòi hỏi tên của chúng và những chỉ dẫn URI của dữ liệu để thực hiện theo Ví dụ, nó có thể truyền tải một yêu cầu cho một activity trình bày một hình ảnh cho người sử dụng hoặc cho phép người dùng chỉnh sửa một số văn bản Đối với các máy thu broadcast , các tên của đối tượng Intent đang hoạt động sẽ được công bố Ví dụ, nó có thể thông báo cho ai quan tâm rằng các máy ảnh đã được bấm nút
Có Những phương thức riêng cho từng kiểu thành phần kích hoạt :
• Một activity là đã được phát động thông qua một đối tượng intent là Context.startActivity() hoặc Activity.startActivityForResult.Những đáp ứng của activity có thể được quan sát từ những intent đầu mà nó có thể được gọi bởi phương thức getIntent().Android gọi các phương thức getIntent() của activity
để chuyển qua bất kỳ intent kế tiếp nào
Một activity thường bắt đầu cái kế tiếp nó.Nếu cái kết quả mong muốn được gửi trả lại từ hành động bắt đầu của nó, nó sẽ gọi startActivityForResult() thay
vì startActivity().Ví dụ nếu nó bắt đầu một activity cho phép người dùng lựa chọn một hình ảnh,nó có thể mong đợi kết quả được trả lại là những hình ảnh
Trang 22đã chọn.Kết quả được trả lại là một đối tượng intent mà nó thông qua đó để gọi
phương thức onActivityResult() của activity
• Một service được bắt đầu thông qua đối tượng Content.startService() Android
gọi phương thức onStart() của service và chuyển nó qua một đối tượng intent
• Một ứng dụng có thể khởi động broadcast bằng một đối tượng intent thông qua
các phương thức như :
Context.sendBroadcast(),Context.sendOrderedBroadcast() và Context.sendStickyBroadcast ở trong bất kỳ biến nào của chúng.Android
cung cấp intent đó tới tất cả các broadcast nhận được mà chúng quan tâm bằng cách gọi phương thức onReceive()
Tắt các thành phần : Một content provider đang hoạt động trong khi đó chỉ đáp
ứng 1 yêu cầu từ 1 ContentResolver , một broadcast nhận kích hoạt chỉ khi đáp
ứng một thông báo broadcast khác Như vậy rõ ràng ta không cần tắt các thành
phần này
Android có các phương thức để tắt các dịch vụ và các hoạt động trong một cách
trật tự :
• Một activity có thể tắt bằng cách gọi phương thức finish() của nó.Một trong
những activity có thể tắt các activity khác (nó bắt đầu với
startActivityForResult()) là finishActivity()
• Một service có thể được ngừng lại khi gọi phương thức stopSelf() của nó hoặc
gọi Context.stopService()
Các thành phần có thể được tắt bởi hệ thống khi chúng không còn sử dụng hoặc
khi android cần tái thiết bộ nhớ để có thêm những hoạt động khác
File Manifest : Trước khi android có thể khởi động ứng dụng nó phải biết các
thành phần đang có trong ứng dụng, vì vậy ứng dụng sẽ khai báo các thành phần
đó trong file Manifest hiện có của gói vào trong gói ứng dụng android , file apk
lưu giữ các đoạn code, tài nguyên, tập tin của ứng dụng
File manifest có cấu trúc là một file xml luôn được đặt tên là AndroidManifest.xml
cho tất cả các ứng dụng Trong việc khai báo các thành phần , khi đặt tên bất kỳ
một thư viện nào của ứng dụng phải dựa vào liên kết đó(bên cạch thư viện android
mặc định) và xác định quyền truy cập bất kỳ ứng dụng nào dự kiến được cấp phép
Nhiệm vụ chính của file manifest là thông báo các thành phần của ứng dụng
android
Ví dụ một activity có thể được khai báo như sau :
<?xml version="1.0" encoding="utf-8"?>
<manifest >
Trang 23Các thành phần khác được khai báo một cách tương tự như : <service> cho các phần tử của service , <receive> cho các phần tử của broadcast receivers và
<provider> cho các phần tử của content provider Activities, Services, Content Providers nếu chúng không được khai báo trong manifest thì sẽ không hiện trong
hệ thống và không bao giờ được chạy.Tuy nhiên đối với broadcast receivers có thể được khai báo trong manifest hoặc cũng có thể được tạo ra trong đoạn code tự động(như đối tượng broadcast receivers) và đăng ký với hệ thống bằng cách gọi Context.registerReceiver()
Intent Filters(Các bộ lọc Intent) : Một đối tượng intent nếu có thể nhắm rõ ràng
tên của một thành phần android sẽ tìm thành phần đó(dựa trên việc khai báo trong file manifest) và kích hoạt nó còn nếu không thì android phải định vị một thành phần tốt nhất có thể đáp ứng cho đối tượng intent đó,bằng cách so sánh các đối tượng intent vào các mục tiêu tiềm năng của các bộ lọc intent Dưới đây là một mở rộng của các ví dụ trước đó cho biết thêm về intent filters :
<intent-filter >
<action android:name="com.example.project.BOUNCE" />
<data android:type="image/jpeg" />
Trang 24cả hai hoạt động trong cùng một task
Mỗi task là một stack của các activity, không phải là lớp hay các phần tử trong file manifest, như vậy không có cách nào thiết lập giá trị cho các task độc lập của các activity
đó
Các hành vi được mô tả là chỉ cần mặc định các hành vi cho activity và task Nhưng sẽ còn có nhiều cách để sửa đổi hầu hết tất cả mọi khía cạnh của nó Sự kết hợp các activity với task, và các hành vi của một activity trong một task, được kiểm soát bởi
sự tương tác giữa các thiết lập cờ trong đối tượng intent để bắt đầu các activity và các thuộc tính thiết lập trong activity của các phần tử của <activity> trong file manifest
Trang 25allowTaskReparenting clearTaskOnLaunch alwaysRetainTaskState finishOnTaskLaunch
Affinities and new tasks : Theo mặc định tất cả các activity trong ứng dụng đều
có một affinity khác nhau cho mỗi activity
Các chế độ khởi động : Có 4 chế độ khởi động trong đó chế độ standard là chế độ
Làm sạch stack : Nếu người dùng bỏ task trong một thời gian dài hệ thống sẽ làm
sạch task đó trong tất cả các activity trừ activity gốc.Ý tưởng này là sau một thời gian người dùng có khả năng bỏ di những gì đã và đang làm trước khi trở về công việc nào đó để bắt đầu mới Có vài thuộc tính của activity mà có thể được sử dụng
để điều khiển hành vi và sửa đổi nó :
Thuộc tính alwaysRetainTaskState – Nếu thuộc tính này thiết lập là “true”ở gốc activity của một task , mặc định mô tả các hành vi không xảy ra.Task giữ lại tất cả các activity trong stack của nó thậm chí sau một thời gian dài
Thuộc tính clearTaskOnLaunch - Nếu thuộc tính này thiết lập là “true”ở gốc activity của một task ,stack này được xóa xuống activity gốc.Đây là cực đối lập của alwaysRetainTaskState Người dùng luôn trở về trạng thái ban đầu của task thậm chí sau một sự vắng mặt tức thời
Thuộc tính finishOnTaskLaunch – giống như clearTaskOnLaunch nhưng nó vận hành trên một activity đơn , không phải là một task toàn vẹn và nó có thể làm cho bất kỳ một activity nào rời khỏi stack bao gồm cả activity gốc Khi thiết lập là
“true”,activity này vẫn còn một phần của task đó cho phiên hiện tại.Nếu người dùng bỏ nó đi và sau đó trở lại task đó, thì thuộc tính này ko còn hiện hữu
Sự bắt đầu các task : Một activity được thiết lập như là một mục điểm cho một
task bằng cách cho nó một intent filter với "android.intent.action.MAIN" được xác định như là hành động và "android.intent.category.LAUNCHER" như là xác định loại
Khả năng thứ 2 rất quan trọng : người dùng phải có khả năng bỏ lại một task và sau đó trở lại sau Vì lý do này, hai chế độ khởi động luôn luôn đánh dấu
Trang 26các activity như là khởi đầu một task, "singleTask" và "singleInstance",chỉ nên sử
ra nếu thiếu filter là: Một Intent khởi động một "singleTask" activity, bắt đầu một task mới, và người sử dụng dành một chút thời gian làm việc với task đó Người sử dụng sau đó bấm phím HOME Task được sắp xếp phía sau và bị làm mờ đi trên màn hình
Một khó khăn tương tự chú ý ở cờ FLAG_ACTIVITY_NEW_TASK Nếu
cờ này làm cho một activity bắt đầu một task mới và người sử dụng bấm phím HOME để bỏ lại nó, phải có một số cách thức cho người sử dụng để định hướng trở lại cho nó một lần nữa Một số đơn vị (chẳng hạn như người quản lý thông báo) luôn luôn bắt đầu các activity ở một task bên ngoài, chúng luôn luôn đặt FLAG_ACTIVITY_NEW_TASK trong các intent mà để chuyển vào startActivity () Nếu bạn có một activity có thể kéo theo được của một thực thể bên ngoài mà có thể sử dụng cờ này
Đối với những trường hợp bạn không muốn người sử dụng có thể quay trở lại một hoạt động, thiết lập các phần tử <activity> của finishOnTaskLaunch là
"true"thì sẽ xóa sạch các stack trước đó
1.2.3 Processes và threads
Khi các thành phần một chức năng ứng dụng chạy lần đầu tiên, Android bắt đầu một tiến trình Linux cho nó với một thread đơn Mặc định, tất cả các thành phần của ứng dụng chạy trong process và thread
Tuy nhiên, chúng ta có thể sắp xếp cho các chức năng chạy trong các tiến trình khác đi, và có thể sinh ra thêm các thread cho bất kỳ tiến trình nào
Processes
Tiến trình chứa các thành phần chạy được điều khiển bởi các tập tin rõ ràng Thành phần-<activity>, <servive>,<receiver> và <provider> mỗi thành phần có một thuộc tính tiến trình có thể chỉ định một thành phần đang chạy Các thuộc tính này có thể thiết lập để mỗi thành phần chạy trong tiến trình của chính nó, hoặc một vài thành phần chia sẻ một tiến trình trong khi các thành phần khác thì không chúng cũng có thể được thiết lập các thành phần của các ứng dụng các chạy trong cùng một tiến trình-cung cấp ứng dụng chia sẻ Linux user ID giống nhau và được thiết kế bởi cùng tác giả Thành phần <application> cũng có tiến trình đặc trưng, cho cài đặt giá trị mặc định chấp nhận tất cả các thành phần
Android có thể quyết định tắt tiến trình tại một số điểm , khi bộ nhớ bị chậm
và yêu cầu các tiến trình khác Các thành phần ứng dụng đang chạy trong tiến trình bị hủy Một quá trình được khởi động lại cho những thành phần làm việc lại một lần nữa
Khi quyết định chấm dứt tiến trình, Android có ảnh hưởng tương đối quan trọng cho người dùng Ví dụ, nó sẵn sàng shut down một process với các hoạt động
Trang 27mà không còn nhìn thấy trên màn hình hơn một tiến trình với các hoạt động nhìn thấy được Quyết định có hoặc không chấm dứt một tiến trình, do đó, phụ thuộc vào các thành phần hoạt động trong quá trình
Threads
Mặc dù bạn có thể hạn chế ứng dụng trong một tiến trình, sẽ có điều tương
tự khi cần sinh ra thread để sử dụng Bất cứ điều gì không hoàn thành nhanh chóng
sẽ được đưa vào một thread khác
Thread được tạo ra trong code sử dụng chuẩn dự án Java Thread Android cung cấp một sô lượng các lớp để quản lý thread-Looper cho chạy lặp vòng thông điệp bên trong một thread, Handler xử lý tin nhắn và lớp HandlerThread để thiết lập thread với một thông điệp lặp vòng
Trang 28
Hình 2.2 : Sơ đồ lớp IBinder
Bên trong các lớp có tất cả các mã số cần thiết để quản lý từ xa thủ tục các cuộc gọi cho các interface với các IDL Cả hai bên ,trong các lớp thực thi của IBinder interface Một trong số đó được sử dụng ở cục bộ và bên trong của hệ thống; code bạn viết có thể bỏ qua nó Một cái khác, được gọi là stub, mở rộng lớp Binder Ngoài việc code bên trong của IPC effectuating các cuộc gọi, nó chứa các khai báo cho các phương thức trong interface rpc bạn khai báo Bạn sẽ cho lớp phụ stub thực thi những phương thức đó, như được chỉ ra trong biểu đồ
Thông thường, quá trình ở xa sẽ được quản lý bởi một dịch vụ (vì một dịch
vụ có thể thông báo cho hệ thống về quá trình và các kết nối vào các quá trình khác) Nó sẽ có cả hai giao diện tập tin được tạo ra bởi các công cụ aidl và lớp phụ stub triển khai thực hiện các phương pháp rpc Khách hàng của các dịch vụ sẽ chỉ
có file giao diện được tạo ra bởi các công cụ aidl
Thiết lập một kết nối giữa một service và clients của service đó: clients sẽ thực thi phương thức onServiceConnected() and onServiceDisconnected vì thế chúng có thể được thông báo khi kết nối thành công tới remote service được thiết lập và khi nó bỏ qua Chúng sau đó sẽ gọi bindService() để thiết lập kết nối
Phương thức onBind() của service đó sẽ thực thi chấp nhận hoặc loại bỏ, phụ thuộc vào intent nó nhận được (các intent được chuyển tới bindService()).Nếu kết nối này được chấp nhận , nó sẽ trả về trường hợp của lớp phụ stub
Trang 29trong một đối tương IBinder bắt đầu trong cùng một tiến trình như là IBinder, các phương thức được thực hiện tại thread người gọi Tuy nhiên, khi nguồn gốc các cuộc gọi khác trong tiến trình khác, các phương thức được thực hiện trong một chuỗi lựa chọn từ một dải thread mà Android duy trì trong cùng một quá trình như
là IBinder; nó không phải thực hiện trong thread chính của tiến trình Từ các dịch
vụ có thể có nhiều hơn một khách hàng, nhiều hơn một dải thread có thể tham gia vào cùng một phương thức IBinder cùng một lúc.Do đó, được triển khai để được thread safe
Tương tự, một nhà cung cấp nội dung có thể nhận được dữ liệu yêu cầu đó bắt nguồn trong tiến trình khác Mặc dù ContentResolver và các lớp ContentProvider ẩn chi tiết về cách thức quản lý truyền thông liên quá trình như thế nào,phương thức ContentProvider đáp ứng những yêu cầu - các phương thức truy vấn (), chèn (), xóa (), cập nhật (), và getType () - được gọi là từ một dải thread trong nội dung của nhà cung cấp tiến trình, không phải thread chính của tiến trình Từ những phương thức này có thể được gọi là từ bất kỳ thread nào cùng một lúc, chúng cũng phải được triển khai để thực hiện được safe thread
1.2.4 Vòng đời của android
Các thành phần ứng dụng có một lifecycle - bắt đầu khi Android khởi tạo chúng để đáp ứng intents thông qua một kết thúc khi các trường được tiêu huỷ Đôi khi chúng có thể được hoạt động , không hoạt động hoặc trong trường hợp các hoạt động hiển thị cho người sử dụng hoặc vô hình Phần này bàn về các lifecycle , các activity, service, broadcast receiver – bao gồm cả trạng thái có thể xảy ra ở trong khoảng thời gian hoạt động của chúng, các phương pháp thông báo cho bạn về chuyển tiếp giữa các trạng thái
và hiệu ứng của các trạng thái đó , về khả năng dẫn xử lý ,chúng có thể được chấm dứt và tiêu huỷ
Activity lifecycle
Một activity có 3 trạng thái cơ bản sau :
• Trạng thái hoạt động khi nó được kích hoạt hoặc ở mặt trước màn hình(ở top của stack hiện tại) Đó là activity trọng tâm của các hành động người dùng
• Trạng thái tạm dừng nếu nó mất trọng tâm nhưng vẫn hiển thị user Đó
là activity khác đánh lừa phía trên của nó và activity không bao trùm toàn bộ màn hình, do đó, một số bị tạm dừng activity có thể hiển thị thông qua Một activity tạm dừng là hoàn toàn còn sống (nó duy trì tất
cả các trạng thái, các thông tin và vẫn gắn với cửa sổ quản lý), nhưng có thể bị tắt bởi hệ thống trong tình huống bộ nhớ xuống cực thấp
• Trạng thái ngừng lại nếu như nó hoàn toàn bị che mờ bởi các activity khác Nó vẫn còn giữ lại tất cả các trạng thái và các bộ phận thông tin Tuy nhiên, nó không còn hiển thị cho người dùng, do đó các cửa sổ bị ẩn
và nó sẽ thường bị tắt bởi bộ nhớ hệ thống khi cần sử dụng ở nơi khác
Trang 30Nếu một activity dừng tạm thời hoặc dừng hẳn, hệ thống có thể ngắt nó ra
từ bộ nhớ hoặc yêu cầu nó kết thúc (gọi phương thức finish ()) Khi nó hiển thị một lần nữa cho user, nó phải hoàn toàn khởi động lại và phục hồi lại trạng thái cũ
Một activity chuyển từ trạng thái này sang trạng thái khác, nó sẽ được thay đổi bằng cách gọi các phương thức được bảo vệ ở dưới :
void onCreate(Bundle savedInstanceState)
void onStart() void onRestart() void onResume() void onPause() void onStop() void onDestroy() Tất cả các phương thức này giúp bạn có thể ghi đè lên để làm công việc thích hợp khi có sự thay đổi Tât cả các hoạt động phải triển khai onCreate() để thiết lập khởi tạo khi đối tượng khởi tạo lần đầu tiên Cũng có thể triển khai onPause() để trao đổi dữ kiệu thay đổi và mặc khác chuẩn bị ngừng tương tác với user
7 phương thức dưới đây định nghĩa toàn bộ lifecycle của một activity Có ba vòng lặp lồng nhau mà bạn có thể giám sát thực hiện chung :
• Toàn bộ thời gian sống của một activity sẽ xảy ra giữa lần gọi đầu tiên gọi đến onCreate () cho đến một lần gọi kết thúc gọi đến onDestroy () Một hoạt động thực hiện tất cả các thiết lập ban đầu của trạng thái "Global" trong onCreate (), và giải thoát tất cả các tài nguyên trong onDestroy () Ví dụ, nếu nó có một thread chạy phía sau để tải dữ liệu từ mạng, nó có thể tạo ra thread trong onCreate () và sau đó ngừng trong onDestroy ()
• Thời gian sống thấy được của một activity sẽ xảy ra giữa một cuộc gọi đến onStart () tương ứng cho đến khi một cuộc gọi đến onStop () Trong thời gian này, người sử dụng có thể xem các hoạt động trên màn hình, tuy nhiên
nó có thể không được trong foreground và tương tác với người sử dụng Giữa hai phương pháp này, bạn có thể duy trì được các tài nguyên cần thiết
để hiển thị các hoạt động cho người dùng Ví dụ, bạn có thể đăng ký một BroadcastReceiver trong onStart () để giám sát các thay đổi mà tác động của
UI, và unregister nó trong onStop () khi người sử dụng có thể không còn nhìn thấy những gì bạn đang hiển thị Các phương thức onStart() và onStop
Trang 31() có thể được gọi nhiều lần, như là hoạt động luân phiên giữa hiện và ẩn với người sử dụng
• Các foreground lifetime của một activity sẽ xảy ra giữa một cuộc gọi đến onResume () tương ứng cho đến khi một cuộc gọi đến onPause () Trong thời gian này, hoạt động này là ở phía trước của tất cả các hoạt động khác trên màn hình và có tương tác với người sử dụng Một hoạt động thường xuyên có thể chuyển đổi giữa resume và pause - ví dụ, onPause () được gọi
là khi thiết bị đi vào trạng thái ngủ hoặc khi một activity mới được bắt đầu, onResume () khi activity result hoặc một intent mới được sinh ra Vì vậy, code trong hai phương thức này khá nhẹ
Dưới đây là những biểu đồ minh họa các lặp vòng và các đường dẫn một activity có thể mất giữa các trạng thái Các hình ovals lớn là trạng thái chính
mà activity có thể xảy ra, hình chữ nhật vuông góc đại diện cho gọi các phương thức phản hồi có thể triển khai để thực hiện khi các activity chuyển giữa các trạng thái
Trang 32ycle của
Trang 33Phương Thức Mô Tả Tắt? Kế Tiếp
tác cơ bản — tạo views,kết nối dữliệu tới danh sách.Phương thức này được chuyển qua cho gói đối tượng của trạng thái activity trước
đó, nếu trạng thái đó được nắm bắt thì (xem Saving Activity State, )
Luôn được onStart theo sau
onRestart()
Được gọi khi ứng dụng chuyển sang onStop(), nhưng muốn khởi động lại bằng onStart
Luôn được theo sau bởi onStart()
No onStart()
onStart() hàm này được gọi khi lớp ứng
onResume()
or onStop()
onResume() Được gọi sau khi onStart() hoặc
Yes
onResume()
or onStop()
Được theo bởi onDestroy() nếu activity này bỏ đi
Yes
onRestart()
or onDestroy()
onDestroy()
hàm được gọi trước khi ứng dụng thoát bằng việc gọi hàm Activity.Finish()
Được gọi trước khi activity nào đó
bị hủy Đây là lời gọi cuối cùng
mà activity nhận được Nó có thểđược gọi cả hai khi activity kết thúc hoặc vì hệ thống tạm thời bịhủy bỏ ,trường hợp này activity cất giữ không gian.Bạn có thể phân
Yes nothing
Trang 34Phương Thức Mô Tả Tắt? Kế Tiếp
biệt giữa hai kịch bản với phương thức isFinishing()
Lưu ý cột Tắt? trong bảng ở trên Nó cho biết có hay không hệ thống có thể tắt tiến
trình lưu trữ các activity bất cứ lúc nào sau khi phương thức trả về, mà không cần thực hiện những dòng khác của code activity Ba phương thức (onPause (), onStop (), và onDestroy ()) được đánh dấu "Yes" Bởi vì onPause () là đầu tiên của ba phương thức, đó chỉ là một bảo đảm được gọi khi tiến trình này bị tắt - onStop () và onDestroy () có thể không Vì thế, nên sử dụng onPause () để viết dữ liệu (chẳng hạn như người sử dụng sửa đổi) để lưu trữ
Phương thức được đánh dấu "NO" trong cột Tắt? bảo vệ quá trình lưu trữ các
activity không bị tắt kể từ thời điểm chúng được gọi
Một activity mà không dùng kỹ thuật "tắt" theo định nghĩa này có thể vẫn được tắt bởi hệ thống - nhưng có thể sẽ chỉ xảy ra trong hoàn cảnh khó khăn khi không có tài nguyên khác
Saving activity state(Cất giữ trạng thái activity)
Khi hệ thống chứ không phải là người sử dụng shut down một activity để bảo tồn
bộ nhớ, người sử dụng mong đợi trả về activity và tìm thấy nó trong các trạng thái trước
Để nắm bắt trạng thái trước khi activity này bị tắt, bạn có thể thực hiện một phương thức onSaveInstanceState () cho các hoạt động Android gọi phương thức này trước khi thực hiện các activity dễ bị tổn thương do bị tiêu huỷ - có nghĩa là, trước khi onPause() được gọi Nó chuyển qua phương thức đối tượng Bundle mà ở đó bạn có thể ghi lại trạng thái chức năng của hoạt động như là những cặp giá trị tên Khi bắt đầu hoạt động lại một lần nữa, Bundle chuyển qua cả hai đến onCreate () và tới một phương thức được gọi sau onStart (), onRestoreInstanceState (), để cho một hoặc cả hai trong số chúng
có thể tái tạo lại trạng thái
Không giống như onPause () và các phương thức thảo luận trước, onSaveInstanceState () và onRestoreInstanceState () không phải là phương thức lifecycle
Nó không phải luôn luôn được gọi Ví dụ, các cuộc gọi Android onSaveInstanceState () trước khi hoạt động trở nên dễ bị tổn thương do bị tiêu diệt bởi hệ thống, nhưng không được gọi khi thực sự bị tiêu diệt bởi hành động người sử dụng (như là nhấn phím BACK) Trong trường hợp đó, người sử dụng sẽ không mong đợi để trở lại hoạt động, do đó, không có lý do chính đáng để lưu các trạng thái
Bởi vì onSaveInstanceState () không phải lúc nào cũng được gọi, bạn nên sử dụng
nó chỉ để ghi lại các trạng thái tạm thời của các hoạt động, không phải lưu dữ liệu Sử dụng onPause () cho mục đích thay thế
Coordinating activities(Phối hợp các activity)
Khi một activity bắt đầu một trong những activity khác Một cái tạm ngừng và có thể dừng lại, trong khi một cái khác khởi động Thỉnh thoảng, bạn có thể cần phải phối hợp các activity này, với activity khác
Thứ tự của lifecycle :
1 Các activity hiện tại của phương thức onPause () được gọi
Trang 352 Tiếp theo, bắt đầu các activity của onCreate (), onStart (), và onResume () được gọi là phương thức trong chuỗi
3 Sau đó, nếu như bắt đầu activity không còn nhìn thấy trên màn hình, các phương thức onStop () được gọi
Service lifecycle
Một dịch vụ có thể được sử dụng trong hai cách sau:
• Có thể bắt đầu và được cho phép để chạy cho đến khi một ai đó dừng nó lại hoặc tự nó dừng lại Trong chế độ này, nó bắt đầu bằng cách gọi Context.startService () và dừng lại bằng cách gọi Context.stopService () Nó có
Service.stopSelfResult () Chỉ có gọi stopService() là để ngăn chặn dịch vụ này, bất kể có bao nhiêu lần startService () đã được gọi
• Nó có thể được lập trình vận hành bằng cách sử dụng một interface mà nó định nghĩa Client thiết lập một kết nối cho các đối tượng Dịch vụ và sử dụng để kết nối cuộc gọi vào các dịch vụ Kết nối được thiết lập bằng cách gọi Context.bindService(), và được đóng lại bằng cách gọi Context.unbindService () Nhiều client có thể ràng buộc vào cùng một dịch vụ Nếu các dịch vụ chưa được đưa ra, bindService() có thể tùy chọn khởi chạy nó
Hai chế độ không hoàn toàn riêng biệt Bạn có thể kết nối vào một dịch vụ được bắt đầu với startService() Ví dụ, một dịch vụ âm nhạc có thể được bắt đầu bằng cách gọi startService() với một đối tượng nhận dạng âm nhạc để chơi Chỉ sau này, có thể là khi người dùng muốn thực hiện một số kiểm soát đối với máy nghe nhạc hoặc nhận được thông tin về các bài hát hiện nay, một hoạt động thiết lập một kết nối vào dịch vụ bằng cách gọi bindService() Trong trường hợp như thế này, stopService() sẽ không thực sự ngưng các dịch vụ cho đến khi các ràng buộc cuối cùng được đóng lại
Giống như một activity, một service có phương thức lifecycle có thể triển khai việc giám sát các thay đổi các trạng thái Nhưng nó đang có ít hơn các phương thức hoạt động - chỉ có ba - và chúng là public, không được bảo vệ:
void onCreate()
void onStart(Intent intent)
void onDestroy() Bằng cách triển khai các phương thức này, ban có thể giám sát 2 vòng lặp lồng nhau của lifetime hệ thống:
• Entire lifetime(toàn bộ thời gian sống) của một dịch vụ sẽ xảy ra giữa thời gian onCreate () được gọi và thời gian onDestroy() trả về Giống như một activity, một dịch vụ thiết lập ban đầu trong onCreate (), và phát hành tất cả tài nguyên còn lại trong onDestroy () Ví dụ, một dịch vụ nghe nhạc có thể tạo ra các thread, nơi âm nhạc sẽ được phát trong onCreate (), và sau đó ngừng bài trong onDestroy ()
Trang 36• Active lifetime(thời gian hoạt động thực sự) của một dịch vụ bắt đầu với gọi đến onStart () Phương thức này là tổ chức ý định các đối tượng đã được thông qua đển startService () Các dịch vụ âm nhạc sẽ mở ý định để khám phá âm nhạc đó để chơi, và bắt đầu phát
Không có giá trị tương đương khi gọi các dịch vụ ngừng - không có phương thức onStop ().Phương thức onCreate () và onDestroy () được gọi cho tất cả các dịch vụ, cho dù nó đang bắt đầu bởi Context.startService () hoặc Context.bindService () Tuy nhiên, onStart () được gọi là chỉ cho các dịch vụ bắt đầu của startService ().Nếu một dịch vụ cho phép những người khác ràng buộc vào nó, có thêm các phương thức gọi cho nó, để thực hiện:
IBinder onBind (Intent Intent) boolean onUnbind (Intent Intent) void onRebind (Intent Intent) Dưới đây là những biểu đồ minh hoạ việc gọi các phương thức cho một dịch
vụ Mặc dù, nó tương tự dịch vụ được tạo ra thông qua startService từ những dịch
vụ được tạo ra bởi bindService (), hãy ghi nhớ rằng bất cứ dịch vụ, không có vấn
đề như nó đã bắt đầu, có thể cho phép khách hàng có tiềm năng ràng buộc vào nó,
do đó, bất cứ dịch vụ nào đều có thể nhận được onBind () và onUnbind () gọi
Trang 37dcast nhận đeceive(Contthông điệp
đi chuyển qvity chỉ khi vity
trình với mộtrình khôngnhớ nó tiêu ttrình bày m
ó, nên đượcành phần k
u đó trở về,ộng (trừ khi
nó được th
ột kích hoạ
g hoạt độngthụ là cần thmột vấn đề k
c thực hiệnkhác của int, toàn bộ qucác thành p
đời của serv
ng thức cuộ
ntext, Intent
t đến với n
ng intent cóhực hiện ph
t broadcast
g có thể tắthiết đối vớikhi trả lời m
n trong một terface ngư
uá trình, baophần ứng d
t receiver đưcác thành p
i của tiến trmột thông bthread riênười dùng ch
o gồm các dụng đang h
tMsg)
n, Android thông điệp
này Khi onược bảo vệ phần của hrình khác
báo broadca
ng biệt, cáchạy Nếu onthread mớihoạt động tr
d gọi phươnbroadcast rnReceive ()
khỏi bị tắt
hệ thống vào
ast thì thời g
ch xa nhữngnReceive ()
i, để được prong tiến trì
ng thức receiver ) trả lại,
Nhưng
o bất kỳ
gian vẫn
g thread ) sinh ra phán xét ình), đặt
Trang 38nó trong nguy cơ bị tắt Các giải pháp cho vấn đề này là dành cho onReceive ()bắt đầu một dịch vụ và để cho các dịch vụ làm công việc, do đó, hệ thống biết rằng vẫn còn hoạt động, công việc đang được thực hiện trong tiến trình
Processes và lifecycles
Các hệ thống Android cố gắng duy trì một tiến trình ứng dụng càng lâu càng tốt, nhưng cuối cùng, nó sẽ cần phải loại bỏ các tiến trình cũ khi chạy bộ nhớ thấp Để xác định các tiến trình để giữ và để tắt, Android ,nơi mỗi một tiến trình ở trong một
“inportance hierachi” dựa trên các thành phần hoạt động trong nó, và trạng thái của những thành phần Các tiến trình với tầm quan trọng thấp nhất là loại bỏ đầu tiên, sau đó các phần kế tiếp, và trên cùng Có năm cấp độ trong hệ thống Dưới đây là những danh sách trình bày chúng theo thứ tự tầm quan trọng:
1 Một tiến trình foreground là một trong những quá trình đó là những gì cần thiết cho người sử dụng hiện nay đang làm Một quá trình được coi trong foreground nếu có bất kỳ các điều kiện sau đây :
• Đó là một activity đang chạy mà người sử dụng tương tác được với nó(các hoạt động của đối tượng phương thức onResume () được gọi)
• Nó lưu trữ một dịch vụ ràng buộc với các activity tương tác với người sử dụng
• Nó có một đối tượng dịch vụ thực hiện một trong các lifetime callbacks (onCreate (), onStart (), hoặc onDestroy ())
• Nó có một đối tượng BroadcastReceiver thực hiện các phương thức onReceive ()
Chỉ có một vài tiến trình foreground sẽ tồn tại ở bất kỳ thời điểm nào Nó bị tắt chỉ
là một cách cuối cùng – nếu bộ nhớ thấp nó không thể tiếp tục chạy tất cả Thông thường,
ở đó, đã đạt đến một trạng thái phân mảnh bộ nhớ , để tắt một số tiến trình foreground cần thiết để giữ cho người dùng giao diện đáp ứng
2 Tiến trình visible là một trong những tiến trình mà không có bất kỳ foreground thành phần, nhưng vẫn còn có thể ảnh hưởng đến những gì người dùng thấy trên màn hình Một quá trình được coi là nhìn thấy nếu một trong các điều kiện sau đây có:
• Lưu trữ một activity mà không có trong foreground, nhưng vẫn còn hiển thị cho người sử dụng (các onPause () đã được gọi là phương thức) Điều này có thể xảy ra, ví dụ, nếu các hoạt động foreground là một hộp thoại mà cho phép các hoạt động trước đó để được nhìn thấy đằng sau nó
• Lưu trữ một dịch vụ bị ràng buộc vào một hoạt động nhìn thấy được
tiến trình Visible được xem là vô cùng quan trọng và sẽ không bị tắt, trừ khi làm như vậy là cần thiết để giữ tất cả các tiến trình foreground chạy
3 Tiến trình Service là một trong những dịch vụ hoạt động được bắt đầu với phương thức startService () mà không rơi vào một trong hai thể loại cao hơn Mặc dù các tiến trình dịch vụ không được gắn trực tiếp vào bất cứ điều gì cho người dùng thấy, nó thường làm những gì người sử dụng quan tâm (ví dụ như chơi một trong những nền mp3 hoặc tải dữ liệu trên mạng), vì vậy giữ cho hệ thống đang chạy trừ khi nó không đủ bộ nhớ để lưu giữ chúng cùng với tất cả các foreground và nhìn thấy được các tiến trình
4 Tiến trình Background là một quá trình tổ chức hoạt động không thể nhìn thấy cho người sử dụng (các hoạt động của đối tượng của phương thức onStop () được gọi )
Trang 39Những tiến trình không có tác động trực tiếp trên sự trải nghiệm của người dùng, và có thể tắt bất cứ lúc nào để tái lâp bộ nhớ cho một foreground, nhìn thấy được, hoặc dịch vụ
xử lý Thông thường có nhiều tiến trình background đang hoạt động, do đó, chúng được lưu giữ trong một LRU (ít nhất trong thời gian gần được sử dụng) trong danh sách để bảo đảm rằng quá trình với các hoạt động gần nhất đã được xem bởi người sử dụng cuối cùng
sẽ được tắt Nếu một activity thực hiện lifecycle một cách chính xác các phương thức, và hiện nay nắm bắt các trạng thái, tắt tiến trình của nó sẽ không có một ảnh hưởng có hại đến sự trải nghiệm của người dùng
5 Tiến trình empty là một trong những tiến trình mà không bất kỳ thành phần ứng dụng nào khởi động Chỉ có lý do gì để giữ như vậy là một quá trình xung quanh như một
bộ nhớ cache để cải thiện thời gian khởi động tới một thành phần cần thiết để chạy trong
nó Hệ thống này thường xuyên tắt các tiến trình để cân bằng tổng thể hệ thống tài nguyên giữa các quá trình caches và các hạt nhân caches
Android sắp xếp một tiến trình ở mức cao nhất có thể, dựa trên tầm quan trọng của các thành phần hiện đang hoạt động trong tiến trình Ví dụ, nếu tiến trình tổ chức một dịch vụ lưu trữ và hiển thị các hoạt động, tiến trình này sẽ được xếp hạng như là một tiến trình nhìn thấy được, không phải là một tiến trình dịch vụ
Ngoài ra, thứ hạng của một tiến trình có thể được tăng lên bởi vì các tiến trình phụ thuộc vào nó Một quá trình đó là quá trình phục vụ khác có thể không bao giờ được xếp hạng thấp hơn đó là tiến trình phục vụ Ví dụ, nếu một nhà cung cấp dịch vụ nội dung trong quá trình A là một phục vụ khách hàng trong quá trình B, hoặc nếu một dịch vụ trong tiến trình A là ràng buộc với một thành phần trong tiến trình B, một tiến trình sẽ luôn luôn được xem xét ít nhất là điều quan trọng là tiến trình B
Trang 40Chương III : Trình bày một số công cụ lập trình trên Android
1.1 Bộ công cụ phát triển android sdk và plugin (ADT) cho Eclipse
Bộ công cụ Android SDK bao gồm một tập hợp các công cụ dùng để phát triển, kiểm lỗi code ứng dụng và thiết kế các giao diện của ứng dụng Bộ mô phỏng Android, khi được khởi động nó sẽ hiển thị toàn bộ giao diện bao gồm cả các nút bấm và bàn phím QWERTY Nó có thể hoạt động tốt tương tự như thiết bị thật dù cho các một vài giới hạn (ví dụ như không nhận được cuộc gọi đến) Bộ mô phỏng Android chạy một phiên bản đã được sửa đổi của môi trường giả lập mã nguồn mở thuộc Fabrice Bellard, có tên là QEMU Phiên bản này giả lập một vi xử lý ARM và thực thi hệ điều hành Linux
eclipse cho phép bạn thiết lập một project android , tạo một ứng dụng UI , thêm vào các thành phần cơ bản trong framework api của android , kiểm lỗi ứng dụng của bạn sử dụng
động một dự án mới và plugin sẽ xây dựng các tập tin Java nền tảng, tạo ra những thư
dịch, chuyển đổi sang dex, mở bộ mô phỏng, và tải về Bởi vì việc viết mã Android cũng chính là viết mã Java, nên nhà phát triển có thể vận hành như thể đang xây dựng một ứng dụng Java thông thường Các tập tin nguồn được viết bằng XML cũng dễ dàng được quản
lý bởi trình biên tập XML có sẵn trong Eclipse Android giới thiệu một đặc điểm hoàn toàn mới khiến các nhà phát triển phải ghi nhớ đó chính là Activity Với Activity, bạn có thể xác định một hay nhiều góc nhìn Một góc nhìn tương đương với một khu vực trên màn hình và quản lý những thao tác diễn ra trên khu vực đó
1.1.1 Cài đặt Android SDK và plugin (ADT) cho Eclipse
Sau khi download bộ công cụ sdk về giải nén file zip đó vào vị trí dễ nhớ , file zip
đó sau khi giải nén sẽ có tên là android-sdk-<platform>-<release> ví dụ bạn down bộ sdk phiên bản 1.5_r3 cho windows thì tên thư mục được giải nén ra là android-sdk-windows-1.5_r3 bạn có thể thay đổi tùy theo ý thích
1 Ở đây ta ví dụ đặt tên thư mục đó là Android cho dễ nhớ và đặt nó ở
“C:/Android” sau đó ta cần tham chiếu biến môi trường đến thư mục “C:/Android/tools”
Chuột phải vào My Computer, trên menu chuột phải, chọn Properties, xuất hiện hộp