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ữ... Các đối tượng trong một hệ thống tương đối độ
Trang 1ĐẠ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
Trang 2Mụ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 5
2.1 Mục tiêu 5
2.2 Nhiệm vụ 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 7
6 Kết quả dự kiến 7
6.1 Lý thuyết 7
6.2 Thực tiễn 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 : 81.2 Phân tích thiết kế hệ thống hướng đối tượng : 8
3.2 Cài đặt và phát triển chương trình 54
TIẾN ĐỘ VÀ HOÀN THÀNH KHÓA LUẬN 60
Trang 3LỜ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 hoà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 Hoà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 quá 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 Hoàng Nhật Phương
Trang 4LỜ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 Hoà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 hoàn toàn trách nhiệm.
Sinh viên thực hiện
Ông Hoàng Nhật Phương
Trang 5MỞ ĐẦ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 yê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
Trang 6✓ 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
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 quá 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 quá 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
Trang 7✓ 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
❖ 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ó
Trang 8
CHƯƠNG 1: CƠ SỞ LÝ THUYẾT
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
Ngoà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ọ luôn 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.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 toán vào các đối tượng ngoà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ữ
Trang 9liệ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
Trang 10củ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à hoàn toà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 quá 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.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
Trang 11củ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 đoá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 toá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
Trang 12• 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 Ngoà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
Trang 13Mộ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 Ngoà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
Trang 14onStart():
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 hoàn toà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
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()
Trang 15onStop()
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 hoàn toà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 hoàn toà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
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
Trang 16Hì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
Trang 17miễ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 (ngoà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 Ngoà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
Trang 18Intents 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 ngoà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
Trang 19chú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à hoá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ị
Trang 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
Trang 21
CHƯƠNG 2: PHÂN TÍCH THIẾT KẾ 2.1 Xác định yê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ý:
Trang 22Cuối cùng họ quyết định là phải thay đổi cách mà họ xây dựng
backend, vì họ luôn 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 quá trình xây dựng các hệ thống bên ngoà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à toà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ứ thoã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 chuyên 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ó
Trang 23vớ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
Trang 24sử 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 Ngoà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 đó:
Trang 25Trong 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 https://api.stackexchange.com/2.2/ — 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
Trang 26Tiếp đến tạo Client trong retrofit :
2.1.1.2 Lấy bài hát theo thể loại
SoundCloud là web service mà dữ liệu của nó chia thành nhiều
đường dẫn với nhiều phương thức truy xuất khác nhau Ví dụ đường
dẫn request ra các chuỗi bài hát theo thể loại như sau :
Với hình mô tả ở trên các bạn cũng có thể thấy được đường dẫn
đễ get data khá phức tạp với Client_id – giới thiệu về Client_id thì nó
giống như một key để làm điều kiện để chúng ta có thể truy xuất vào
Trang 27Dưới đây là một khuôn mẫu Json mà developer có thể truy xuất
Trang 28RecyclerView cho phép chúng ta load dữ liệu nhiều hơn ListView, vuốt mượt hơn, hiệu ứng đẹp hơn và hỗ trợ đa dạng layout của các phần
tử trong danh sách
Cách tạo một recycle view như sau :
Ta tạo ra 1 adapter của recycleview kế thừa BaseRecycleViewApdapter
.Sau đó ta implement tất cả các phương thức để hỗ trợ cho recycleView
Bước tiếp theo tại Activity cần hiển thị ta tạo ra View Cho recycleView:
Sau đó ta set data và set Adapter cho recycle view như sau :
Trang 292.1.1.4 Nghe nhạc Online
Trong android có 1 thành phần hỗ trợ để việc phát nhạc được diễn ra
hoàn thành một cách hoàn thiện và trơn tru
MediaPlayer :
Media Player trong Android là một framework hỗ trợ để play những
định dạng như video, nhạc, ảnh trong ứng dụng của mình Bài viết sau
đây trọng tâm việc tìm hiểu về MediaPlayer đã hỗ trợ những gì cho
việc thực hiện những tác vụ liên quan đến media MediaPlayer có thể
hỗ trợ việc play offline hoặc là online tùy chỉnh nhờ vào những API
MediaPlayer
Media Player State Diagram
Dưới đây là trạng thái của MediaPlayer sử dụng để có thể hỗ trợ việc
play các media một cách tốt nhất:
Trang 30Chúng ta có thể thấy được các trạng thái sau là các trạng thái mà media
có thể ở đó:
Idle : Trạng thái ban đầu của Media Player Khi muốn trở về trạng thái
ban đầu của MediaPlayer thì có thể sử dụng phương thức reset()