ĐẠI HỌC ĐÀ NẴNG
TRƯỜNG ĐẠI HỌC SƯ PHẠM
KHOA TIN HỌC
BÁO CÁO KẾT QUẢ
KHÓA LUẬN TỐT NGHIỆP
TÊN ĐỀ TÀI
XÂY DỰNG ỨNG DỤNG NGHE NHẠC TRÊN
NỀN TẢNG ANDROID
GVHD
Sinh viên
Lớp
: TS. Nguyễn Hoàng Hải
: Ơng Hồng Nhật Phương
: 15CNTT1
ĐÀ NẴNG, 04/2019
Mục lục
Mục lục
2
1. Lý do chọn đề tài
5
2. Mục tiêu và nhiệm vụ đề tài
2.1 Mục tiêu
5
2.2 Nhiệm vụ
5
5
3. Đối tượng và phạm vi nghiên cứu 6
3.1. Đối tượng nghiên cứu
6
3.2. Phạm vi nghiên cứu
6
4. Phương pháp nghiên cứu
6
5. Phương tiện, công cụ triển khai
6. Kết quả dự kiến
6.1. Lý thuyết
7
6.2. Thực tiễn
7
7
7
7. Bố cục của khóa luận 7
CHƯƠNG 1: CƠ SỞ LÝ THUYẾT 8
1.1. Khái niệm và nguyên tắc hoạt động của SoundCloud :
1.2. Phân tích thiết kế hệ thống hướng đối tượng : 8
1.3. Ngơn ngữ lập trình Android
10
CHƯƠNG 2: PHÂN TÍCH THIẾT KẾ
22
2.1 Xác định yêu cầu 22
2.2 Phân tích thiết kế 49
CHƯƠNG 3: CÁC KẾT QUẢ CỤ THỂ
3.1 Đánh giá
54
54
3.2 Cài đặt và phát triển chương trình
54
TIẾN ĐỘ VÀ HỒN THÀNH KHĨA LUẬN
60
8
Ứng dụng nghe nhạc
GVHD: TS. Nguyễn Hoàng Hải
3
LỜI CẢM ƠN
Để hoàn thành đồ án thực tập ngoài sự nổ lực của bản thân, em đã nhận
được sự hướng dẫn và giúp đỡ tận tình từ nhiều phía. Tất cả những điều đó đã
trở thành động lực lớn giúp em hồn thành tốt đợt thực tập này. Với tất cả sự
cảm kích em xin gửi lời cảm ơn đến tất cả mọi người.
Trước tiên em xin chân thành cảm ơn thầy TS.Nguyễn Hồng Hải đã nhiệt
tình hỗ trợ, hướng dẫn em trong việc chọn đề tài, hướng tiếp cận, giúp chúng em
chỉnh sửa những thiết sót trong q trình nghiên cứu và em xin gửi lời cảm, sự
tri ân sâu sắc đối với các thầy cô của Khoa Tin Học- Đại học Sư Phạm Đà Nẵng
đã tận tình dạy bảo, giúp đỡ em trong thời gian em học tại trường cũng như
trong thời gian em thực tập vừa.
Em cũng xin gửi lời cảm ơn đến Công ty Framgia Inc ( Sun*) đã tạo điều
kiện cho em được tham gia thực tập tại đơn vị cũng như cung cấp cơ sở vật chất
và trang thiết bị trong thời gian vừa qua. Xin cảm các anh chị trong cơng ty đã
tận tình hướng dẫn giúp đỡ em trong suốt thời gian em tham gia thực tập.
Em xin được gửi lời cảm ơn đến lãnh đạo trường Đại học Sư phạm Đà
Nẵng, lãnh đạo khoa Tin học đã tổ chức các buổi giao lưu giữa doanh nghiệp và
sinh viên giúp em có cơ hội tìm được một đơn vị thực tập tốt.
Xin trân trọng cảm ơn!
Đà Nẵng, ngày 18 tháng 04 năm 2019
Sinh viên thực hiện
Ơng Hồng Nhật Phương
Ơng Hồng Nhật Phương - Lớp 15CNTT (2015-2019)
Ứng dụng nghe nhạc
4
GVHD: TS. Nguyễn Hồng Hải
LỜI CAM ĐOAN
Tơi xin cam đoan:
1. Những nội dung trong báo cáo này là do tôi thực hiện dưới sự hướng dẫn trực
tiếp của TS.Nguyễn Hồng Hải và các anh chị Cơng ty Framgia Inc (Sun*).
2. Mọi tham khảo dùng trong báo cáo này đều được trích dẫn rõ ràng tên tác giả,
tên cơng trình, thời gian, địa điểm cơng bố.
3. Mọi sao chép không hợp lệ, vi phạm quy chế đào tạo, hay gian trá, tơi xin chịu
hồn tồn trách nhiệm.
Sinh viên thực hiện
Ơng Hồng Nhật Phương
Ơng Hồng Nhật Phương - Lớp 15CNTT (2015-2019)
Ứng dụng nghe nhạc
5
GVHD: TS. Nguyễn Hoàng Hải
MỞ ĐẦU
1. Lý do chọn đề tài
Những năm gần đây, sự bùng nổ công nghệ đã làm thay đổi thế giới
mạnh mẽ. Công nghệ thông tin đã lên lỏi vào tất cả các lĩnh vực của đời sống
con người từ kinh tế, giáo dục, kĩ thuật, y khoa, giải trí… Với những điều
diệu kì mang lại cho thế giới có thể nói cơng nghệ thơng tin nói chung và
internet nói riêng đã trở thành một phần tất yếu không thể thiếu trong đời
sống con người.
Việc giải trí thơng qua mạng Internet là điều tất yếu không thể thiếu
trong cuộc sống hằng ngày. Ngày nay, có nhiều loại hình thức giải trí đa dạng
và phổ biến nhưng hơn hết là việc tiện lợi khi chúng ta có thể giải trí trực tiếp
trên điện thoại di động. Đã có rất nhiều ứng dụng được xây dựng và phổ biến
rộng rãi trên mọi phương diện truyền thông và đạt được những thành công
nhất định. Do vậy, em chọn đề tài tạo ra ứng dụng nghe nhạc trên nền tảng
android để giúp cho việc giải trí sau những giờ làm việc căn thẳng cũng như
giải tỏa đi áp lực của công việc .
2. Mục tiêu và nhiệm vụ đề tài
2.1 Mục tiêu
Ứng dụng nghe nhạc giúp mọi người giải tỏa đi áp lực trong công việc và
cuộc sống . Giúp bạn tìm kiếm và lưu trữ được những bài hát hay nhất hay
những nghệ sĩ mà bạn u thích thơng qua Internet hoặc bạn cũng có thể tải
về offline để thuận tiện cho việc giải trí mỗi khi khơng có Internet .
2.2 Nhiệm vụ
Để đạt được mục tiêu trên, thì nhiệm vụ đặt ra của đề tài là:
✓ Thu thập dữ liệu từ Api trả về.
✓ Nắm rõ được các nhu cầu của người dùng đòi hỏi trong một ứng dụng
nghe nhạc .
✓ Nghiên cứu các công nghệ và phần mềm trên nền tảng android để đảm
bảo ứng dụng được vận hành một cách tốt nhất .
Ông Hoàng Nhật Phương - Lớp 15CNTT (2015-2019)
Ứng dụng nghe nhạc
6
GVHD: TS. Nguyễn Hoàng Hải
✓ Xây dựng các chức năng hỗ trợ người dùng sử dụng một cách hiệu quả
nhất.
3. Đối tượng và phạm vi nghiên cứu
3.1. Đối tượng nghiên cứu
➢ Ngơn ngữ lập trình Android.
➢ Api SoundCloud.
➢ Thông tin dữ liệu của bài hát , nghệ sĩ.
➢ Công nghệ Android .
3.2. Phạm vi nghiên cứu
Nghiên cứu dữ liệu thông tin của web service.
Nghiên cứu các thành phần trong android
4. Phương pháp nghiên cứu
4.1. Phương pháp nghiên cứu lí thuyết:
➢ Thu thập các phương thức trả về của web service.
➢ Nghiên cứu công cụ đồ họa như photoshop.
➢ Nghiên cứu ngơn ngữ lập trình android.
➢ Nghiên cứu các thành phần của android.
➢ Phương pháp thu thập tài liệu: thơng qua q trình thu thập tài liệu
từ các nguồn như sách báo, mạng Internet, tổng hợp các tài liệu,
nghiên cứu tài liệu, ngôn ngữ và công cụ liên quan.
➢ Phương pháp phân tích, thiết kế hệ thống: dựa trên những thông tin
thu thập được để tiến hành phân tích, thiết kế hệ thống bao gồm
những chức năng chính của phần mềm sẽ xây dựng thơng qua q
trình mơ hình hóa hệ thống, chuẩn hóa cơ sở dữ liệu một cách phù
hợp.
4.2. Phương pháp nghiên cứu thực nghiệm:
✓ Người dùng cịn có thể lưu các thơng tin cá nhân, xem lại kết quả thi để
đánh giá được sự tiến bộ trong quá trình học và lịch tự học mỗi tuần.
Ơng Hồng Nhật Phương - Lớp 15CNTT (2015-2019)
Ứng dụng nghe nhạc
7
GVHD: TS. Nguyễn Hồng Hải
✓ Phân tích yêu cầu thực tế và xây dựng các bước phân tích hệ thống để
hỗ trợ lập trình, xây dựng ứng dụng. Đánh giá kết quả đạt được, triển
khai, bảo trì.
5. Phương tiện, công cụ triển khai
❖ Hệ điều hành window.
❖ Nền tảng Android.
❖ Web service SoundCloud.
6. Kết quả dự kiến
6.1. Lý thuyết
❖ Nắm được lý thuyết nền tảng về Android .
❖ Đưa ra được phần mềm ứng dụng nghe nhạc dễ dàng tương tác người
dùng.
6.2. Thực tiễn
Xây dựng được trang ứng dụng nghe nhạc trên nền tảng di động Android .
7. Bố cục của khóa luận
Báo cáo của khóa luận dự kiến tổ chức thành 3 chương chính như sau:
• Mở đầu
Giới thiệu lý do chọn đề tài, khách thể và đối tượng nghiên cứu trong
đề tài, giới hạn phạm vi nghiên cứu của đề tài, nhiệm vụ và phương
pháp nghiên cứu của đề tài.
•
Chương 1: Cơ sở lý thuyết.
Nghiên cứu lý thuyết liên quan
• Chương 2: Phân tích thiết kế.
Trình bày phân tích thiết kế hệ thống và phân tích cơ sở dữ liệu.
• Chương 3: Triển khai và kết quả đạt được.
Các kết quả đã đạt được.
• Kết luận và kiến nghị
Đánh giá kết quả đã đạt được, hướng phát triển và các kiến nghị nếu có.
Ơng Hồng Nhật Phương - Lớp 15CNTT (2015-2019)
Ứng dụng nghe nhạc
8
GVHD: TS. Nguyễn Hoàng Hải
CHƯƠNG 1: CƠ SỞ LÝ THUYẾT
1.1.
Khái niệm và nguyên tắc hoạt động của SoundCloud :
1.1.1
Khái niệm :
SoundCloud là một nền tảng trực tuyến chuyên về nhạc và âm
thanh, mà theo họ tự nhận là "nền tảng lớn nhất thế giới về nhạc và âm
thanh", chính thức đi vào hoạt động từ năm 2008. SoundCloud phục vụ
nhiều người, với nhiều mục đích khác nhau. Một số sẽ dùng nó để lưu
trữ nhạc và âm thanh; số khác thì xem đây là một nơi tuyệt vời để tải
lên và phát sóng các podcast .
Ngồi ra, SoundCloud cịn đóng vai trị là nơi các nhạc sỹ có thể
kết nối trực tiếp với người hâm mộ và nghe những ý kiến của họ về các
bài hát mà mình vừa đưa lên. SoundCloud là một nền tảng mở. Một số
dịch vụ stream và lưu trữ âm thanh có các điều khoản sử dụng chặt chẽ,
tạo ra nhiều rào cản phức tạp giữ người dùng và các nội dung của họ.
Cịn đối với SoundCloud, họ ln tìm cách để tối ưu hóa và khiến việc
chia sẻ và stream âm thanh trở nên dễ dàng, minh bạch.
1.1.2
Nguyên tắc hoạt động :
SoundCloud hoạt động trên 6 nền tảng: web (soundcloud.com),
iOS (miễn phí, bạn có thể tải về từ AppStore), Android (miễn phí, bạn
có thể tải về từ PlayStore), Windows 10 (hiện đang là bản beta), Xbox
One (miễn phí, bạn có thể tải về từ Xbox App Store) và Sonos.
1.2.
Phân tích thiết kế hệ thống hướng đối tượng :
Khác với phương pháp hướng cấu trúc chỉ tập trung vào dữ liệu
hoặc vào hành động, phương pháp hướng đối tượng tập trung vào cả
hai khía cạnh của hệ thống là dữ liệu và hành động.
Cách tiếp cận hướng đối tượng là một lối tư duy theo cách ánh xạ
các thành phần trong bài tốn vào các đối tượng ngồi đời thực. Với
cách tiếp cận này, một hệ thống được chia tương ứng thành các thành
phần nhỏ gọi là các đối tượng, mỗi đối tượng bao gồm đầy đủ cả dữ
Ơng Hồng Nhật Phương - Lớp 15CNTT (2015-2019)
Ứng dụng nghe nhạc
9
GVHD: TS. Nguyễn Hoàng Hải
liệu và hành động liên quan đến đối tượng đó. Các đối tượng trong một
hệ thống tương đối độc lập với nhau và phần mềm sẽ được xây dựng
bằng cách kết hợp các đối tượng đó lại với nhau thơng qua các mối
quan hệ và tương tác giữa chúng. Các nguyên tắc cơ bản của phương
pháp hướng đối tượng bao gồm:
• Trừu tượng hóa (abstraction): trong phương pháp hướng đối tượng,
các thực thể phần mềm được mơ hình hóa dưới dạng các đối tượng.
Các đối tượng này được trừu tượng hóa ở mức cao hơn dựa trên thuộc
tính và phương thức mơ tả đối tượng để tạo thành các lớp. Các lớp
cũng sẽ được trừu tượng hóa ở mức cao hơn nữa để tạo thành một sơ
đồ các lớp được kế thừa lẫn nhau. Trong phương pháp hướng đối
tượng có thể tồn tại những lớp khơng có đối tượng tương ứng, gọi là
lớp trừu tượng. Như vậy, nguyên tắc cơ bản để xây dựng các khái
niệm trong hướng đối tượng là sự trừu tượng hóa theo các mức độ
khác nhau.
• Tính đóng gói (encapsulation) và ẩn dấu thơng tin: các đối tượng
có thể có những phương thức hoặc thuộc tính riêng mà các đối tượng
khác không thể sử dụng được. Dựa trên nguyên tắc ẩn giấu thông tin
này, cài đặt của các đối tượng sẽ hoàn toàn độc lập với các đối tượng
khác, các lớp độc lập với nhau và cao hơn nữa là cài đặt của hệ thống
hoàn toàn độc lập với người sử dụng cũng như các hệ thống khác sử
dụng kết quả của nó.
• Tính modul hóa (modularity): các bài toán sẽ được phân chia thành
những vấn đề nhỏ hơn, đơn giản và quản lý được.
• Tính phân cấp (hierarchy): cấu trúc của một hệ thống hướng đối
tượng là dạng phân cấp theo các mức độ trừu tượng từ cao đến thấp.
Ưu điểm nổi bật của phương pháp hướng đối tượng là đã giải quyết
được các vấn đề nảy sinh với phương pháp hướng cấu trúc:
•
Hỗ trợ sử dụng lại mã nguồn: Chương trình lập trình theo phương
pháp hướng đối tượng thường được chia thành các gói là các nhóm
Ơng Hoàng Nhật Phương - Lớp 15CNTT (2015-2019)
Ứng dụng nghe nhạc
10
GVHD: TS. Nguyễn Hoàng Hải
của các lớp đối tượng khác nhau. Các gói này hoạt động tương đối độc
lập và hồn tồn có thể sử dụng lại trong các hệ thống thơng tin tương
tự.
• Phù hợp với các hệ thống lớn: Phương pháp hướng đối tượng không
chia bài toán thành các bài toán nhỏ mà tập trung vào việc xác định
các đối tượng, dữ liệu và hành động gắn với đối tượng và mối quan hệ
giữa các đối tượng. Các đối tượng hoạt động độc lập và chỉ thực hiện
hành động khi nhận được yêu cầu từ các đối tượng khác. Vì vậy,
phương pháp này hỗ trợ phân tích, thiết kế và quản lý một hệ thống
lớn, có thể mơ tả các hoạt động nghiệp vụ phức tạp bởi q trình phân
tích thiết kế khơng phụ thuộc vào số biến dữ liệu hay số lượng thao tác
cần thực hiện mà chỉ quan tâm đến các đối tượng tồn tại trong hệ
thống đó.
Phân tích thiết kế hướng đối tượng đã và đang là xu hướng thống
lĩnh thị trường lập trình phần mềm di động cũng như lập trình web hiện
nay. Phân tích thiết kế hướng đối tượng, được định nghĩa đơn giản là:
xem hệ thống gồm những đối tượng nào và những đối tượng đó tương
tác với nhau ra sao, từ đó giúp cho người phân tích viên hiểu rõ hệ
thống và cách cài đặt nó.
1.3.
Ngơn ngữ lập trình Android
1.3.1 Lịch sử phát triển :
Vào tháng 10/2003, trước khi thuật ngữ “điện thoại thông minh”
được hầu hết công chúng sử dụng và vài năm trước khi Apple công bố
iPhone đầu tiên và hệ điều hành iOS, công ty Android Inc được thành
lập ở Palo Alto, California. Bốn người sáng lập là Rich Miner, Nick
Sears, Chris White và Andy Rubin. Vào thời điểm thành lập, ơng Rubin
nói rằng Android Inc sẽ phát triển “thiết bị di động thông minh hơn hơn
về vị trí và sở thích của chủ sở hữu”.
Google mua lại Tổng công ty Android vào ngày 17 tháng 8 năm
2005, biến nó thành một bộ phận trực thuộc Google. Những nhân viên
Ơng Hồng Nhật Phương - Lớp 15CNTT (2015-2019)
Ứng dụng nghe nhạc
11
GVHD: TS. Nguyễn Hoàng Hải
của chủ chốt của Tổng công ty Android, gồm Rubin, Miner và White,
vẫn tiếp tục ở lại công ty làm việc sau thương vụ này. Vào thời điểm đó
khơng có nhiều thơng tin về Tổng cơng ty, nhưng nhiều người đồn
đốn rằng Google dự tính tham gia thị trường điện thoại di động sau
bước đi này. Tại Google, nhóm do Rubin đứng đầu đã phát triển một
nền tảng thiết bị di động phát triển trên nền nhân Linux. Google quảng
bá nền tảng này cho các nhà sản xuất điện thoại và các nhà mạng với
lời hứa sẽ cung cấp một hệ thống uyển chuyển và có khả năng nâng
cấp. Google đã liên hệ với hàng loạt hãng phần cứng cũng như đối tác
phần mềm, bắn tin cho các nhà mạng rằng họ sẵn sàng hợp tác với các
cấp độ khác nhau
1.3.2 Khái quát về ngơn ngữ Android :
Ngơn ngữ lập trình là một tập con của ngơn ngữ máy tính, được
thiết kế và chuẩn hóa để truyền các chỉ thị cho các máy có bộ xử lý
(CPU), nói riêng là máy tính. Ngơn ngữ lập trình được dùng để lập
trình máy tính, tạo ra các chương trình máy nhằm mục đích điều khiển
máy tính hoặc mơ tả các thuật tốn để người khác đọc hiểu.
Nếu bạn muốn phát triển ứng dụng di động android, bạn cần biết ngơn
ngữ lập trình để xây dựng nó. Các ngơn ngữ lập trình adroid gồm có:
• Java
Dựa vào chỉ số TIOBE, Java là ngơn ngữ lập trình phổ biến nhất tính
đến tháng sáu năm 2017. Nếu bạn đang có ý định xây dựng một ứng
dụng Android, tỉ lệ lớn là bạn sẽ làm việc với Java. Với một cộng đồng
developer lớn mạnh được thành lập từ khá lâu, bạn sẽ dễ dàng nhận
được sự hỗ trợ và giúp đỡ về chuyên môn.
Vậy nên khi bạn phát triển ứng dụng di động bằng Java, bạn có thể thỏa
sức sáng tạo để xây dựng bất kì loại ứng dụng nào mà bạn muốn. Hạn
chế duy nhất chỉ có thể chính là sức sáng tạo của bạn hay sự hạn chế
trong kiến thức của bạn về Java.
Ơng Hồng Nhật Phương - Lớp 15CNTT (2015-2019)
Ứng dụng nghe nhạc
12
GVHD: TS. Nguyễn Hồng Hải
• Kotlin
Kotlin là ngơn ngữ lập trình được phát triển bởi JetBrains, một cơng ty
Cộng Hịa Czech phát triển ItelliJ IDEA, một IDE khá nổi tiếng. Đội
ngũ lập trình Android của Google gần đây đã thơng báo về việc họ
đang chính thức thêm hỗ trợ cho Kotlin.Kotlin được phát triển để giải
quyết một vài vấn đề tồn tại trong Java. Theo đa số người ủng hộ việc
dùng Kotlin, thì syntax của nó đơn giản và gọn hơn, do đó ít dẫn tới
xảy ra việc dịng code rườm rà, dài dịng. Điều này có tác dụng giúp
người viết tâp trung trong việc giải quyết vấn đề hơn là cố xoay sở với
những câu lệnh dài dịng phức tạp. Ngồi ra, bạn cịn có thể kết hợp
Kotlin và Java cùng nhau trong dùng một dự án, khai thác hết thế mạnh
của cả 2 ngôn ngữ.
1.3.3 Một số thành phần chính của Android :
Các thành phần (component) cơ bản tạo nên một ứng dụng
Android được chia thành 4 loại chính. Nắm bắt được các thành phần
này rất cần thiết cho việc lập trình
Hình 1.0
• Activities :
Ơng Hoàng Nhật Phương - Lớp 15CNTT (2015-2019)
Ứng dụng nghe nhạc
13
GVHD: TS. Nguyễn Hoàng Hải
Một Activity được xem như một điểm tiếp xúc với người dùng. Nó là
một màn hình đơn với giao diện trên đó. Ví dụ các bạn cài và chạy lên
ứng dụng này thì màn hình chạy lên các bạn sẽ thấy giao diện hiện thị
cho chúng ta xem, đó là một Activity. Activty giúp người dùng tương
tác với hệ thống, thực hiện các chức năng cần thiết trên đó, chuyển đổi
qua lại giữa các màn hình giao diện/ chức năng.
Thường thường khi sử dụng Activity chúng ta sẽ kết thừa từ lớp cha
của nó là Activity ( tất nhiên hiện tại Android SDK ở các phiên bản
mới đã có nhiều subActivity hỗ trợ chúng ta trong từng trường hợp
thuận tiện ).
Hình 2.0 Vịng đời của một Activity trong android
onCreate()
Hàm này được gọi khá sớm, ngay khi activity được kích hoạt và thầm chí
người cịn chưa thấy gì cả thì callback này đã đc gọi rồi. Ngồi ra thì bạn
nên biết là callback này chỉ được gọi một lần duy nhất khi Activity được
khởi tạo. Nó có thể được gọi lại nếu hệ thống xóa Activity này đi để lấy lại
tài nguyên của hệ thống, nhưng rất hiếm khi xảy ra. Và nó cịn có thể được
gọi lại nếu bạn xoay màn hình ngang/dọc.
Ơng Hoàng Nhật Phương - Lớp 15CNTT (2015-2019)
Ứng dụng nghe nhạc
14
GVHD: TS. Nguyễn Hoàng Hải
onStart():
Sau khi gọi đến onCreate(), hệ thống sẽ gọi đến onStart(). Hoặc hệ thống
cũng sẽ gọi lại onStart() sau khi gọi onRestart() nếu trước đó nó bị che
khuất bởi Activity nào khác (một màn hình khác hoặc một ứng dụng khác)
che hồn tồn và rơi vào onStop().
Khi hệ thống gọi đến callback này thì Activity được nhìn thấy bởi người
dùng và nhưng chưa tương tác được. Bởi đặc tính này mà onStart() ít được
dùng đến.
onResume ():
Khi hệ thống gọi đến callback này thì bạn yên tâm rằng người dùng đã
nhìn thấy và đã tương tác được với giao diện.
onResume() được gọi khi Activity được khởi tạo rồi và bước qua onStart()
trên kia. Hoặc khi Activity bị một giao diện nào khác che đi một phần
(hoặc tồn phần), rồi sau đó quay lại Activity hiện tại. Bạn có thể thấy rằng
callback này được gọi rất nhiều lần trong một vịng đời của nó.
Chính đặc điểm này của onResume() mà bạn có thể tận dụng để quay lại
tác vụ mà người dùng đang bị dang dở khi onPause() (được nói đến dưới
đây) được gọi.
onPause()
Thơng thường nếu có một thành phần nào đó che Activity hiện tại mà
người dùng vẫn nhìn thấy Activity đó (nhìn thấy chứ không tương tác
được). Chẳng hạn một popup hiện lên trên Activity. Thì onPause() của
Activity sẽ được gọi. Sau này khi người dùng quay lại Activity thì
onResume() sẽ được gọi.
Bạn có thể tưởng tượng rằng onPause() cũng sẽ được gọi khá nhiều lần
trong một vòng đời Activity. Theo như Google thì onPause() được gọi đến
khá nhanh, nếu bạn muốn lưu trữ dữ liệu như mình nói trên kia, thì nên lưu
những gì nhanh gọn lẹ thơi. Nếu bạn muốn lưu trữ các dữ liệu nặng, hoặc
gọi API kết nối server chỗ này, nhiều khả năng ứng dụng sẽ không kịp
thực hiện. Do đó, thay vì làm các thao tác nặng nề ở onPause(), bạn có thể
cân nhắc gọi chúng ở onStop().
Ơng Hồng Nhật Phương - Lớp 15CNTT (2015-2019)
Ứng dụng nghe nhạc
15
GVHD: TS. Nguyễn Hồng Hải
onStop()
Như mình có nói. onStop() được gọi khi Activity khơng cịn được nhìn
thấy nữa, có thể một màn hình nào khác che lên hồn tồn, có thể một ứng
dụng nào đó vào foreground, hoặc người dùng nhấn nút Home để về màn
hình chính.
Bạn có thể tận dụng onStop() để lưu trữ dữ liệu ứng dụng. Hoặc để giải
phóng các tài nguyên đang dùng. Ngưng các API còn đang gọi dang dở.
Tuy nhiên khi onStop() được gọi không phải là lúc chúng ta cũng nói lời
tạm biệt Activity. Như mình đã nói, người dùng hồn tồn có thể quay lại
sử dụng Activity sau đó mà khơng cần phải khởi động lại Activity, khi này
thì phương thức onRestart() và onStart() được gọi kế tiếp nhau.
onDestroy()
Bạn có thể tận dụng callback này để giải phóng các tài nguyên hệ thống
mà ở onStop() bạn chưa gọi đến.
Vòng đời của một Activity kết thúc ở đây.
⚫ Services
Service có chức năng giúp ứng dụng vẫn chạy được, nhưng không cần
hiện thị trên giao diện (gọi là chạy ngầm bên dưới ). Ví dụ các bạn
dùng các ứng nghe nhạc, mặc dù các bạn tắt ứng dụng rồi nhưng vẫn
nghe được nhạc ( đó là vì nó đang chạy dưới nền /background ). Chúng
ta có thể liên kết/ kết nối giữa một Activity với một service, ví dụ: khi
download một file từ trên mạng, việc download thực hiện ở service, sau
đó sẽ trả kết quả phần trăm download lên activity để hiện thị cho người
dùng biết.
Chú ý: mặc dù service chạy ở chế độ background nhưng cần phân biệt
giữa service và thread. Service khơng phải thread, do đó tùy trường hợp
mà chúng ta sử dụng và xử lý cho phù hợp để tránh trường hợp sử dụng
service làm ứng dụng bị đơ/ chậm khi sử lý các luồng dữ liệu/ giao diện
khác.
Ơng Hồng Nhật Phương - Lớp 15CNTT (2015-2019)
Ứng dụng nghe nhạc
16
GVHD: TS. Nguyễn Hồng Hải
Hình 3.0 Mơ tả Service trong android
Foreground Service.
Một Foreground Service thực hiện một số thao tác mà người dùng chú
ý, có thể thấy rõ ràng. Ví dụ một ứng dụng nghe nhạc có thể chơi một
bản nhạc và control nó bằng Foreground Service. Một điều bắt buộc là
Foreground Service phải hiện thị một Notification. Foreground Service
sẽ tiếp tục chạy ngay cả khi người dùng không tương tác với ứng dụng.
Background Service.
Một Background Service sẽ thực hiện các hoạt động mà không được
người dùng chú ý trực tiếp. Ví dụ một ứng dụng sử dụng một service để
thu gom bộ nhớ chẳng hạn thì service là một Background Service, hoạt
động mà người dùng không cần thiết phải để ý.
Bound Service.
Một service được gọi là Bound khi một thành phần của ứng dụng ràng
buộc với nó bởi lời gọi bindService(). Một Bound Service cung cấp một
giao diện Client - Server cho phép các thành phần tương tác với nó: gửi
yêu cầu, nhận kết quả và thậm chí là IPC. Một Bound Service chỉ chạy
Ơng Hồng Nhật Phương - Lớp 15CNTT (2015-2019)
Ứng dụng nghe nhạc
17
GVHD: TS. Nguyễn Hồng Hải
miễn là có một thành phần ràng buộc với nó. Có thể có nhiều thành
phần ràng buộc với Bound Service cùng lúc, nhưng khi tất cả tháo bỏ
ràng buộc (unbound) thì nó sẽ Destroy. Trước đây Service thường được
chia là Started Service và Bound Service.
⚫ Broadcast receivers
Broadcast receiver được sử dụng trong nhiều trường hợp, ví dụ: chúng
ta có thể chuyển dữ liệu từ service lên activity (ngồi sử dụng binding)
chúng ta có thể sử dụng broadcast để gửi dữ liệu. Hoặc trong các ứng
dụng như hẹn giờ, khi đến giờ hẹn, ứng dụng sẽ sử dụng broadcast báo
thức, tạo ra notification trên màn hình để báo cho người dùng biết.Khi
sử dụng broadcast receiver chúng ta kế thừa từ BroadcastReceiver
⚫ Content providers
Content provider quản lý các cách để ứng dụng có thể lưu trữ dữ liệu
trên hệ thống. Chúng ta sẽ biết cụ thể về thành phần này khi xây dựng
các ứng dụng cần lưu trữ vào SQLite. Ví dụ các ứng dụng từ điển, các
bạn sẽ thấy dữ liệu, từ vựng chúng ta tra hiện thị, thì dữ liệu hiện thị đó
được lưu trữ trong Slite và Content provider gọi để lấy ra cho người
dùng xem. Ngồi ra thành phần này cịn thực hiện các chức năng, thêm,
sửa, xóa dữ liệu…
Và một số thành phần khác như là :
⚫ Intent :
Hình 4.0 Mơ tả Intent trong android
Ơng Hồng Nhật Phương - Lớp 15CNTT (2015-2019)
Ứng dụng nghe nhạc
18
GVHD: TS. Nguyễn Hoàng Hải
Intents là một thành phần quan trọng trong android. Nó cho phép các
thành phần ứng dụng có thể yêu cầu các hàm từ các thành phần ứng
dụng android khác. Ví dụ một activity có thể chạy một activity khác ở
bên ngồi để chụp ảnh.
Intents là một objects của android.content.Intent. Intents sẽ được gửi
đến hệ thống android để xác định hành động bạn muốn thực hiện, đối
tượng bạn muốn xử lý.
Intents có thể bao gồm dữ liệu thông qua Bundle. Bundle giống như
một cái hộp. Bên nhận sẽ mở bundle ra nhờ key và lấy ra dữ liệu
⚫ SQLite
Là cơ sở dữ liệu nhỏ tương tự như MySQL, SQL server… với đặc điểm
là nhỏ , gọn và nhẹ.Trong lập trình android thì SQLite sẽ được lưu
trong ổ đĩa của thiết bị chứ không phải lưu trên server hay bất kì nơi
nào khác.
Việc truy vấn trong SQLite sẽ tương tự như các hệ cơ sở dữ liệu khác
nên bạn sẽ khơng phải gặp khó khăn gì khi sử dụng và bạn cũng chẳng
cần user , mật khẩu khi truy cập vào trong database gì cả.
Hình 5.0 Mơ tả các chức năng của sql
1.3.4 Mơ hình MVP :
MVP là một mơ hình kiến trúc hướng giao diện người dùng, được thiết
kế để tạo thuận lợi cho việc kiểm thử đơn vị (unit testing) và tăng tính
tách biệt giữa tầng dữ liệu và tầng hiển thị dữ liệu trong mơ hình MVC.
Mơ hình MVP cho phép tách tầng trình diễn (Presenter) ra khỏi tầng dữ
liệu (Model), vì vậy tương tác với giao diện được tách biệt với cách
Ơng Hồng Nhật Phương - Lớp 15CNTT (2015-2019)
Ứng dụng nghe nhạc
19
GVHD: TS. Nguyễn Hoàng Hải
chúng ta biểu diễn nó trên màn hình (View), hay nói cách khác, tất cả
logic khi người dùng tương tác được tách ra và đưa vào tầng trình diễn.
Thiết kế lý tưởng nhất là với cùng một logic được áp dụng cho nhiều
View khác nhau và hốn đổi được cho nhau.
Hình 6.0 : Mơ hình đặc tả MVP
Trong đó:
• Model là một interface xác định cách mà dữ liệu được hiển thị trong
giao diện người dùng.
• View là một giao diện người dùng thụ động hiển thị dữ liệu (Model) và
tiếp nhận tương tác người dùng và truyền tới để Presenter xử lý tương
tác.
• Presenter được ví như middle-man. Khi người dùng tương tác
với View, Presenter tiếp nhận tương tác người dùng và update Model.
Khi Model được update hay có thay đổi, Presenter lấy dữ liệu
từ Model, định dạng và đưa tới View để hiển thị.
Ơng Hồng Nhật Phương - Lớp 15CNTT (2015-2019)
Ứng dụng nghe nhạc
GVHD: TS. Nguyễn Hoàng Hải
20
Điểm khác biệt dễ thấy nhất ở đây khi so sánh mơ hình MVP với mơ
hình
MVC
chính
là
vị
trí
cũng
như
chức
năng
của
tầng Presenter và View so với tầng Controller:
Trong mơ hình MVP, tầng View là tầng duy nhất tiếp nhận tương tác
người dùng thay vì cả 2 tầng View và tầng Controller trong mơ hình
MVC. Logic xử lý tương tác cũng như logic xử lý dữ liệu hiển thị được
tách ra trong tầng Presenter thay vì được gộp chung với tiếp nhận tương
tác trong Controller.
Ơng Hồng Nhật Phương - Lớp 15CNTT (2015-2019)
Ứng dụng nghe nhạc
21
GVHD: TS. Nguyễn Hoàng Hải
CHƯƠNG 2: PHÂN TÍCH THIẾT KẾ
2.1 Xác định u cầu
2.1.1 Mơ tả chức năng chính
2.1.1.1 Lấy dữ liệu từ Api SoundCloud
Ở SoundCloud trong các buổi nói chuyện họ hay gọi hệ thống này
bằng một cái tên khá kêu: “Tàu Mẹ” (Mothership). Một kiến trúc như
thế đã tỏ ra là một giải pháp tốt để xây dựng một sản phẩm mới được
sử dụng bởi hàng trăm nghìn nghệ sĩ trên khắp thế giới để chia sẽ
những bài hát, những bản nháp ra cộng đồng yêu âm nhạc.
Mã nguồn lập trình trên Rail chứa tất cả các API Public, mở ra để
hàng nghìn các dịch vụ khác sử dụng, và luôn cả phần web application
của Soundcloud.com. Với việc ra mắt phiên bản kế tiếp The Next
SoundCloud vào năm 2012, họ đã đưa một tập API và được sử dụng
chung cho tất cả các phiên bản iOS/Android, ứng dụng web trên trang
soundcloud.com, bao gồm luôn các dịch vụ khác của đối tác và các
nhà phát triển.
Vào thời điểm đấy, cứ mỗi phút trơi qua thì có 12 giờ âm nhạc được
tải lên, và hàng trăm triệu người dùng nền tảng này mỗi ngày.
Soundcloud phải đối mặt với những thách thức mở rộng hệ thống cả
về mạng xã hội lẫn nền tảng phân phối âm nhạc. Để mở rộng nền tảng
dưa trên Rails đến mức đấy, họ phát triển và đóng góp cho cộng đồng
khá nhiều thư viện cũng như các cơng cụ để giúp xử lý:
• Các vấn đề về chuyển dữ liệu giữa các database
• Tối ưu truy xuất database trên Rails
• Sử lý một lượng lớn message
• Và nhiều cơng cụ khác
Ơng Hồng Nhật Phương - Lớp 15CNTT (2015-2019)
Ứng dụng nghe nhạc
22
GVHD: TS. Nguyễn Hoàng Hải
Cuối cùng họ quyết định là phải thay đổi cách mà họ xây dựng
backend, vì họ ln cảm thấy mình chỉ đang chấp vá hệ thống và
không giải quyết triệt để vấn đề mở rộng hệ thống ở mức cơ bản. Việc
đầu tiên cần phải làm là thay đổi kiến trúc của hệ thống. Họ quyết
định chuyển sang hướng thiết kế kiến trúc microservice . Trong cách
thiết kế này, kỹ sư phải chia nhỏ hệ thống lớn thành những thành phần
rất nhỏ. Mỗi thành phần phải được thiết kế sao cho xử lý trọn vẹn
nghiệp vụ mà nó đảm nhận - bao gồm luôn cả tầng lưu trữ dữ liệu
cũng như nền tảng mà nó cần (tham khảo thêm về Bounded Context)
Sử dụng Scala và Finagle xây dựng Microservices ở SoundCloud
Ruby on Rails
Ở hai phần trước, chúng ta đã cũng xem cách mà các kỹ sư ở
SoundCloud mang các tính năng từ một cục nguyên khối dùng Ruby
on Rails ra thành các microservices. Và trong phần này chúng ta sẽ đi
vào chi tiết hơn về nền tảng và ngôn ngữ mà họ sử dụng dể triển khai
các microservices đấy.
Vào thời điểm họ bắt đầu q trình xây dựng các hệ thống bên ngồi
“Tàu Mẹ” (Rails monolith), họ cũng chia nhỏ đội kỹ thuật ra thành
nhiều nhóm nhỏ, và mỗi nhóm nhỏ sẽ phụ tránh một phần nhỏ nằm
trong toàn bộ hệ thống của SoundCloud.
Đó là một giai đoạn thử nghiệm lớn, thay vì xác định một ngơn ngữ
mà tồn bộ thành viên sẽ sử dụng chung, thì họ cho phép bất cứ ngơn
ngữ nào mà developer cảm thấy tự tin để đưa vào sản phẩm, thì
developer cứ thỗi mái sử dụng chúng.
Điều này dẫn đến một vụ bùng nổ của ngôn ngữ. Họ có những hệ
thống được phát triền từ nhiều ngơn ngữ khác nhau từ Perl cho đến
Julia, bao gồm luôn cả Haskell, Erlang và node.js
Trong khi quá trình này tỏ ra khá hiệu quả trong việc tạo ra các hệ
thống mới, thì họ bắt đầu gặp vấn đề khi vận hành và bảo trì chúng.
Vấn đề về việc kế thừa những gì đã làm khi có một thành viên trong
team rời khỏi là rất thấp (xem thêm khái niệm bus factor), và cuối
cùng họ đã quyết định củng cố lại các công cụ mà họ sử dụng.
Java Virtual Machine
Dựa trên sở thích và kiến thức chun mơn của mỗi nhóm, kết hợp với
đánh giá của cộng đồng và các đồng nghiệp, họ đã quyết định gắn bó
Ơng Hồng Nhật Phương - Lớp 15CNTT (2015-2019)
Ứng dụng nghe nhạc
23
GVHD: TS. Nguyễn Hoàng Hải
với JVM (Java Virtual Machine) họ lựa cho JRuby, Clojure và Scala là
các ngơn ngữ chính được sử dụng để phát triển tất các sản phẩm. Các
công cụ để quản lý và vận hành thì họ sử dựng Go và Ruby.
Hóa ra việc lựa chọn nền tảng và ngôn ngữ chỉ là một bước nhỏ trong
quá trình xây dựng sản phẩm theo kiến trúc microservice. Một khía
cạnh khá quan trọng khác trong việc tổ chức các microservices là: giao
tiếp giữa các microservices (RPC), khả năng phục hồi (resilience), và
xử lý đồng thời giữa các microservices (concurrency).
Sau khi tìm hiểu và tạo ra một vài bản mẫu thì họ kết thúc với ba sự lựa
chọn:
•
Sử dụng thuần Netty để triển khai.
•
Sử dụng bộ sậu của Netflix.
•
Cuối cùng là bộ sậu Finagle.
Việc sử dụng thuần Netty khá là hấp ở giai đoạn ban đầu, với hướng đi
này có rất nhiều tài liệu tốt để nghiên, sự cập nhật từ cộng đồng, có hỗ
trợ HTTP, giao thức để thực hiện gọi qua các microservice khác khá
tốt. Nhưng sau một thời gian họ cảm thấy họ phải bắt đầu xây dựng lại
hầu hết các tính năng của hệ thống như: khả năng phục hồi và xử lý
đồng thời giữ các microservices. Với yêu cầu như thế họ muốn sử dụng
những thứ đã có sẵn hơn là đi phát minh lại bánh xe.
Trên đây là một số lý thuyết về web service Sound Cloud , tiếp đến sẽ
là việc apply web service vào app android với những thành phần trong
android hỗ trợ đáng kể như :
Retrofit :
Retrofit là một HTTP client type-safe cho Android và Java. Retrofit
giúp dễ dàng kết nối đến một dịch vụ REST trên web bằng cách chyển
đổi API thành Java Interface. Trong bài này, tơi sẽ hướng dẫn bạn cách
Ơng Hồng Nhật Phương - Lớp 15CNTT (2015-2019)
Ứng dụng nghe nhạc
24
GVHD: TS. Nguyễn Hoàng Hải
sử dụng một trong những thư viện HTTP phổ biến nhất và được khuyến
dùng nhất cho Android.
Thư viện mạnh mẽ này giúp bạn dễ dàng xử lý dữ liệu JSON hoặc
XML sau đó phân tích cú pháp thành Plain Old Java Objects (POJOs).
Tất cả các yêu cầu GET, POST, PUT, PATCH, và DELETE đều có thể
được thực thi.
Giống như hầu hết các phần mềm mã nguồn mở khác, Retrofit được
xây dựng dựa trên một số thư viện mạnh mẽ và công cụ khác. Đằng sau
nó, Retrofit làm cho việc sử dụng OkHttp (từ cùng một nhà phát triển)
để xử lý các yêu cầu trên mạng. Ngồi ra, Retrofit khơng tích hợp bất
kỳ một bộ chuyển đổi JSON nào để phân tích từ JSON thành các đối
tượng Java. Thay vào đó nó đi kèm với các thư viện chuyển đổi JSON
sau đây để xử lý điều đó:
Gson: com.squareup.retrofit:converter-gson
Jackson: com.squareup.retrofit:converter-jackson
Moshi: com.squareup.retrofit:converter-moshi
Protobuf: com.squareup.retrofit2:converter-protobuf
Wire: com.squareup.retrofit2:converter-wire
Việc phát triển thư viện HTTP type-safe của chính bạn để giao tiếp với
REST API có thể thật sự là một điều khó khăn: bạn phải xử lý nhiều
chức năng chẳng hạn như tạo các kết nối, lưu trữ cach, thử lại các yêu
cầu thất bại, phân tích luồng phản hồi, xử lý lỗi, và nhiều hơn nữa.
Retrofit, mặt khác, được hoạch định rất tốt, có tài liệu hướng dẫn và
kiểm đã được kiểm thử—một thư viện đã được thử nghiệm rất nhiều
trong thực tế sẽ giúp bạn tiết kiệm rất nhiều thời gian q báu và giảm
bớt căng thẳng.
Ơng Hồng Nhật Phương - Lớp 15CNTT (2015-2019)
Ứng dụng nghe nhạc
25
GVHD: TS. Nguyễn Hoàng Hải
Trong hướng dẫn này, tơi sẽ giải thích cách sử dụng Retrofit 2 để xử lý
yêu cầu trên mạng bằng cách xây dựng một ứng dụng đơn giản để truy
vấn những câu trả lời gần đây từ Stack Exchange API. Chúng ta sẽ thực
hiện các yêu cầu GET bằng cách thiết lập một endpoint — /answers,
nối nó vào URL cơ bản — sau đó
nhận kết quả và hiển thị chúng trong một recycler view. Tôi cũng sẽ
hướng dẫn bạn cách làm thế nào để làm điều này với RxJava để dễ
dàng quản lý dịng trạng thái và dữ liệu.
Và từ đó ta tạo ra các model ứng theo các dữ liệu trả về từ File Json , ví
dụ :
Để có thể convert thì ta cần có các SerializedName tương ứng với các
thuộc tính trong file json .
Ơng Hồng Nhật Phương - Lớp 15CNTT (2015-2019)