Kiến trúc ứng dụng Application Architecture Ý tưởng của Android đó là khuyến khích việc tái sử dụng lại các thành phần đã có, cho phép ứng dụng của bạn có thể chia sẻ Activity, Service,
Trang 1BÁO CÁO ĐỒ ÁN 3
Đề tài: THIẾT KẾ VÀ XÂY DỰNG ỨNG DỤNG NGHE
NHẠC MUSIC LIFE
Đà Nẵng, ngày 20 tháng 7 năm 2020Giảng viên hướng dẫn: Hà Thị Minh PhươngThành viên nhóm thực hiện: Võ Văn Thống (18IT5)
La Việt Hưng (18IT3)
Trang 2Nhận xét của giáo viên
Trang 3LỜI CẢM ƠN
Trang 4MỤC LỤC
Trang 5ĐỒ ÁN TỐT NGHIỆPTÌM HIỂU VỀ LẬP TRÌNH ANDROID VÀ XÂY DỰNG
ỨNG DỤNG NGHE NHẠC TRÊN ANDROID
PHẦN 1: TÌM HIỂU VỀ LẬP TRÌNH ANDROID
Android – hệ điều hành cho điện thoại di động được phát triển bởi Googlengày càng trở nên phổ biến với việc các hãng điện thoại liên tục ra mắt các mẫuđiện thoại sử dụng Android
Giao diện màn hình khoá(Android 2.3)Giao diện màn hình chính(Android 2.3)
Trang 6Android được xây dựng trên nhân Linux và được phân phối miễn phí.Không giống như Windows Mobile và Apple Iphone, tuy cả hai đều cung cấpmột môi trường phát triển ứng dụng phong phú và dễ tiếp cận nhưng luôn có sựưu tiên cho các ứng dụng mặc định có sẵn của hệ điều hành(native application).Với Android, mọi ứng dụng đều được viết trên cùng một tập API, thế nên khôngcó sự phân biệt giữa các ứng dụng mặc định và các ứng dụng của bên thứ ba.Người dùng hoàn toàn có thể thay thế mọi ứng dụng mặc định bằng các ứngdụng yêu thích của mình, thậm chí ngay cả màn hành thực hiện cuộc gọi vàmàn hình nhà (home screen).
Các nhà phát triển viết ứng dụng cho Android dựa trên ngôn ngữ Java Sự ramắt của Android vào ngày 5 tháng 11 năm 2007 gắn với sự thành lập của liênminh thiết bị cầm tay mã nguồn mở., bao gồm 78 công ty phần cứng, phần mềmvà viễn thông nhằm mục đích tạo nên một chuẩn mở cho điện thoại di độngtrong tương lai
Google cung cấp hầu hết các mã nguồn của Android theo bản cấp phépApache
Một điện thoại Android thông thường sẽ đi kèm với một vài ứng dụng đãđược cài đặt sắn, bao gồm:
- Một trình email tương thích với Gmail.- Chương trình quản lý tin nhắn SMS.- Chương trình quản lý thông tin cá nhân, bao gồm cả lịch làm việc, danh bạ,
và được đồng bộ hoá với dịch vụ của Google.- Phiên bản thu gọn của Google Map cho điện thoại, bao gồm StreetView, tìm
kiếm địa điểm, chỉ đường, tình trạng giao thông,…- Trình duyệt web dựa trên nhân WebKit
- Chương trình tán gẫu (chat) - Trình đa phương tiện (chơi nhạc, xem ảnh,…) - Android Marketplace – cho phép người dùng tải về và cài đặt các ứng dụng
mới - Tất cả các ứng dụng có sẵn đều được viết bằng ngôn ngữ Java và sử dụng
Android SDK
Trang 7- Các dữ liệu về thông tin người dùng được các ứng dụng có sẵn sử dụng – nhưthông tin về danh bạ - vẫn hoàn toàn có thể được sử dụng bởi các ứng dụngcủa bên thứ ba
- Tương tự vậy, ứng dụng của bạn hoàn toàn có thể xử lý các sự kiện như cócuộc gọi đến, nhận một tin nhắn mới,… thay cho các ứng dụng có sẵn
Android bao gồm thư viện các API giúp đơn giản hóa tối đa việc sử dụng phần cứng của thiết bị Điều đó đảm bảo rằng bạn không cần phải bận tâm nhiều đến việc ứng dụng của mình có thể chạy như mong đợi trên nhiều thiết bị khác nhau hay không, miễn là thiết bị đó có hỗ trợ Android
Android SDK bao gồm các API cho phần cứng như: GPS, camera, kết nối mạng, Wi-Fi, Bluetooth, con quay gia tốc, màn hình cảm ứng, quản l{ năng lượng,…
Android hỗ trợ các ứng dụng và dịch vụ được thiết kể để chạy ẩn Do kích thước nhỏ của màn hình điện thoại nên tại một thời điểm chỉ có thể thấy được một ứng dụng Dịch vụ chạy nền giúp tạo ra các thành phần ứng dụng “vô hình” để thực hiện tự động một tác vụ nào đó mà không cần phải có sự tương tác của người dùng Ví dụ như một dịch vụ chạy nền có chức năng chặn cuộc gọi đến đối với các số điện thoại có trong “black list” chẳng hạn
Bởi vì tính chất nhỏ gọn và bị hạn chế về phần cứng của điện thoại di động, chonên đòi hỏi việc lưu trữ và truy xuất dữ liệu phải nhanh chóng và hiệu quả Android hỗ trợ hệ quản trị dữ liệu nhỏ gọn SQL, và cung cấp cho ứng dụng các API để thao tác Mặc định mỗi ứng dụng đều được chạy trong sandbox - điều này có nghĩa là nội dung của từng database ứng với từng ứng dụng chỉ có thể được truycập bằng chính ứng dụng đó Tuy nhiên cũng có các cơ chế để ứng dụng có thể chia sẽ, trao đổi các database với nhau
Trang 8VI.Hệ thống thông báo (Notifications)
Thông báo là cách thức tiêu chuẩn mà ở đó thiết bị báo cho người dùng đã có một sự kiện nào đó xảy ra Chẳng hạn như có cuộc gọi tới, máy sắp hết pin,… Sử dụng các API bạn có thể cho ứng dụng của mình thông báo đến người dùng bằng âm thanh, rung, hoặc thậm chí là cả đèn LED của thiết bị
VII Kiến trúc ứng dụng (Application Architecture)
Ý tưởng của Android đó là khuyến khích việc tái sử dụng lại các thành phần đã có, cho phép ứng dụng của bạn có thể chia sẻ Activity, Service, Dữ liệu với các ứng dụng khác trong giới hạn truy cập do bạn đặt ra
Một ví dụ đơn giản: bạn cần làm một ứng dụng chụp ảnh hàn quốc, về cơ bản ứng dụng này sẽ làm hai nhiệm vụ: một là chụp ảnh, hai là ghép, chỉnh sửa ảnh Thay vì phải tự xây dựng chức năng chụp ảnh, bạn sẽ sử dụng lại chức năng chụp ảnh có sẵn trong ứng dụng chụp ảnh của Android Việc này giúp bạn dễ dàng và mau chóng xây dựng được những ứng dụng nhiều tính năng và sử dụng hiệu quả tài nguyên máy
Những dịch vụ dưới đây là nền tảng kiến trúc của mọi ứng dụng Android, đây làkhuôn khổ cho bạn xây dựng ứng dụng của riêng mình:
Activity Manager
Kiểm soát vòng đời của Activity Views
Xây dựng giao diện người dùng cho các Activity Notification Manager
Cung cấp một cơ chế thống nhất và an toàn để ứng dụng có thể đưa ra các thông
báo cho người dùng Content Providers
Giúp cho việc trao đổi, chia sẽ dữ liệu giữa các ứng dụng với nhau Resource Manager
Trang 9Hỗ trợ quản l{ các loại tài nguyên không là code (non-code resources) như các chuỗi, hình ảnh, hoặc âm thanh,…
VIII Các thư viện của Android
Android cung cấp các gói API để phát triển ứng dụng Danh sách các gói core API dưới đây giúp cho bạn có cái nhìn tổng quát về những gì được hỗ trợ sẵn, tất cả các thiết bị chạy Android đều phải hỗ trợ được tối thiểu các API này
android.util
Gói api lõi, chứa các class cấp thấp như containers, string formatters, XML parsing
android.os
Truy cập tới các chức năng của hệ điều hành chẳng hạn như: gửi nhận tin nhắn, giao tiếp nội bộ giữa các ứng dụng, thời gian,…
android.graphics
Cung cấp các lớp liên quan tới xử l{ đồ họa ở mức thấp Hỗ trợ các hàm cơ bản như vẽ điểm, vẽ miền, tô màu,… trên một khung canvas
android.text
Cung cấp các hàm phân tích và xử lý chuỗi android.database
Cung cấp các lớp cấp thấp cần thiết để làm việc với databases android.content
Dùng để quản lý các tài nguyên, các nội dung, và các gói android.view
Views là lớp cha của mọi lớp giao diện người dùng android.widget
Được kế thừa từ lớp View, bao gồm các lớp để cơ bản để xây dựng giao diện widget như: lists, buttons, layouts
Trang 10android.maps
Gói API cấp cao, dùng để truy cập đến các chức năng của GoogleMap
android.app
Gói API cấp cao, bao gồm lớp Activity và Service - hai lớp cơ sở cho mọi ứng dụng Android
android.telephony
Cung cấp cho bạn khả năng tương tác trực tiếp với các chức năng cơ bản của một chiếc điện thoại như nghe, gọi, tin nhắn
android.webkit
Cung cấp một WebView control trên nền webkit để có thể nhúng vào ứng dụng, cùng với các api điều khiển cơ bản như stop, refresh, cookie manager,…
Hầu hết các ứng dụng trong Android sẽ thuộc vào một trong ba loại sau đây: Foreground Activity
Ứng dụng hữu dụng chỉ khi nó được tương tác với người dùng ở mặt tiền
(foreground), ứng dụng mất tác dụng khi bị ẩn đi Game, bản đồ, từ điển là các ví dụ điển hình
Background Service
Ứng dụng không đòi hỏi nhiều đến tương tác của người dùng Trừ khi được cấu hình, còn phần lớn thời gian là ứng dụng chạy ngầm Ví dụ thuộc loại này chẳng hạn như: ứng dụng trả lời tin nhắn tự động
Intermittent Activity
Ứng dụng loại này vừa nhận tương tác của người dùng, và vẫn có thể tiếp tục hoạt động ngầm khi bị ẩn đi Có thể đưa ra các thông báo cho người dùng khi cần thiết trong lúc đang bị ẩn Các ứng dụng loại này có thể kể đến như: ứng dụng nghe nhạc, ứng dụng tán gẫu (chat),…
Trang 11Đối với các ứng dụng lớn và phức tạp, khó để có thể cho vào một loại duy nhất, và thường thì các ứng dụng này bao gồm có khi cả 3 loại trên Điều quan trọng là khi bạn xây dựng ứng dụng cho mình hãy chú { đến 3 loại trên để đưa ra thiết kế phù hợp
Dưới đây là một số lưu { khi xây dựng ứng dụng thuộc 3 loại trên:
Foreground Activities
Khi xây dựng ứng dụng loại này cần phải xem xét cẩn thận về chu kì sống của Activity (Activity life cycle) để có thể tạo sự chuyển đổi thông suốt và mượt mà giữa trạng thái foreground và background Vì ứng dụng không tự nó kiểm soát được chu kz sống, nên điều này đồng nghĩa với việc bạn cần phải lưu lại trạng thái của ứng dụng trước khi nó chuyển từ foreground sang background, và trả lại trạng thái phù hợp trong trường hợp ngược lại
Background Services
Với ứng dụng loại này, cần chú { là nó sẽ cần rất ít các tương tác trực của người dùng, có khi hoàn toàn không cần Thay vào đó ứng dụng sẽ lắng nghe các thông điệp, sự kiện phát sinh bởi hệ thống, phần cứng, hoặc từ các ứng dụng khác
Bạn có thể tạo ra một ứng dụng hoàn toàn “vô hình”, nhưng tốt hơn là nên cung cấp một giao diện cơ bản để người dùng có thể hiệu chỉnh các thiết lập, dừng hoặc thoát hoàn toàn ứng dụng Intermittent Activities
Ứng dụng loại này là sự kết hợp giữa một Foreground Activities và một Background Service, vậy nên điều cơ bản là ứng dụng cần phải nhận biết được tìnhtrạng hiện tại của mình (foreground/background) để đưa ra các xử lý phù hợp
Cũng nên lưu ý đến việc gởi các thông báo (có thể thông qua hệ thống notification của Android) đến người dùng khi ứng dụng đang chạy ngầm vào những lúc cần thiết
1 Android Project
Trang 12Android project là một hệ thống thư mục và file chứa toàn bộ source code, tài nguyên,… mà mục đích cuối cùng là để đóng gói thành một file apk duy nhất (file có đuôi apk là file ứng dụng của Android ).
Trong một thư mục project, có một số thành phần (file, thư mục con) được tạo ra mặc định, còn lại phần lớn thì sẽ được tạo ra sau nếu cần trong quá trình phát triển ứng dụng Dưới đây liệt kê cấu trúc đầy đủ của một thư mục project:
src/
Chứa toàn bộ source code (file java hoặc aidl) bin/
Thư mục chức file Output sau khi build Đây là nơi bạn có thể tìm file.apk
gen/
Chứa các file java tạo ra bởi ADT plug-in, như là file R.java hoặc cácgiao diện tạo ra từ file AIDL
res/
Chứa các tài nguyên (resources) cho ứng dụng, chẳng hạn như file hình ảnh, file layout, các chuỗi (string),… Dưới đây là các thư mục con của nó:
anim/
Chứa các file xml dùng cho việc thiết lập các hiệu ứng động (animation)
color/
Chứa các file xml dùng định nghĩa màu sắc drawable/
Chứa file hình ảnh (png, jpeg, gif), file xml định nghĩa cách vẽ các loại hình dạng khác nhau (shape)
layout/
Chứa file xml dùng để dựng giao diện người dùng
Trang 13menu/
Chứa file xml quy định application menu raw/
Chứa các file media, chẳng hạn như mp3 hay ogg values/
Chứa file xml định nghĩa các giá trị Khác với các resource trong các thư mục khác, resource ở thư mục này khi được định danh trong lớp R thì sẽ không sử dụng file name để định danh, mà sẽ được định danh theo quy định bên trong file xml đó (xem thêm về lớp R ở phần sau)
xml/
Dùng chứa các file xml linh tinh khác, chẳng hạn như file xml quy định app widget, search metadata,…
libs/
Chứa các thư viện riêng AndroidManifest.xml/
File kiểm soát cách các thành phần trong ứng dụng (activity, service, intent receiver,…) tương tác với nhau, cách ứng dụng tương tác với các ứng dụng khác, cũng như đăng ký các quyền hạn về sử dụng tài nguyên trong máy
build.properties
Tùy chỉnh các thiết lập cho hệ thống build, nếu bạn sử dụng Eclipse thì file này không cần thiết
build.xml
Chỉ sử dụng khi bạn dùng dòng lệnh (command line) để kiến tạo project
default.properties
Trang 14File này chứa các thiết lập cho project, chẳng hạn như build target, min SDK version,… tốt hơn hết là không nên chỉnh sửa file này bằng tay.
2 Android Manifest
Mỗi một Android project thì luôn phải có một file AndroidManifest.xml (xem bên trên) Manifest dùng để định nghĩa cấu trúc cũng như các metadata của ứng dụng và các thành phần con Manifest bắt đầu bằng thẻ root <manifest>với thuộc tính package để quy ước package của project và thuộc tính
xmlns:android như là một quy định để chuẩn hóa cấu trúc file manifest Dưới đây là một file Manifest điển hình:
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.my_domain.my_app" >
[ manifest nodes ] </manifest>
Manifest bao gồm nhiều thẻ định nghĩa các thành phần của ứng dụng, các thiết lập về bảo mật, các lớp test,… Dưới đây là danh sách các thẻ có thể xuất hiện trong file manifest:
<application>
Một file manifest chỉ có thể chứa một thẻ application Thẻ này dùng để chỉ định các metadata (bao gồm title, icon, theme,…) và các thành phần cho ứng dụng Nó đồng thời cũng là thẻ cha của các thẻ Activity, Service, Content Provider, và Broadcast Receiver
<application android:icon="@drawable/icon" android:theme="@style/my_theme" android:title="@string/app_name" > [ application nodes ]
</application> <activity>
Trang 15Thẻ activity được yêu cầu cho mỗi một Activity trong ứng dụng Sử dụng thuộc tính android:name để chỉ định tên của lớp Activity tương ứng <activity android:name=".MyActivity"></activity>
<service>
Cũng như activity, thẻ service được yêu cầu cho mỗi một Service trong ứng dụng Sử dụng thuộc tính android:name để chỉ định tên của lớp Service tương ứng Sử dụng thuộc tính android:enabled để chỉ định trạng thái mặc định của Service
<service android:enabled="true" android:name=".MyService"> </service>
<uses-permission>
Quy định các quyền hạn mà ứng dụng muốn sử dụng trên hệ thống Và người dùng sẽ phải xác nhận các quyền này trong khi cài ứng dụng Điềunày đảm bảo cho việc ứng dụng không thể toàn { sử dụng các tài nguyên củahệ thống (tin nhắn, danh bạ, thông tin cá nhân, camera, định vị, mạng,…) Đây là một điểm bảo mật cần lưu ý
<uses-permission android:name="android.permission.ACCESS_LOCATION"> </uses-permission>
<instrumentation>
Được yêu cầu cho mỗi một lớp Test bạn tạo ra trong ứng dụng Lớp Test cung cấp những khả năng để bạn có thể kiểm tra các Activity và Service, giám sát chúng và xem cách chúng tương tác với tài nguyên hệ thống
<instrumentation android:label="My Test" android:name=".MyTestClass" android:targetPackage="com.paad.aPackage" > </instrumentation>
Trang 16Eclipse sẽ tự động tạo ra một file Manifest bao gồm lớp Activity mặc định khi bạn tạo mới một Android Project (xem lại chương 2, mục tạo mới một Android Project)
3 Activity
Activity là thành phần ứng dụng cung cấp một màn hình tương tác cho người sửdụng nhằm thực hiện một thao tác nào đó chẳng hạn như gọi điện thoại, chụp ảnh, gửi email hay xem bản đồ Mỗi activity chạy trong một cửa sổ hiển thị trên giao diện của người sử dụng Cửa sổ có thể hiển thị toàn màn hình hoặc nhỏ hơn màn hình và nổi phía trên các cửa sổ khác
Một ứng dụng thường bao gồm nhiều activitiy liên kết với nhau Thông thường thường một activity của ứng dụng đóng vai trò activity chính và được hiển thị cho người sử dụng trong lần đầu tiên chạy ứng dụng Mỗi activity có thể khởi chạy mộtactivity khác
Mỗi lần một activity mới được khởi động thì activity trước đó sẽ bị dừng lại nhưng hệ thống vẫn sắp nó vào stack (tên là “Back stack”) Khi một activity mới khởi động, nó được xếp phía trên cùng trong khối stack và được focus “Back stack” hoạt động theo trình tự “vào sau, ra trước”, cho nên khi người sử dụng đã thao tác xong với activity hiện tại và nhấn “BACK”, chương trình sẽ “pop” ra từ stack activity liền trước và activity đó sẽ tiếp tục hoạt động trở lại
Có nhiều phương thức callback mà một activity có thể nhận được khi có sự thayđổi trạng thái (khởi tạo, dừng, resume hoặc hủy) và bạn có thể thực hiện một thao tác tương ứng với sự thay đổi trạng thái Chẳng hạn khi bị dừng lại thì activity sẽ phải giải phóng bộ nhớ, đóng truy cập database,… Khi được khởi động lại bạn có thể truy cập những dữ liệu cần thiết và resume các thao tác bị gián đoạn trước đó Những sự chuyển đổi về trạng thái này hợp thành vòng đời của một activity
Tạo một Activity
Để tạo một activity, bạn phải tạo một subclass cho Activity (hoặc cho chính nó) Trong subclass, bạn cần phải xác định cách thức callback mà hệ thống sẽ sử dụng
Trang 17khi có sự chuyển đổi trạng thái của activity chẳng hạn như khi activity được tạo, dừng lại, resume hoặc bị hủy Có 2 phương thức callback quan trọng:
onCreate()
Bạn cần phải hiện thực hóa phương thức này, vì hệ thống sẽ gọi tới method này mỗi khi activity được khởi động Và quan trọng, đây chính là nơi cần gọi phương thức setContentView() để xác định bố cục cho giao diện người dùng
onPause()
Hệ thống sẽ gọi tới phương thức này khi người dùng rời khỏi ứng dụng (nó không đồng nghĩa với việc activity sẽ bị hủy) Đây là nơi bạn sẽ thực hiện lưu lại trạng thái, hoặc không làm gì cả (vì người dùng có thể không trở lại).Có một số phương thức bạn có thể sử dụng để kiểm soát vòng đời của activity trước những sự gián đoạn không mong muốn dẫn đến activity bị dừng lại, thậm chí bị hủy bỏ Những phương thức này sẽ được nói tới trong phần Kiểm soát vòng đời Activity
Triển khai một giao diện người dùng
Mỗi giao diện của một activity là tập hợp của các View (các đối tượng của lớp kế thừa từ lớp View) Mỗi đối tượng View kiểm soát một vùng riêng trong vùng màn hình và có thể phản ứng lại với tương tác của người dùng Ví dụ View cóthể là một button và có thể thực hiện một hành động nào đó khi người dùng chạm vào nó Android cung cấp một số các lớp View sẵn để bạn có thể sử dụng vào layout của mình “Widget” là một view đặc biệt, dùng để hiển thị ngoài màn hình chính, bao gồm: button, text field, checkbox, hoặc đơn giản chỉ là image “Layout”là view kế thừa từ ViewGroup, nó cung cấp một khuôn mẫu cách bố trí các view bên trong nó, chẳng hạn như: linear layout, grid layout, relative layout Bạn có thể tạo cho riêng mình các View hay ViewGroup để áp dụng vào giao diện của bạn Cách thông thường nhất để định nghĩa một layout đó là sử dụng file XML lưu trong thư mục resource của ứng dụng Với cách này bạn có thể duy trì thiết kế giaodiện tách bạch với source code Bạn có thể set layout này làm giao diện của activity bằng phương thức setContentView(), truyền vào tham số là ID của layout đó thông qua lớp R Tất nhiên bạn cũng có thể tạo giao diện trực tiếp bằng code
Trang 18Khai báo Activity trong file Manifest
Bạn cần phải khai báo rõ ràng một activity trong file manifest thì activity đó mới có thể hoạt động được Để khai báo Activity ta dùng thẻ <activity> là thẻ con của
<application> Tương tự như sau: <manifest >
<application > <activity android:name=".ExampleActivity" />
</application> </manifest> Có nhiều thuộc tính bạn có thể đưa vào <activity> chẳng hạn như: label, icon, hay theme
Sử dụng intent filters
Một thẻ <activity> có thể chứa đựng nhiều thẻ <intent-filter> Thẻ này dùng để xácđịnh những thành phần nào của ứng dụng có thể kích hoạt, và sử dụng Activitynày
<activity android:name=".ExampleActivity" android:icon="@drawable/app_icon"> <intent-filter>
<action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter>
</activity> Thẻ <action> chỉ định đây là Activity chính của ứng dụng (sẽ được chạy mặc định)
Thẻ <category> chỉ định Activity này sẽ được liệt kê trong danh sách ứng dụng củahệ thống (để người dùng có thể chạy activity này) Nếu bạn muốn ứng dụng của bạn bảo mật và không cho phép bất cứ ứng dụng nào khác có thể kích hoạt Activitynày thì bạn không cần thêm bất kz <intent-filter> nào nữa, chỉ cần như trên là đủ Khi bạn tạo một Android Project mới thì Eclipse đã tự định ra khai báo Activity với Intent-filter như trên
Trang 19Bắt đầu một Activity
Bạn có thể bắt đầu một Activity khác trong activity đang chạy bằng phương thức startActivity(), truyền vào tham số là một Intent quy định rõ Activity nào bạn muốnbắt đầu và sẽ thực hiện hành động cụ thể nào (hệ thống sẽ chọn ra Activity chính xác cho bạn, nó có thể thuộc một ứng dụng khác)
Ví dụ sau đây bắt đầu một Activity có tên SingInActivity: Intent intent = new Intent(this, SignInActivity.class); startActivity(intent);
Tuy nhiên ứng dụng của bạn khi muốn bắt đầu một Activity mà ứng dụng không cósẵn, chẳng hạn như gửi email, sms, gọi điện,… Trong trường hợp này ứng dụng sẽ cần gọi đến các Activity được cung cấp sẵn trên hệ thống, đây là một điểm rất hữu ích của Android Ví dụ bạn cần thực hiện thao tác gởi email, bạn làm như sau:
Intent intent = new Intent(Intent.ACTION_SEND); intent.putExtra(Intent.EXTRA_EMAIL, recipientArray); startActivity(intent);
Khi thực hiện đoạn mã này thì Activity gởi email của hệ thống sẽ khởi động, Activity của bạn sẽ ẩn đi Sau khi người dùng gởi email xong, Activity của bạn sẽ được resume
Bắt đầu một Activity và kết quả trả về
Đôi khi bạn muốn nhận được kết quả trả về sau khi chạy một Activity nào đó Trong trường hợp này, bạn sử dụng phương thức startActivityForResult() thay vì startActivity(), sau đó để nhận được kết quả trả về ở Activity kế tiếp, bạn sử dụng phương thức onActivityResult() Kết quả được truyền đi là một Intent
Như ví dụ sau, bạn bắt đầu một Activity cho phép chọn một số trong danh bạ, sau đó nhận kết quả tại Activity của mình:
private void pickContact() { Intent intent = new Intent(Intent.ACTION_PICK, Contacts.CONTENT_URI);
startActivityForResult(intent, PICK_CONTACT_REQUEST);
Trang 20} @Override protected void onActivityResult(int requestCode, int resultCode, Intent data){
if (resultCode == Activity.RESULT_OK && requestCode == PICK_CONTACT_REQUEST) { // code xử lý
} }
Kết thúc một Activity
Bạn có thể kết thúc một Activity bằng cách gọi phương thức finish() Bạn cũng có thể kết thúc một Activity riêng biệt mà trước đó bạn đã khởi động bằng phương thức finishActivity()
Chú ý: trong hầu hết trường hợp bạn không nên dùng cách này để kết thúc một Activity, vì hệ thống Android sẽ làm nhiệm vụ này cho bạn Khi dùng cách này cũng có thể sẽ ảnh hưởng đến trải nghiệm của người dùng khi tương tác với ứng dụng
Kiểm soát vòng đời Activity
Việc kiểm soát này rất quan trọng để có thể xây dựng được một ứng dụng linh hoạtvà mạnh mẽ Một Activity có thể tồn tại ba trạng thái cơ bản sau:
Resumed
Khi Activity đang trong foreground hoặc được focus (trạng thái này cũng có thể được gọi là "running")
Paused
Khi Activity mặc dù đang trong foreground, tuy nhiên vẫn đang bị ẩn Tại vì có một Activity khác đang được kích hoạt và nằm trên cùng như là: menu, message box,… Tất nhiên lúc này Activity đang “paused” vẫn còn “sống” (activity vẫn còn được lưu trong bộ nhớ) tuy nhiên activity này có thể bị kết thúc bởi hệ thống khi bộ nhớ đã cạn kiệt
Trang 21Stopped
Khi Activity hoàn toàn bị che đi bởi một Activity khác (hay nói cách khác là Activity này đang nằm trong “background”) Một Stopped Activity thì vẫn còn “sống”, tuy nhiên nó không còn hiển thị cho người dùng sử dụngvà có thể bị kết thúc bất cứ lúc nào bởi hệ thống
Các phương thức tương ứng trong vòng đời Activity
Vòng đời của một Activity không phải do Activity kiểm soát, mà nó sẽ do hệthống kiểm soát, vì trong lúc thực thi activity, sẽ có những tình huống xảy ra bất ngờ ảnh hưởng đến Activity
Ứng với mỗi hình huống xảy ra, hệ thống sẽ có một lời gọi tương ứng kiểu như sau:
public class ExampleActivity extends Activity { @Override
public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);
// Code xử lý }
@Override protected void onStart() { super.onStart(); // Code xử lý }
@Override protected void onDestroy() { super.onDestroy(); // Code xử lý }
// và còn các phương thức khác }
Dưới đây là danh sách các phương thức có thể được gọi cùng với giải thích cụ thể: onCreate()
Trang 22Gọi khi Activity lần đầu tiên được tạo Đây là nơi bạn thực hiện mọi các khai báo cũng như thiết lập giao diện Luôn được theo sau bởi phương thức onStart()
onRestart()
Gọi khi Activity đang ở trạng thái Stopped và được kích hoạt lại Luôn được theo sau bởi phương thức onStart()
onStart()
Gọi khi Activity “restart” và đã sẵn sàng, nhưng chưa chưa hiện ra vớingười dùng Được theo sau bởi phương thức onResume() nếu Activity đi ra foreground, hoặc onStop() nếu nó ẩn đi
onResume()
Chỉ được gọi khi Activity bắt đầu các tương tác với người dùng Luôn được theo sau bởi phương thức onPause()
onPause()
Gọi trước khi Activity bắt đầu vào trạng thái “paused” Trong phương thức này ta thường sẽ giải phóng bộ nhớ, hoặc dừng các hành động nào đó có thể chiếm dụng nhiều ram, cpu để cho Activity được kích hoạt tiếp theo làm việc trơn tru Theo sau bởi phương thức onResume() nếu Activity được kích hoạt lại (quay về foreground), hoặc onStop() nếu nó ẩn đi
onStop()
Gọi khi Activity không còn được sử dụng nữa Nó có thể sẽ bị hủy bỏ,hoặc có thể sẽ lại được kích hoạt lại từ một Activity khác Theo sau bởi onRestart() nếu nó được kích hoạt lại, hoặc onDestroy() nếu nó bị hủy bỏ bởi hệ thống
onDestroy()
Gọi trước khi Activity thật sự bị hủy bỏ, đây là lời gọi cuối cùng mà Activity có thể thực hiện Phương thức này có thể được gọi bởi vì ở đâu đó có lời gọi finish() hoặc finishActivity(), cũng có thể vì hệ thống cần phải hủybỏ để giải phóng bộ nhớ Không được theo sau bởi phương thức nào
Trang 23Sơ đồ minh hoạ vòng đời Activity
PHẦN 2: XÂY DỰNG ỨNG DỤNG NGHE NHẠC CHO ANDROID
- Xây dựng được chương trình nghe nhạc cho android với các chức năng Play, Pause, Backward, Forward, Previous, Next, Shuffle, Repeate