Tải bản đầy đủ
Hình 1.3 Vòng đời của Activity

Hình 1.3 Vòng đời của Activity

Tải bản đầy đủ

- Một Activity có thể gọi đến 1 Activity khác thông qua 1 Intent. Việc gọi
đến 1 Activity khác có thể có dữ liệu trả về từ Activity được gọi hoặc có thể không
trả về dữ liệu nào.
 Để gọi 1 Activity khác nhưng không cần trả về dữ liệu nào, ta dùng
phương thức startActivity()
 Để gọi 1 Activity khác những cũng cần có DL trả về ta dùng phương
thức startActivityForResult(). Khi đó, Activity được gọi sẽ trả lại DL
cho Activity gọi nó sau khi hoàn thành qua phương thức finish().
Activity ban đầu lấy dữ liệu được gửi tới bởi phương thức
onActivityResult().
* Các loại Activity
- ListActivity là 1 Activity hiển thị danh sách các items bằng cách liên kết với
1 nguồn dữ liệu như một mảng, một con trỏ và nắm bắt các sự kiện khi người dùng
chọn 1 item trong danh sách. Một ListActivity có một layout mặc định bao gồm 1
danh sách đơn ở giữa của màn hình. Tuy nhiên, nếu muốn chúng ta cũng có thể tùy
chọn giao diện bằng cách thiết lập layout của chúng ta với setContentView() trong
phương thức onCreate().
- PreferenceActivity: Khi chúng ta xây dựng 1 ứng dụng Android, thông
thường chúng ta muốn có một số tùy chọn cho ứng dụng như: Cách thức hiện thị,
giao diện tùy chọn, cài đặt ứng dụng hay chia sẻ thông tin với các thành phần
khác… Các tùy chọn này sẽ được lưu trữ trong bộ nhớ trong của thiết bị gọi là các
Shared Preferences. Android cung cấp 1 số cơ chế để thực hiện việc này, một trong
số đó là lớp preferenceActivity. Để làm được điểu này trước hết ta cần khai báo 1
file xml chứa các Preferences file này được đặt trong thư mục res/xml. Tiếp theo ta
cần tạo 1 Activity kế thừa từ lớp PreferenceActivity. Trong phương thức onCreate()
ta gọi phương thức addPreferencesFromResource(int xmlResource) để gắn các
Preferences vào Activity. Sau đó trong ứng dụng ta có thể truy cập đến các Shared

22

Preference thông qua tên của chúng như đã khai báo trong file xml bằng thuộc tính
“android:key”.
1.8.2 Services
- Thành phần dịch vụ không cung cấp giao diện người dùng mà chỉ chạy ở
chế độ nền, trong khoảng thời gian không xác định. Các thành phần khác của ứng
dụng có thể bắt đầu các dịch vụ và nó sẽ tiếp tục chạy dưới chế độ nền ngay cả khi
người dùng chuyển sang 1 chế độ khác. Một thành phần có thể tương tác với các
dịch vụ và thậm chí là thực hiện các tiến trình giao tiếp.
- Một Services có thể có 2 dạng:
 Started: Services là Started khi 1 thành phần ứng dụng (có thể là
Activity) bắt đầu nó bằng cách gọi

startService(Intent it).

Khi bắt đầu

1 Services có thể chạy ở chế độ nền vô thời hạn ngay cả khi thành
phần bắt đầu bị huỷ. Thông thường 1 start services thực hiện 1 thao tác
đơn lẻ và không trả về kết quả.
 Bound: Một service là Bound khi 1 thành phần liên kết đến nó bằng
cách gọi

bindService().

Một Bound service cung cấp giao diện Client

– Server cho phép các thành phần tương tác với các dịch vụ, gửi yêu
cầu, nhận kết quả, hoặc làm tương tự như vậy với các tiến trình truyền
thông.
1.8.3 Broadcast Receiver
- Một Broadcast Receiver là một thành phần nhận và đáp lại các thông báo
broadcast trên toàn bộ hệ thống. Nhiều broadcast được bắt nguồn từ hệ thống như:
thông báo múi giờ thay đổi, pin yếu, ảnh đã được chụp, hay người dùng đã thay đổi
ngôn ngữ… Các ứng dụng có thể tạo ra các broadcast, chẳng hạn để ứng dụng khác
biết được một số dữ liệu đã được tải về thiết bị và sẵn sàng cho việc sử dụng chúng.
- Một ứng dụng có thể có một số Broadcast Receiver để đáp lại bất cứ thông
báo nào mà nó cho là quan trọng. Tất cả các Broadcast Receiver mở rộng từ lớp cơ
sở BroadcastReceiver. Broadcast Receiver không hiển thị một giao diện người dùng.

23

Tuy nhiên chúng có thể bắt đầu một activity để đáp lại thông tin mà chúng nhận, hay
chúng có thể sử dụng NotificationManager để cảnh báo người dùng. Notifications có
thể lấy sự chú ý của người dùng bằng nhiều cách, lóe sáng đèn sau, rung, tạo ra âm
thanh…
- Bởi vì hệ thống chạy mỗi ứng dụng trong một tiến trình riêng biệt với các
quyền truy cập file hạn chế truy cập các ứng dụng khác, ứng dụng của bạn có thể
không trực tiếp kích hoạt một thành phần từ một ứng dụng khác. Vì vậy, để kích
hoạt một thành phần trong ứng dụng khác, người dùng phải gửi một thông điệp tới
hệ thống xác định mục đích và bắt đầu 1 thành phần cụ thể. Hệ thống sau đó kích
hoạt các thành phần này.
- Để tạo ra một thành phần Broadcast Receiver ta có thể dùng 2 cách: khai
báo trong file AndroidManiFest.xml hoặc trong kế thừa lớp BroadcastReceiver trong
mã lệnh của chương trình.
1.8.4 Content provider
- Content provider lưu trữ và lấy dữ liệu và làm cho nó có thể được truy cập
từ tất cả các ứng dụng. Đây là cách duy nhất để chia sẻ dữ liệu giữa các ứng dụng,
không có không gian lưu trữ chung mà các gói Android có thể truy cập. Dữ liệu có
thể được lưu trữ trong hệ thống file, trong một cơ sở dữ liệu SQLite, hay trong một
cách khác nào đó. Content provider mở rộng lớp cơ sở ContentProvider để cài đặt
một tập các phương thức cho phép các ứng dụng khác lấy, thao tác và lưu trữ dữ
liệu mà không cần sử dụng nhiều lệnh SQL. Tuy nhiên, các ứng dụng không gọi trực
tiếp các phương thức này, chúng sử dụng một đối tượng ContentResolver được tạo
ra bằng cách gọi getContentResolver() bên trong hoạt động của Activity hay của các
thành phần ứng dụng, hoặc chúng ta cũng có thể tạo ra các Content Provider riêng.
ContentResolver cr = getContentResolver();
- Content provider cung cấp cho chúng ta một đối tượng con trỏ, giúp chúng
ta có thể dễ dàng lấy được dữ liệu nào chỉ cần cung cấp đường dẫn cho nó. Đường
dẫn này gọi là URI. Một đối tượng URI xác định duy nhất một tập dữ liệu. Content

24

provider kiểm soát nhiều tập dữ liệu và đưa ra một đối tượng URI riêng biệt cho mỗi
tập dữ liệu đó. Cấu trúc của một URI như sau:
:////
Trong đó:
 standard_prefix : Tiền tố chuẩn cho Content Provider, luôn là content://
 authority: Tên của Content Provider, ví dụ : “contacts” trong ứng dụng
Contact của điện thoại. Nếu là Content Provider của một hãng thứ ba thì nó
có thể là tên đầy đủ như: “com.wrox.provider” hay
“net.learn2develop.provider”…
 data_path: Đường dẫn tới dữ liệu yêu cầu. Ví dụ: Nếu chúng ta muốn lấy dữ
liệu từ ứng dụng Contact thì data_path là “people”, khi đó URI có dạng:
content://contacts/people.
 id: Xác định bản ghi cần lấy. Ví dụ: Nếu ta muốn lấy người thứ hai trong ứng
dụng Contact thì URI sẽ là:
content://contacts/people/2
1.8.5 Intent
- Ba thành phần lõi của 1 ứng dụng: Services, Activities, Broadcast
Receivers, đều được gọi qua 1 thông điệp gọi là Intent. Intent là điều kiện ràng buộc
cuối cùng giữa các thành phần trong cùng 1 ứng dụng hoặc trong các ứng dụng khác
nhau.
- Một Intent là 1 mô tả trừu tượng của hành động sẽ được thực hiện. Nó có
thể dùng với hàm startActivity() để khởi động 1 Activity, dùng broadcastIntent() để
gửi Intent đến bất kỳ thành phần BroadcastReceiver nào hoặc dùng với startServices
hoặc bindServices để giao tiếp với 1 dịch vụ chạy nền của hệ thống.
- Có intent tường minh và trừu tượng:
 Intent tường minh (Explicit): thường được sử dụng trong các ứng dụng
(như 1 lớp trong ứng dụng đó)
 Intent trừu tượng (Implicit): Không chỉ rõ tên lớp được gọi mà chỉ ra
action được thực thi và cung cấp URL được dùng bởi action này. Khi

25

Intent trừu tượng được gửi tới hệ thống, Android sẽ tìm tất cả các
component (Các activity) đã đăng ký action này (trong inten-filter) với
kiểu dữ liệu tương ứng. Nếu chỉ tìm được một Component thì nó thực
hiện luôn, ngược lại sẽ hiện ra màn hình cho người dùng chọn.
Component nào sẽ được thực thi
- Các thành phần quan trọng của 1 Intent là:
 Action: Hành động chung sẽ được thực hiện, như: ACTION_VIEW,
ACTION_EDIT, ACTION_MAIN.
 Data: Dữ liệu được xử lý, như bản ghi thông tin liên lạc về 1 người trong cơ
sở dữ liệu. Các data được xác định như một đôi tượng URI Một số cặp
action/data như:
 ACTION_VIEW content://contacts/people/1: Hiển thị thông tin về
người có định danh là 1.
 ACTION_DIAL content://contacts/people/1: Hiển thị màn hình quay số
gọi người có định danh là 1.
 ACTION_DIAL tel:123: Hiển thị màn hình quay số với số được điền
vào.
 ACTION_EDIT content://contacts/people/1: Chỉnh sửa thông tin về
người có định danh là 1.
 ACTION_VIEW content://contacts/people/: Hiển thị 1 danh sách người
trong danh bạ. Sau đó có thể chọn 1 người cụ thể để xem thông tin
trong một Intent mới.
- Ngoài ra Intent còn có Các thuộc tính phụ như:
 Category: Cung cấp thêm thông tin về hành động sẽ được thực hiện,
thông tin về nhóm của Action.
 Chỉ định kiểu dữ liệu của Intent (chuẩn là MIME), thường được tự
động xác định.

26

 Component: Chỉ định tên của 1 lớp thành phần cụ thể dùng Activity.
Thông thường nó được bằng cách xem thông tin trong Intent và kết
hợp với các thành phần có thể xử lý nó.
 Extras: Sử dụng để mở rộng thông tin cho một thành phần nào đó. Ví
dụ khi chúng ta có một hành động gửi một tin nhắn, chúng ta có thể sử
dùng dữ liệu bổ xung để gửi kèm một tiêu đề.
- Intent filter: Để thông báo cho hệ thống những Intent mà nó có thể xử lý.
Các Activities, Services và Broadcast Receiver có thể có một hoặc nhiều Intent
filter. Mỗi filter mô tả khả năng của các thành phần, tập các Intent mà các thành

phần sẵn sàng nhận.
1.8.6 Notification
- Cung cấp thông báo cho các tình huống phát sinh cho người sử dụng. Một
số sự kiện yêu cầu người sử dụng đáp ứng, một số khác thì không. Ví dụ: Thông báo
lưu tập tin hoàn tất, thông báo cho người sử dụng biết ứng dụng đang chạy trong chế
độ nền, chờ đợi 1 thao tác được hoàn tất.
- Có nhiều kỹ thuật khác nhau để hiển thị thông báo cho người dùng:
 Toast Notification: Là một thông điệp dạng pop-up trên bề mặt của
cửa sổ. Nó chỉ lấp đầy khoảng không gian vừa đủ cho thông điệp, cho
phép người dùng có thể nhìn thấy được ứng dụng đang chạy, nó tự
động hiện và ẩn và không chấp nhận tương tác.
 Status Bar Notification: Liên tục hiển thị thông điệp và yêu cầu người
dùng thao tác. Khi người dùng chọn thông điệp Android sẽ đưa ra 1
Intent được xác định bởi notification (thường được dùng để bắt đầu 1
Activity).

 Dialog Notification: Hiển thị thông báo liên quan đến Activity. Nó
dùng 1 cửa sổ nhỏ xuất hiện phía trước và che Activity hiện tại và
chấp nhận tất cả các tương tác của người dùng. Nên dùng Dialog khi
cần hiển thị thanh tiến trình hoặc một thông điệp ngắn yêu cầu người

27

dùng xác nhận hành động. Cũng có thể sử dụng Dialog như 1 thành
phần tách rời của giao diện ứng dụng cho mục đích khác bên cạnh
hiện thông điệp.
1.9 Giao diện người dùng trong Android
- Giao diện người dùng trong Android có thể được xây dựng bằng 2 cách:
bằng cách định nghĩa trong file XML, hoặc bằng cách viết mã lệnh java. Việc định
nghĩa cấu trúc giao diện người dùng bằng file XML là lợi thế hơn vì nó hướng theo
nguyên tắc của mô hình MCV rằng giao diện người dùng luôn tách ra khỏi các khối
logic của chương trình, ta có thể dễ dàng thay đổi giao diện của chương trình mà
không cần sửa mã lệnh, đồng thời việc điều chỉnh để phù hợp với độ phân giải của
các màn hình khác nhau dễ dàng hơn.
- Một Activity hiển thị giao diện người dùng của ứng dụng. Nó chứa đựng
các Widget như button, labels, textbox. Thông thường chúng ta thường định nghĩa
giao diện người dùng trong file XML (đặt trong thư mục res/layout của gói ứng
dụng). Bên cạnh đó chúng ta cũng có thể tạo ra các phần tử giao diện sử dụng mã
lệnh trực tiếp trong chương trình.
1.9.1 Views và ViewGroup
- Activity chứa Views và ViewGroup, View là đối tượng cơ bản của giao
diện người dùng trong nền tảng Android, View có lớp con gọi là “Widget” cung cấp
các đối tượng giao diện người dùng như TextField và Button… view được dẫn suất
từ lớp cơ sở là Android.view.View. ViewGroup là 1 view đặc biệt do một hoặc
nhiều view được nhóm lại với nhau. ViewGroup có các lớp con là Layout cung cấp
nhiều kiểu kiến trúc layout trong đó ta có thể sắp đặt sự xuất hiện và trình tự của các
view, một ViewGroup được dẫn xuất từ lớp cơ sở Android.view.ViewGroup.
- Mỗi view và viewGroup có các thuộc tính cơ bản và một số các thuộc tính
này chỉ được dùng cho các viewGroup đặc biệt.

28

- Khi định kích thước cho các phần tử của giao diện ta có thể sử dụng các đơn
vị đo như:
 dp (Density-independent pixel hay dip): Đây là đơn vị thường được
dùng trong việc định kích thước cho 1 view trong layout. 160dp tương
ứng với 1 inch trên màn hình vật lý.
 sp (Scale-independent pixel): Thường dùng cho việc định kích thước
của font chữ.
 pt (point): 1 pt = 1/72 inch của màn hình.
 px (pixel): Tương ứng với các pixel thực tế trên mành hình. Đơn vị
này không được khuyến khích sử dụng vì nó có thể hiển thị không
chính xác trên các thiết bị với những kích thước màn hình khác nhau.
- Android hỗ trợ 6 loại ViewGroup:
 LinearLayout: LinearLayout sắp xếp các views theo 1 hàng hoặc 1 cột
đơn. Các views con có thể được sắp xếp theo chiều dọc hoặc hiều
ngang.
 AbsoluteLayout: Định vị tuyệt đối, cho phép chúng ta xác định chính
xác vị trí của các view. AbsoluteLayout bị phản đối sử dụng từ phiên
bản Android 1.5 do gặp vấn đề khi hiển thị trên các màn hình có độ
phân giải cao.
 TableLayout: Nhóm các view vào trong các hàng và cột. Dùng phần
tử để chỉ định số hàng cho trong bảng. Mỗi hàng có thể
chứa 1 hoặc nhiều view, mỗi view được đặt trong 1 ô. Chiều rộng của
mỗi cột là chiều rộng nhất của các ô trong cột đó.
 RelativeLayout: Cho phép xác định mỗi view được định vị tương đối
như thế nào với các phần tử khác.
 FrameLayout: Là một khung chứa trên màn hình, dùng để hiển thị một
view đơn lẻ. View đặt trong FrameLayout luôn được cố định tại vị trí
phía trên bên trái của layout. Nếu đặt nhiều view vào FrameLayout

29