1. Trang chủ
  2. » Công Nghệ Thông Tin

Bài giảng Lập trình di động android: Phần 1 - ThS. Bùi Trung Úy

89 12 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 89
Dung lượng 5,56 MB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Cấu trúc

  • Chương 1. TỔNG QUAN VỀ LẬP TRÌNH ANDROID (4)
    • 1.1. H ệ điề u hành Android (4)
      • 1.1.1. Android là gì? (4)
      • 1.1.2. Các phiên bản Android (5)
      • 1.1.3. Các đặc trưng củ a Android (8)
    • 1.2. Ki ế n trúc phân t ầ ng Android (software stack) (11)
    • 1.3. Môi trường phát triển ứng dụng Android (13)
      • 1.3.1. Các công c ụ và thi ế t l ậ p chung (13)
      • 1.3.2. Android Studio IDE (15)
  • Chương 2. XÂY DỰNG ỨNG DỤNG ANDROID (18)
    • 2.1. Cơ bả n v ề ứ ng d ụ ng Android (18)
      • 2.1.1. Các thành ph ầ n chính c ủ a ứ ng d ụ ng (19)
      • 2.1.2. Tính tương thích thiết bị (20)
    • 2.2. T ạ o m ộ t ứ ng d ụng đơn giả n – HelloAndroid (21)
      • 2.2.1. T ạ o d ự án m ớ i (21)
      • 2.2.2. Tổng quan về cấu trúc dự án Android (25)
    • 2.3. Activity và cơ chế ho ạt độ ng (29)
      • 2.3.1. Activity là gì? (29)
      • 2.3.2. Các trạng thái Activity (30)
      • 2.3.3. Vòng đờ i c ủ a Activity (Activity Lifecycle) (31)
    • 2.4. Intent và tương tác giữ a các Activity (37)
      • 2.4.1. Intent là gì? (37)
      • 2.4.2. S ử d ụng đối tượ ng Intent (38)
      • 2.4.3. Truy ề n d ữ li ệ u gi ữ a các Activity (39)
      • 2.4.4. Lấy kết quả trả về từ Activity thông qua Intent (40)
      • 2.4.5. B ộ l ọ c Intent (Intent Filter) (41)
    • 2.5. Resource trong ứ ng d ụ ng Android (42)
      • 2.5.1. Resource (tài nguyên) là gì? (42)
      • 2.5.2. Các loại tài nguyên (43)
      • 2.5.3. Truy c ậ p vào tài nguyên (45)
  • Chương 3. LẬP TRÌNH GIAO DIỆN ANDROID (47)
    • 3.1. T ổ ng quan v ề giao di ệ n Android (47)
    • 3.2. Phương pháp tạ o giao di ệ n (49)
      • 3.2.1. T ạ o view b ằ ng mã ngu ồ n Java (49)
      • 3.2.2. Tạo view bằng XML (55)
      • 3.2.3. T ạ o view b ằ ng công c ụ tr ự c quan (56)
    • 3.3. B ố c ụ c giao di ệ n (Layout) (60)
      • 3.3.1. FrameLayout (60)
      • 3.3.2. Linear Layout (62)
      • 3.3.3. Relative Layout (64)
      • 3.3.4. TableLayout (66)
      • 3.4.5. ConstraintLayout (67)
    • 3.5. X ử lý s ự ki ệ n trên giao di ệ n (72)
    • 3.6. S ử d ụ ng View trên giao di ệ n (77)
      • 3.6.1. Các view cơ bản (77)
      • 3.6.2. S ử d ụ ng hình ả nh trong Android (83)
  • Chương 4. FRAGMENT VÀ GIAO DIỆN NÂNG CAO (0)
    • 4.1. Android Fragment (0)
      • 4.1.1. Fragment là gì? (0)
      • 4.1.2. S ử d ụ ng Fragment (0)
      • 4.1.3. Vòng đời của Fragment (0)
    • 4.2. Trình đơn (menu) và hộ p tho ạ i (dialog) (0)
      • 4.2.1. S ử d ụng trình đơn (menu) (0)
      • 4.2.2. S ử d ụ ng h ộ p tho ạ i (dialog) (0)
    • 4.3. Các điề u khi ể n hi ể n th ị d ạ ng danh sách (0)
      • 4.3.1. S ử d ụ ng ListView (0)
      • 4.3.2. Sử dụng SpinnerView (0)
      • 4.3.3. S ử d ụ ng GridView (0)
  • Chương 5. QUẢN LÝ DỮ LIỆU TRONG ANDROID (0)
    • 5.1. D ữ li ệ u trong Assets (0)
    • 5.2. D ữ li ệ u trong SharedPreferences (0)
    • 5.3. Lưu trữ d ữ li ệ u trên b ộ nh ớ SD (0)
      • 5.3.1. Sử dụng bộ nhớ trong (0)
      • 5.2.2. S ử d ụ ng b ộ nh ớ ngoài (0)
    • 5.4. S ử d ụng cơ sở d ữ li ệ u SQLLite (0)

Nội dung

Bài giảng Lập trình di động android: Phần 1 cung cấp cho người học những kiến thức như: Tổng quan về lập trình android; xây dựng ứng dụng android; lập trình giao diện android. Mời các bạn cùng tham khảo!

TỔNG QUAN VỀ LẬP TRÌNH ANDROID

H ệ điề u hành Android

Android là hệ điều hành mã nguồn mở và miễn phí do Google phát triển, dựa trên nền tảng Linux và được thiết kế dành cho các thiết bị di động có màn hình cảm ứng như điện thoại thông minh và máy tính bảng.

Vào tháng 10/2003, Android Inc được thành lập tại Palo Alto, California bởi bốn người sáng lập là Rich Miner, Nick Sears, Chris White và Andy Rubin Khi thành lập, Rubin nói rằng Android sẽ phát triển những thiết bị di động thông minh hơn bằng cách hiểu vị trí và sở thích của người dùng, và Android được kỳ vọng cải thiện hệ điều hành cho máy ảnh số Nhóm nghiên cứu của Android ban đầu không nghĩ ngay đến việc xây dựng một hệ điều hành làm lõi cho một hệ sinh thái di động, nhưng khi thị trường máy ảnh số suy giảm, Android Inc quyết định chuyển hướng sang phát triển hệ điều hành cho điện thoại di động.

Vào năm 2005, một chương mới quan trọng trong lịch sử Android bắt đầu khi Google mua lại công ty khởi nghiệp Android Andy Rubin và các thành viên sáng lập vẫn tiếp tục phát triển hệ điều hành dưới sự sở hữu mới, với quyết định dựa trên nền tảng Linux để biến Android thành nền tảng mở Điều này đồng nghĩa với việc Android sẽ được cung cấp miễn phí cho các nhà sản xuất điện thoại di động của bên thứ ba Đồng thời, Google và đội ngũ Android nhận thấy họ có thể kiếm tiền từ các dịch vụ và ứng dụng chạy trên hệ điều hành Android, mở ra nhiều mô hình doanh thu ngoài việc bán phần mềm.

Hệ điều hành Android chính thức ra mắt vào năm 2007 cùng với tuyên bố thành lập Open Handset Alliance (OHA), một liên minh gồm nhiều công ty như Google, Texas Instruments, Intel, Qualcomm, Samsung Electronics và T-Mobile nhằm phát triển các chuẩn mở cho thiết bị di động Mục tiêu của OHA là thúc đẩy sự đổi mới, sự tương thích và mở rộng nền tảng Android cho các nhà sản xuất và nhà phát triển ứng dụng Chiếc điện thoại Android đầu tiên được bán ra là HTC Dream, phát hành vào năm 2008.

Vào năm 2008, hình ảnh quen thuộc của hệ điều hành Android được hình thành từ sự kết hợp giữa một con robot và một lõi màu xanh lá cây do Irina Blok thiết kế Theo Blok, thiết kế cuối cùng lấy cảm hứng từ biểu tượng nhà vệ sinh quen thuộc, đại diện cho nam và nữ.

Android là nền tảng có mã nguồn mở được Google phát hành theo Giấy phép Apache, và sự kết hợp của mã nguồn mở với một giấy phép ít ràng buộc cho phép các nhà phát triển thiết bị, mạng di động và công ty phần mềm tự do chỉnh sửa và phân phối Android Nhờ thế, Android có thể được tinh chỉnh, tùy biến và phân phối rộng rãi trên nhiều thiết bị và hệ sinh thái mạng, thúc đẩy sự đổi mới và mang lại lợi ích cho người dùng và doanh nghiệp.

Bản chất mở của Android thúc đẩy một đội ngũ lập trình viên đông đảo và những người đam mê mã nguồn mở tham gia phát triển các dự án do cộng đồng quản lý; những dự án này bổ sung các tính năng cao cấp cho người dùng thích khám phá hoặc muốn mang Android lên các thiết bị chạy hệ điều hành khác Theo Gartner, Android chiếm 75% thị phần điện thoại thông minh toàn cầu vào quý 3 năm 2012, với tổng cộng 500 triệu thiết bị đã được kích hoạt và khoảng 1,3 triệu lượt kích hoạt mỗi ngày, đến năm 2017 thị phần Android tăng lên 86,2%.

Sự đa dạng của Android là không thể bàn cãi: nền tảng này không chỉ phổ biến trên smartphone và tablet mà còn hiện diện trên Smart TV, xe hơi, đồng hồ thông minh và nhiều thiết bị kết nối khác, giúp Android giao tiếp trực tiếp với người dùng và mở rộng hệ sinh thái cho mọi trải nghiệm Để đạt được thị phần ấn tượng như ngày nay, Android đã trải qua nhiều thăng trầm và biến động trong suốt lịch sử phát triển của nó, với các phiên bản và tối ưu hóa liên tục thúc đẩy sự tiện ích và tiếp cận rộng rãi hơn cho người dùng ở nhiều lĩnh vực.

Android 1.0 là phiên bản thương mại đầu tiên của hệ sinh thái Android được phát hành chính thức vào ngày 23/9/2008 sau một quá trình thử nghiệm kéo dài và được cài đặt trên điện thoại T-Mobile G1 (HTC Dream)

Dù chỉ là phiên bản đầu tiên, Android 1.0 đã đặt nền móng vững chắc cho hệ sinh thái Android với một loạt tính năng đa dạng vẫn được sử dụng đến ngày nay, bao gồm trình duyệt web tích hợp, khả năng hỗ trợ hệ thống camera tích hợp trên thiết bị di động, đồng bộ hóa Gmail thông qua ứng dụng Gmail, và trình phát video trên thiết bị di động.

YouTube, Google Maps, danh bạ Contacts, và ứng dụng lịch Calendar cũng có khả năng đồng bộ hóa

Android 1.5 Cupcake (phát hành tháng 4/2009) là bản cập nhật lớn đầu tiên của Android Cupcake đã thêm các tiện ích cho màn hình chính, bàn phím ảo, quay video trong máy ảnh, chức năng sao chép và dán vào trình duyệt web

Android 2.0 Eclair (phát hành tháng 10/200 9) hỗ trợ tài khoản Google, cho phép người dùng tìm kiếm nội dung theo từ khóa trong các tin nhắn văn bản, đồng thời bổ sung hỗ trợ đa chạm và máy ảnh được cải tiến với đèn flash, zoom số.

Android 2.2 Froyo (phát hành tháng 5/2010) giới thiệu Flash Player 10.1, cho phép điện thoại phát video và phát trực tuyến âm thanh Máy ảnh flash tương thích Bluetooth giúp người dùng có thể sử dụng điện thoại của mình làm điểm phát sóng Wi-Fi (hotspot 3G/4G)

Android 2.3 Gingerbread (phát hành tháng 12/2010), Android được biết đến rộng rãi hơn nhờ tính năng giao tiếp trường gần (NFC), cho phép điện thoại thông minh kết nối với các thiết bị lân cận khác Android 2.3 cũng cho phép gọi điện video bằng máy ảnh mặt trước và thêm trình quản lý tải xuống

Android 3.0 Honeycomb (phát hành tháng 2/2011) là bản cập nhật hầu như chỉ dành cho máy tính bảng, hỗ trợ đồ họa 3D, các tab trình duyệt cạnh nhau, trò chuyện video với Google Talk, chia sẻ kết nối Bluetooth

Ki ế n trúc phân t ầ ng Android (software stack)

Để đảm bảo sự đơn giản, tính dùng chung và bảo mật cho các ứng dụng Android, các thư viện được phân thành các lớp từ thấp đến cao Các thành phần ở lớp trên chủ yếu khai thác các dịch vụ do lớp bên dưới cung cấp và hiếm khi phải gọi API từ các lớp thấp hơn, từ đó tăng tính tái sử dụng và giảm sự phụ thuộc giữa các tầng.

Ki ến trúc này đượ c chia ra thành các t ầ ng chính như sau:

Các lớp phần mềm trong Android Trong đó, m ỗ i t ầ ng đề u có ch ức năng vai trò riêng biệ t v ớ i nhau:

Linux kernel là lớp nền tảng của Android, là cơ sở để hệ điều hành phát triển và vận hành Nó tích hợp các dịch vụ lõi như trình điều khiển phần cứng, quản lý tiến trình, quản lý bộ nhớ, mạng, nguồn điện và bảo mật, đồng thời đảm nhận các giao tiếp thiết bị ở mức thấp để kiểm soát và điều khiển các phần cứng trên điện thoại hoặc thiết bị Android.

L ớ p c ác thư việ n (libraries) - chạy bên trên lớp hạt nhân, bao gồm các các thư viện lõi vi ế t b ằ ng C/C++ như libc và SSL, cũng như các thư việ n:

- Thư viện cho việc phát các loại dữ liệu âm thanh và hình ảnh

- B ộ qu ả n lý v ẽ (surface manager) cho vi ệ c hi ể n th ị đồ h ọ a trên màn hình

- Các thư viện đồ họa bao gồm SGL và OpenGL cho đồ họa 2D và 3D

- SQLite cho các ứng dụng sử dụng cơ sỡ dữ liệu

- SSL và WebKit cho việc tích hợp trình duyệt và bảo mật Internet

Android Runtime (ART) là lớp máy ảo của hệ điều hành Android, từng được Dalvik sử dụng và hiện nay là ART, chịu trách nhiệm thực thi các ứng dụng Android ART tối ưu hóa quá trình biên dịch và thực thi mã, tăng hiệu suất và sự ổn định của ứng dụng, đồng thời cải thiện quản lý năng lượng pin và tối ưu tiêu thụ CPU trên thiết bị Android.

Lớp khung ứng dụng (Application Framework) cung cấp tập thư viện API phục vụ cho phát triển ứng dụng Android Lớp này cho phép giao tiếp với phần cứng thông qua các lớp ở tầng dưới và quản lý giao diện người dùng cùng các tài nguyên của ứng dụng.

Lớp ứng dụng (Application layer) là nền tảng cho hầu hết các ứng dụng, bao gồm cả ứng dụng cài sẵn trong hệ điều hành và các ứng dụng của bên thứ ba, được phát triển dựa trên lớp này và dùng chung tập API Lớp ứng dụng được chạy trong bộ thực thi Android ( với các thư viện lõi và máy ảo ), và sử dụng các lớp cùng các dịch vụ do lớp Application Framework cung cấp.

Môi trường phát triển ứng dụng Android

1.3.1 Các c ông cụ và thiết lập chung

Java Development Kit (JDK) là bộ công cụ hỗ trợ phát triển ứng dụng Java Trước khi làm việc với Android trên máy tính, bạn cần cài đặt và thiết lập JDK để có môi trường lập trình Java đầy đủ Bạn có thể tải phiên bản mới nhất của JDK 8 tại link sau: http://www.oracle.com/technetwork/java/javase/downloads/index.html.

Thiết lập các biến môi trường (Enviroment variable) JAVA_HOME và Path Vào Control Panel , mở Advanced tab > Environment Variables

Chỉnh sửa giá trị của biến Path:

Để xác nhận đã cài đặt và thiết lập JDK, hãy dùng lần lượt hai lệnh java -version và javac -version trong terminal hoặc Command Prompt Nếu kết quả trả về giống với hình bên dưới, điều đó cho thấy JDK đã được cài đặt và thiết lập thành công, cho phép bạn tiếp tục phát triển và chạy các ứng dụng Java.

B ộ công c ụ Android SDK (Software Development Kit)

Android SDK là một tập hợp các thư viện và công cụ hỗ trợ được dùng để phát triển, đóng gói và kiểm thử ứng dụng Android Nó cung cấp các API và các công cụ cần thiết để xây dựng ứng dụng di động trên nhiều phiên bản Android Bạn có thể tải xuống Android SDK và các gói đi kèm từ trang web chính thức của Android Developers để bắt đầu quá trình phát triển và cập nhật các thành phần mới nhất.

Android SDK chia các công cụ và thư viện thành các gói (package) mà bạn có thể tải về khi cần thiết, cho phép tải gói mới và cập nhật các gói có sẵn trong SDK Để tải các gói có sẵn trong Android SDK, bạn có thể mở SDK Manager hoặc quản lý gói, xem danh sách các gói theo từng nhóm như công cụ biên dịch, nền tảng Android, thư viện hỗ trợ và các thành phần phụ trợ, sau đó chọn gói mong muốn và nhấn Cài đặt hoặc Cập nhật để đồng bộ với phiên bản API bạn đang phát triển.

Tháng 5 năm 2013, Google công bố Android Studio, một môi trường phát triển ứng dụng tích hợp (IDE) dành riêng cho Android, mã nguồn mở, dựa trên IDE Java IntelliJ của hãng JetBrains

Android Studio là một IDE mạnh mẽ được thiết kế đặc biệt để xây dựng các ứng dụng Android, tích hợp trình soạn thảo code mạnh mẽ, giao diện trực quan và trình biên tập theme, vector và tài nguyên hình ảnh, giúp đơn giản hóa toàn bộ quá trình phát triển Bạn có thể thiết lập một dự án Android mới cho nhiều loại ứng dụng khác nhau chỉ trong vòng vài giờ, nhờ môi trường làm việc thống nhất và các công cụ tự động hóa Trước khi Android Studio ra đời, việc phát triển Android được thực hiện chủ yếu bằng Eclipse và Android Developer Tools plugin, nhưng Google đã thay đổi điều đó bằng cách giới thiệu Android Studio.

Bạn có thể download bộ cài đặt Android Studio tại trang web chính thức của Google http://developer.android.com/studio

Android Studio đi kèm với trình giả lập (emulator) mô phỏng thiết bị thật để bạn thử nghiệm ứng dụng mà không cần dùng điện thoại Android thật Bạn có thể tải về và chạy emulator để chạy bất kỳ phiên bản Android nào, giúp kiểm thử trên nhiều môi trường hệ điều hành khác nhau và tối ưu hóa quá trình phát triển.

Phiên bản mới nhất của Android Studio 3.x mang đến nhiều tính năng nổi bật như hỗ trợ xây dựng dự án Android theo Gradle, sửa lỗi nhanh và tái sử dụng cấu trúc phương thức, cùng với các công cụ kiểm tra tính khả dụng, vận hành và tương thích nền tảng của ứng dụng Nó cũng tập trung vào bảo mật mã nguồn và đóng gói ứng dụng, trình biên tập giao diện cho phép xem tổng quan giao diện người dùng và các thành phần với khả năng tuỳ chỉnh trên nhiều cấu hình khác nhau Thêm vào đó, Android Studio 3.x cho phép tương tác với nền Google Cloud để tối ưu hóa quá trình phát triển và triển khai.

Android Studio 3.x system requirements for Windows include Windows 7/8/Vista/2003/2007/2010 (32- or 64-bit); 2 GB RAM or more; at least 400 MB of free disk space for the IDE; at least 1 GB of additional disk space for the Android SDK, emulator system images, and caches; a minimum display resolution of 1280 x 800; Java Development Kit (JDK) 7 or higher; and optional acceleration for the emulator requires an Intel processor with Intel VT-x, Intel EM64T (Intel 64), and XD Bit support.

XÂY DỰNG ỨNG DỤNG ANDROID

Cơ bả n v ề ứ ng d ụ ng Android

Các ứng dụng Android thường được viết bằng Java Các công cụ thuộc Android SDK sẽ biên dịch toàn bộ mã nguồn kèm theo dữ liệu và tài nguyên thành một gói Android (.apk), một file lưu trữ chứa đầy đủ thành phần của ứng dụng Toàn bộ nội dung trong file apk được coi là một ứng dụng và chính là file mà các thiết bị Android dùng để cài đặt ứng dụng.

Hình 2.1 minh họa quá trình biên dịch ứng dụng Android Khi được cài đặt trên thiết bị, mỗi ứng dụng Android sẽ sống trong một sandbox riêng biệt, tức là một môi trường ảo cách ly chạy đồng thời bảo mật và hạn chế quyền truy cập vào tài nguyên hệ thống Nhờ cơ chế sandbox này, dữ liệu người dùng được bảo vệ và sự can thiệp giữa các ứng dụng bị giảm thiểu, giúp hệ điều hành Android vận hành an toàn và ổn định hơn.

• Hệ điều hành Android là hệ thống Linux đa người dùng (multi - user), trong mỗi ứng dụng lại là một người dùng khác

Theo mặc định, hệ thống gán cho mỗi ứng dụng một user ID duy nhất (ID này do hệ thống quản lý và ứng dụng không được biết tới) Hệ thống thiết lập quyền truy cập cho toàn bộ các tệp tin của ứng dụng, đảm bảo chỉ đúng user ID được gán cho ứng dụng đó mới có thể truy cập vào những file này.

• Mỗi tiến trình đều có máy ảo (virtual machine - VM) riêng của nó, nên mã của một ứng dụng sẽ chạy độc lập với các ứng dụng khác.

2.1.1 Cá c thành phần chính của ứng dụng

Một ứng dụng Android có thể gồm một hoặc nhiều thành phần kết hợp với nhau, mỗi thành phần có thực thể riêng và đảm nhận một vai trò cụ thể để đảm bảo hoạt động thống nhất của ứng dụng Các thành phần chính thường gặp bao gồm Activity dùng để hiển thị và tương tác với người dùng, Service thực hiện công việc ở chế độ nền, Broadcast Receiver nhận và xử lý các thông điệp hệ thống hoặc của ứng dụng, và Content Provider quản lý dữ liệu có thể được chia sẻ giữa các thành phần và ứng dụng khác Việc thiết kế và tổ chức các thành phần một cách hợp lý giúp tối ưu hiệu suất, khả năng mở rộng và dễ bảo trì cho ứng dụng Android.

Activity là thành phần quan trọng nhất đóng vai trò làm khung cho toàn bộ ứng dụng Trong ứng dụng Android, Activity là nơi hiển thị màn hình giao diện và là điểm để người dùng tương tác với ứng dụng Một ứng dụng Android có thể có một hoặc nhiều Activity, và Activity được khởi chạy đầu tiên khi ứng dụng khởi động được gọi là "main activity".

Service là một thành phần chạy ngầm trên Android, được dùng để thực thi các tác vụ cần nhiều thời gian ở chế độ nền và thường không có giao diện hiển thị Nhờ Service, ứng dụng có thể tiếp tục xử lý các công việc dài lâu ngay cả khi người dùng chuyển sang ứng dụng khác hoặc đóng giao diện, như đồng bộ dữ liệu, tải xuống hoặc xử lý nền mà không ảnh hưởng đến trải nghiệm người dùng.

Ví dụ trên Android cho thấy khi bạn nghe nhạc bằng một ứng dụng và vẫn nghe được ngay cả khi đã đóng ứng dụng, vì service chạy ngầm vẫn hoạt động Bạn có thể liên kết giữa một Activity và một Service để thực thi các tác vụ nền, như download một file từ mạng được thực hiện trong Service và sau đó trả về phần trăm tiến độ cho Activity để hiển thị cho người dùng Việc quản lý và cập nhật tiến độ giữa Activity và Service cho phép ứng dụng hoạt động hiệu quả mà vẫn duy trì trải nghiệm người dùng mượt mà.

Notification là một thành phần cho phép gửi thông báo đến người dùng mà không chiếm quá nhiều thao tác điều khiển trên thiết bị Ví dụ, khi nhận được tin nhắn hoặc email, hệ thống sẽ dùng Notification để gửi thông báo tới người dùng thông qua chuông, đèn nền và biểu tượng trên thanh tác vụ, đồng thời hiển thị ở thanh trạng thái để người dùng nắm bắt nhanh thông tin Notification được xây dựng nhằm cung cấp thông báo qua giao diện trạng thái của thiết bị, giúp người dùng nhận được thông tin kịp thời mà không làm gián đoạn trải nghiệm sử dụng.

Giao diện Notification không thuộc giao diện ứng dụng, nhưng có thể tuỳ chỉnh giao diện Notification thông qua các phương thức có sẵn

Content Provider được sử dụng để quản lý và chia sẻ dữ liệu giữa các ứng dụng, giúp tối ưu hóa sự tương tác và an toàn của dữ liệu Content Provider xây dựng cơ chế truy cập tập hợp dữ liệu ứng dụng và hỗ trợ lưu trữ ở nhiều dạng khác nhau như SQLite, tập tin, tài nguyên Web hoặc bất kỳ thư mục lưu trữ nào.

Có thể dùng Content Provider trong Android để xây dựng các ứng dụng có thể dùng chung nguồn dữ liệu hoặc quản lý nguồn dữ liệu riêng Một số Content Provider được tích hợp sẵn như Danh bạ (Contacts), MediaStore cho tài nguyên đa phương tiện và Lịch (Calendar), cho phép đọc ghi dữ liệu qua các contract chuẩn và quyền truy cập phù hợp, từ đó tăng khả năng tương tác giữa các ứng dụng và tối ưu hóa việc tái sử dụng nguồn dữ liệu.

2.1.2 Tính tương thích thiết bị

Khi xây dựng một ứng dụng Android, chúng ta cần quan tâm và đảm bảo sự tương thích chạy trên sự đa dạng của các thiết bị như:

Android hỗ trợ nhiều phiên bản và mỗi phiên bản kế tiếp có thể bổ sung hoặc loại bỏ các phương thức API Để tận dụng đầy đủ tính năng và đảm bảo tương thích trên nhiều thiết bị, nhà phát triển cần khai báo đầy đủ thông tin phiên bản trong dự án (minSdkVersion, targetSdkVersion, và compileSdkVersion) và luôn kiểm tra sự có mặt của các API trên từng phiên bản Việc quản lý phiên bản API đúng cách giúp ứng dụng hoạt động ổn định, tránh lỗi khi chạy trên Android phiên bản cũ hoặc mới và tối ưu việc khai thác các tính năng mới theo từng bản phát hành.

Xử lý kích thước màn hình khác nhau là thách thức từ thời đầu phát triển Android, khi chỉ có một số ít thiết bị có thể chạy hệ điều hành này và hầu hết đều là điện thoại Tuy nhiên, trong những năm qua, với sự phát triển của nền tảng Android và ngày càng nhiều nhà sản xuất thiết bị tham gia, các kích thước màn hình và mật độ điểm ảnh đã trở nên đa dạng Android cũng bắt đầu hỗ trợ các thiết bị màn hình lớn, như máy tính bảng và Google TV, khiến các nhà phát triển phải dự tính sử dụng nhiều kích thước hình ảnh và bố cục để tối ưu cho mọi màn hình khác nhau Ứng dụng Android cần tương thích với nhiều kích cỡ thiết bị và được phân chia thành hai thuộc tính.

 Kích thước vật lý màn hình (screen size)

 Mật độ điểm ảnh (density)

T ạ o m ộ t ứ ng d ụng đơn giả n – HelloAndroid

Khởi động Android Studio IDE:

Chọn “Start a new Android Studio project” để tạo dự án Android mới Xuất hiện hộp thoại chọn thiết bị (device) mà bạn muốn phát triển ứng dụng:

Để bắt đầu tạo ứng dụng trên điện thoại và máy tính bảng, hãy chọn tab 'Phone and tablet' Tiếp theo chọn kiểu khởi đầu của ứng dụng là 'Empty Activity' và nhấn Next để tiếp tục.

Trong hộp thoại tiếp theo, người dùng được yêu cầu đặt tên cho ứng dụng và tên gói, cụ thể là Name: tên của ứng dụng – ví dụ "Hello Android"; Package name: tên gói ứng dụng để phân biệt với các ứng dụng khác trên Google Play Store – ví dụ "com.example.helloandroid"; Save location: thư mục lưu trữ ứng dụng; Minimum API level: phiên bản hệ điều hành tối thiểu cần thiết để chạy ứng dụng và một số phương thức API sẽ được gọi bổ sung trong phần thư viện hỗ trợ.

* Lưu ý: bạn có thể tham khảo thêm thông tin về Android API level ở link sau:https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels

ThS Bùi Trung Úy 23 Đây là màn hình Android Studio và dự án của bạn đã được tạo ra:

Chạy thử ứng dụng: nhấn nút „Run app‟ trên thanh công cụ hoặc phím Shift+F10:

Xuất hiện hộp thoại chọn thiết bị:

Trong hộp thoại này, danh sách sẽ liệt kê tất cả các thiết bị thật đang kết nối với máy tính và các thiết bị mô phỏng mà bạn đã tạo trước đó Trong ví dụ trên, hãy chọn thiết bị ảo “Nexus 5X API 27” đã được tạo sẵn và xem kết quả hiển thị.

Note: After a fresh install of Android Studio, there might be no virtual devices available yet Go to Tools > AVD Manager to create your own virtual device tailored to your testing needs.

2.2.2 Tổng quan về cấu trúc dự án Android

Dưới đây là hình ảnh cây tổng quát của một dự án trên Android Studio (theo chế độ hiển thị Android):

Java là nơi chứa các package của dự án; bạn có thể tạo các package ở đây và bên trong chứa các file mã nguồn Java Trong ví dụ trên, ta có một file mã nguồn duy nhất là MainActivity.java nằm trong package com.example.helloandroid; đây chính là package chính của ứng dụng.

Thư mục res chứa toàn bộ tài nguyên được sử dụng trong ứng dụng Android, bao gồm hình ảnh (drawable), bố cục giao diện (layout), các chuỗi ký tự (strings), màu sắc và kích thước (values), cùng nhiều tài nguyên khác phục vụ cho quá trình thiết kế và vận hành ứng dụng.

Layout là thư mục chứa các file XML mô tả bố cục giao diện của các màn hình trong ứng dụng Ở phần trên của dự án, thư mục Java lưu trữ các lớp (class) và những lớp này sẽ kết nối với các file XML trong thư mục layout để tạo nên các màn hình có giao diện người dùng có thể thao tác Việc liên kết giữa các lớp Java và các file XML giúp định hình cấu trúc giao diện và luồng tương tác trên từng màn hình, từ đó tối ưu hóa trải nghiệm người dùng và hiệu suất của ứng dụng.

+ drawable : đây chính là thư mục chứa các file hình ảnh, các file xml là thiết lập giao diện Nếu bạn muốn ứng dụng sử dụng một hình ảnh nào đó là làm nền thì ảnh đó sẽ bỏ vào thư mục này Hoặc nếu muốn điều chỉnh một nút button khi click vào màu xanh còn khi không click vào màu tr ắ ng thì b ạ n s ẽ config trong file xml và lưu vào trong này

+ mipmap : đây là thư mục để chứa hình ảnh logo của ứng dụng Nó tương tự như thư mục drawable, nhưng mipmap chỉ chứa các icon của ứng dụng với các thiết lập để phù hợp với từng loại kích thước màn hình khác nhau

Một vấn đề thường gặp khi phát triển ứng dụng Android là ảnh hiển thị mờ nhòe hoặc bị giãn trên các thiết bị có màn hình lớn Để khắc phục, Android hỗ trợ cung cấp nhiều hình ảnh cho mỗi mật độ điểm ảnh (density) khác nhau, giúp ảnh thu nhỏ và phóng to đúng tỷ lệ và giữ được độ nét trên mọi thiết bị Khi bạn tạo icon hoặc hình ảnh từ công cụ thiết kế, Android Studio sẽ tự động sinh ra các thư mục drawable và mipmap ở các density khác nhau, tương ứng với các kích thước màn hình đa dạng để tối ưu hiển thị.

Một số mật độ màn hình mà Android hỗ trợ gồm ldpi (~120 dpi) dành cho màn hình có độ phân giải thấp; mdpi (~160 dpi) cho màn hình ở mức độ trung bình; hdpi (~240 dpi) cho màn hình có mật độ cao; xhdpi (~320 dpi) dành cho các màn hình có độ phân giải cao hơn nữa Các mật độ này được giới thiệu từ API Level 8 nodpi có thể được dùng cho tài nguyên hình ảnh mà bạn không muốn bị thu nhỏ hoặc phóng to trên các thiết bị có mật độ khác tvdpi (~213 dpi) là mật độ nằm giữa mdpi và hdpi, một số màn hình có độ phân giải này; không được xem là nhóm mật độ chính và chủ yếu dành cho TV.

AndroidManifest.xml là tập tin liệt kê đầy đủ các thông tin cần thiết cho một ứng dụng Android, giúp hệ điều hành hiểu và quản lý ứng dụng đúng cách Tệp này thiết lập các thuộc tính của ứng dụng, xác định quyền cần cấp cho ứng dụng, và mô tả các thành phần chính như activity, service, receiver và provider; từ đó hệ điều hành có thể khởi tạo, cấp quyền và xử lý chúng khi ứng dụng chạy Việc khai báo manifest đúng cách hỗ trợ tối ưu hoá bảo mật, quản lý quyền, và đảm bảo hoạt động ổn định của ứng dụng trên thiết bị người dùng.

Một số đặc tả kê khai trong manifest này bao gồm:

• Xác đị nh tên gói c ủ a ứ ng d ụ ng, là đị nh danh (identifier) duy nh ấ t cho ứ ng d ụ ng

• Mô tả các thành phần của ứng dụng - activity, service, broadcast receiver và Content Provider

• Khai báo các quyền mà ứng dụng cần,…

Nội dụng một file AndroidManifest mẫu như sau:

Trong đó một số thành phần chính:

- Khai báo package name - định danh duy nhất của ứng dụng trên hệ thống

Thẻ uses-permission – danh mục các quyền mà ứng dụng yêu cầu từ người dùng Khi bạn cài đặt bất kỳ ứng dụng nào, hệ điều hành thường hiển thị các quyền để bạn đồng ý trước khi cài đặt Ví dụ cho thấy hai quyền phổ biến: quyền truy cập internet và quyền ghi dữ liệu trên thẻ nhớ ngoài Hiểu rõ các quyền này giúp người dùng quản lý quyền riêng tư và đảm bảo an toàn khi cài đặt ứng dụng.

Thẻ application trong AndroidManifest.xml mô tả cách hiển thị và hoạt động của ứng dụng, xác định rõ các activity và các service (dịch vụ chạy ngầm) sẽ được sử dụng Việc khai báo đầy đủ các activity và service ở thẻ này là bắt buộc; nếu một activity hoặc service không được khai báo ở đây, ứng dụng sẽ không thể hoạt động đúng chức năng tương ứng Việc cấu hình chính xác thẻ application giúp tối ưu hóa khởi động, quản lý thành phần và đảm bảo sự ổn định của ứng dụng.

+ android:icon="@mipmap/ic_launcher" – khai báo sử dụng file ảnh ic_launcher.png trong thư mụ c res/mipmap để làm bi ểu tượ ng cho ứ ng d ụ ng

Trong Android, android:label được khai báo để sử dụng chuỗi có tên app_name trong file strings.xml làm tên của ứng dụng, chuỗi này có giá trị là “HelloAndroid” Việc tham chiếu @string/app_name thay cho việc ghi tên trực tiếp giúp quản lý văn bản dễ dàng và hỗ trợ bản địa hóa, đồng thời tối ưu hóa hiển thị tên ứng dụng trên màn hình và cửa hàng ứng dụng.

Activity và cơ chế ho ạt độ ng

Trong phát triển ứng dụng Android, mọi chức năng được tổ chức quanh một hoặc nhiều thành phần gọi là Activity Mỗi Activity đóng vai trò như một module chức năng độc lập, thường có giao diện người dùng (UI) và chịu trách nhiệm phản hồi các tương tác của người dùng Một ứng dụng Android có thể gồm một hoặc nhiều Activity, cho phép điều hướng và xử lý các hành động khác nhau của người dùng một cách linh hoạt.

Các Activity có thể gọi các Activity khác; khi một Activity gọi một Activity khác, Activity được gọi sẽ nhận được sự tương tác tại thời điểm đó Mỗi Activity hoạt động độc lập nhưng vẫn có thể tương tác và truyền dữ liệu với nhau, cho phép điều phối luồng xử lý và đồng bộ thông tin giữa các thành phần của ứng dụng.

Trong Android, một lớp được gọi là Activity khi nó kế thừa từ các lớp cha như Activity, AppCompatActivity hoặc FragmentActivity Ví dụ HelloAndroid có lớp MainActivity là một Activity và nó mở rộng từ lớp AppCompatActivity có sẵn, giúp tích hợp giao diện người dùng và các tính năng nền tảng một cách hiệu quả.

Trong lập trình Android, mỗi Activity có một hàm đặc biệt tên là onCreate() Đây là hàm bắt buộc phải có vì nó chịu trách nhiệm khởi tạo Activity và chỉ được gọi một lần trong vòng đời của Activity, đồng thời là nơi thiết lập giao diện người dùng của Activity.

Trong quá trình thực thi ứng dụng Android, từ khi Activity được khởi tạo cho tới khi kết thúc, nó trải qua một chu trình vòng đời với các trạng thái quan trọng như onCreate, onStart, onResume, onPause, onStop và onDestroy Mỗi lập trình viên Android cần nắm vững các trạng thái của vòng đời này để thực hiện các xử lý phù hợp, như lưu lại trạng thái dữ liệu trước khi Activity bị tạm dừng hoặc bị hủy, và khôi phục lại trạng thái dữ liệu khi Activity được phục hồi Việc quản lý vòng đời đúng cách còn giúp duy trì giao diện người dùng và tối ưu tài nguyên bằng cách sử dụng onSaveInstanceState và onRestoreInstanceState để lưu và phục hồi trạng thái khi hệ thống cần giải phóng bộ nhớ.

2.3.2 Các trạ ng thái Activity

Trong một ứng dụng di động, thường có nhiều activity liên kết với nhau, trong đó có một activity được xác định là activity chính (main activity) – giao diện được hiển thị và tương tác với người dùng đầu tiên khi ứng dụng khởi động Mỗi activity có thể khởi động một activity khác để thực hiện các tác vụ tiếp theo Mỗi khi một activity mới được khởi động, activity trước đó sẽ bị dừng lại, nhưng hệ thống vẫn lưu trữ nó trong một ngăn xếp gọi là back-stack (ngăn xếp lùi) để người dùng có thể quay lại.

Khi một activity mới được mở, nó được đẩy vào ngăn xếp phía sau (back stack) Ngăn xếp này hoạt động theo cơ chế last in, first out (LIFO), nghĩa là hoạt động mới nhất mở sẽ ở đỉnh ngăn xếp và được khởi động hoặc phục hồi trước các hoạt động khác khi người dùng quay lại hoặc điều hướng.

LIFO, hay "Last In, First Out" (vào sau, ra trước), là cơ chế quản lý ngăn xếp cho các activity trong ứng dụng Khi người dùng hoàn tất thao tác với activity hiện tại và nhấn nút Back, activity đó sẽ được lấy khỏi ngăn xếp và bị hủy, trong khi activity trước đó sẽ được phục hồi và tiếp tục hiển thị cho người dùng.

Khi một activity bị dừng vì một activity mới được khởi động lên foreground, hệ thống thông báo sự thay đổi trạng thái thông qua các callback trong vòng đời của activity Có một số callback quan trọng phản ánh trạng thái của activity, như onCreate khi được tạo, onStart và onResume khi hoạt động hiển thị và có thể tương tác, và các callback bị gọi khi activity bị tạm dừng hay huỷ (onPause, onStop, onDestroy), cũng như onRestart cho trường hợp quay lại từ trạng thái đã dừng Mỗi callback giúp quản lý tài nguyên, cập nhật giao diện và xử lý logic phù hợp với trạng thái hiện tại của activity.

ThS Bùi Trung Úy 31 callback đem đến cho lập trình viên cơ hội thực hiện công việc cụ thể thích hợp với sự thay đổi trạng thái đó

Một Activity cơ bản có 4 trạng thái chính Trạng thái Running (đang hoạt động) xảy ra khi Activity được kích hoạt và đưa vào ngăn xếp back-stack, cho phép người dùng nhìn thấy và tương tác với nó Trạng thái Paused (tạm dừng) xảy ra khi có một thành phần khác hoặc thông báo hệ thống ở foreground và được focus, Activity vẫn đang chạy và người dùng vẫn thấy nó, nhưng không thể tương tác được do bị che một phần bởi thành phần khác; chẳng hạn như khi có một dialog đè lên.

Trong Android, khi một activity bị tạm dừng, đối tượng Activity vẫn tồn tại trong bộ nhớ, duy trì mọi trạng thái và thông tin thành viên, và được gắn với tiến trình quản lý của hệ thống Tuy nhiên, activity bị tạm dừng không còn hiển thị với người dùng và có thể bị hệ điều hành hủy để cấp bộ nhớ cho các tác vụ khác Ở trạng thái Stopped (bị dừng), hành vi tương tự như trạng thái tạm dừng, nhưng activity lại bị che khuất hoàn toàn bởi một thành phần giao diện hoặc bởi một ứng dụng khác, khiến người dùng không thể nhìn thấy nó.

Một ví dụ điển hình về vòng đời của Activity trên Android là khi người dùng nhấn nút Home để đưa ứng dụng về nền; Activity đang hiển thị sẽ rơi vào trạng thái dừng (paused) và có thể bị hệ điều hành tạm dừng để tối ưu tài nguyên Ở trạng thái destroyed (kết thúc), Activity kết thúc khi hoàn tất tác vụ hoặc hệ điều hành có thể loại bỏ nó khỏi bộ nhớ bằng cách gọi finish() hoặc kết thúc tiến trình của nó để giải phóng tài nguyên.

Trong Android, người dùng có thể thoát một Activity bằng cách nhấn nút Back hoặc gọi finish() từ một Activity; hai thao tác này sẽ kết thúc vòng đời của Activity đó Khi ứng dụng ở nền quá lâu, hệ thống có thể thu hồi tài nguyên bằng cách dừng các Activity trong ứng dụng, khiến mọi Activity rơi vào trạng thái bị dừng Khi một Activity ở trạng thái Finish, nó sẽ kết thúc vòng đời và bị hệ thống hủy bỏ Hiểu cách Finish và tình trạng dừng hoạt động của các Activity giúp tối ưu tài nguyên và quản lý vòng đời của Android Apps.

2.3 3 Vòng đời của Activity (Activity Lifecycle)

Khi một activity chuyển đổi hoặc thoát khỏi các trạng thái khác nhau, hệ thống sẽ gửi thông báo qua nhiều phương thức callback khác nhau Bạn có thể ghi đè các phương thức callback này để xử lý phù hợp với trạng thái hiện tại của activity, ví dụ như onCreate, onStart, onResume, onPause, onStop, onDestroy và onRestart, và dùng onSaveInstanceState để lưu trữ trạng thái khi cần thiết Việc tùy chỉnh các callback giúp quản lý vòng đời của activity một cách hiệu quả và đảm bảo hoạt động liền mạch khi người dùng tương tác và hệ điều hành cấp phát nguồn tài nguyên.

Vòng đời của Activity (Android) mô tả quá trình hoạt động và tương tác của một Activity từ khi nó được tạo và bắt đầu chạy cho tới khi ứng dụng bị đóng hoặc Activity bị hủy bỏ Quá trình này gồm các trạng thái và callback chính như onCreate, onStart, onResume (để hoạt động và tương tác với người dùng), onPause (tạm dừng), onStop (dừng hoàn toàn) và onDestroy (hủy bỏ), cùng với các trường hợp đặc biệt khi có sự thay đổi cấu hình hoặc khi Activity được tái tạo sau khi bị hủy Hiểu rõ vòng đời giúp tối ưu quản lý tài nguyên, lưu trữ và phục hồi trạng thái, xử lý việc chuyển đổi giữa các màn hình và ứng phó với sự kiện hệ thống để mang lại trải nghiệm người dùng liền mạc.

Sơ đồ sau mô tả vòng đời của một Activity trong qúa trình hoạt động:

Gi ải thích sơ đồ

Intent và tương tác giữ a các Activity

Intent là một khái niệm quan trọng trong Android, được hiểu như một "keo dán" kết nối giữa các thành phần của hệ điều hành Nhờ Intent, các activity thuộc cùng một ứng dụng hoặc giữa các ứng dụng khác nhau có thể tương tác và phối hợp với nhau để thực hiện công việc một cách trôi chảy, như thể chúng thuộc về một hệ thống duy nhất.

Intent là một cơ chế thông điệp không đồng bộ cho phép một thành phần của ứng dụng yêu cầu chức năng từ các thành phần khác Nó cho phép giao tiếp giữa các thành phần của ứng dụng cũng như với các thành phần được đóng gói trong một ứng dụng khác Ví dụ, một Activity có thể gọi một Activity bên ngoài để chụp ảnh.

Intent được xem là cầu nối giữa các Activity trong Android, giúp điều hướng giữa các màn hình khi ứng dụng có nhiều Activity và diễn ra rất thường xuyên Nó đóng vai trò như một người đưa thư, giúp triệu gọi và truyền các dữ liệu cần thiết để thực hiện một Activity từ Activity khác, đồng thời cho phép quay lại giữa các màn hình một cách linh hoạt.

2.4.2 Sử dụng đối tượng Intent

Intent là đối tượng thuộc lớp android.content.Intent và đóng vai trò trung gian giữa các hoạt động trong hệ điều hành Android Bạn có thể gửi một Intent vào hệ thống Android bằng cách chỉ định thành phần mục tiêu (component) nhận dữ liệu hoặc thực hiện hành động Mỗi đối tượng Intent có thể chứa các thông tin sau: hành động (action) mô tả mục đích của Intent; dữ liệu (data) và loại nội dung (type); danh mục (categories); các dữ liệu bổ sung (extras) được đóng gói trong một Bundle; và các cờ (flags) ảnh hưởng đến cách hệ thống xử lý và vòng đời của đối tượng Qua đó, Intent cho phép các thành phần của cùng một ứng dụng hoặc giữa các ứng dụng trao đổi thông tin và điều phối hành động như khởi chạy Activity, Service hoặc gửi Broadcast.

Phần hành động mô tả những thao tác cần thực hiện, trong khi phần dữ liệu chứa thông tin thiết yếu được gửi kèm cho thành phần sẽ được mở xử lý Ví dụ, chúng ta tạo một Intent để yêu cầu hiển thị thông tin và kèm dữ liệu là một URL tới một website Hệ thống Android sẽ quét tất cả các ứng dụng đã được cài trên thiết bị, lọc và liệt kê những ứng dụng có thể xử lý Intent này để người dùng lựa chọn Intent có thể được gọi tường minh để chỉ định rõ thành phần đích, giúp kiểm soát luồng xử lý một cách rõ ràng.

Intent it = new Intent(“android.intent.action.VIEW”); it setData(Uri.parse(“http://www google com”));

Ho ặc dùng hàm putExtra để gán m ộ t c ặ p khóa/d ữ li ệ u:

ThS Bùi Trung Úy 39 it.putExtra("key_name", "This is a string!");

On Android, some Intents don’t require a specific data URI; you can trigger a picker by signaling only the data type For example, to select a record from the contacts list, you can create an Intent with ACTION_PICK and set its type to ContactsContract.Contacts.CONTENT_TYPE This data-type-based approach lets the system supply the appropriate contact picker and return the chosen contact without hard-coding a particular data reference.

Hàm setType() chỉ ra loại dữ liệu (MIME data type) của thông tin trả về cho activity hiện tại MIME type của ContactsContract.Contacts.CONTENT_TYPE là xâu

“vnd.android.cursor.dir/contact”

Trong hệ thống Intent của Android, ngoài Action, dữ liệu và loại dữ liệu, mỗi đối tượng Intent có thể thêm tham số danh mục (category) để nhóm các Activity lại theo danh mục, giúp lọc nhanh các Activity theo nhu cầu của ứng dụng Để mở một Activity khác, ta truyền Action của Activity đích vào đối tượng Intent khi khởi tạo (trong hàm dựng của Intent), từ đó điều hướng đến Activity mục tiêu một cách rõ ràng và hiệu quả.

Intent it = new Intent(“ com.example.Login Activity”) startActivity(it);

Here, the action refers to the component name, with com.example.LoginActivity as an example The component name uniquely identifies the target Activity to launch, and when the Activity you want to open is in the same project as the current Activity, you can reference it in a concise form as shown below.

Intent it = new Intent(LoginActivity.class) startActivity(it);

2.4.3 Truyền dữ liệu giữa các Activity

Trong lập trình Android, truyền dữ liệu cho Activity mới mở là thao tác phổ biến và rất hữu ích Khi gọi khởi chạy một Activity, ta có thể truyền sẵn dữ liệu dưới dạng chuỗi để Activity đích hiển thị nội dung phù hợp ngay từ đầu bằng cách đính kèm dữ liệu vào Intent Nhờ đó, dữ liệu cần hiển thị cho Activity được chuẩn bị trước và truyền giữa các màn hình một cách hiệu quả.

Trong ví dụ đơn giản nhất về việc mở một Activity khác từ Activity hiện tại bằng Intent, dự án HelloAndroid được mô tả bằng cách thêm GreetingActivity và cho MainActivity có ô nhập liệu cùng nút bấm; khi nhấn nút, GreetingActivity sẽ được mở Để truyền dữ liệu từ MainActivity sang GreetingActivity, trước khi gọi startActivity ta gắn dữ liệu cần truyền vào đối tượng Intent sử dụng để mở GreetingActivity, ví dụ bằng cách gọi putExtra để đưa thông tin vào Intent rồi sau đó thực hiện startActivity với Intent đã được gắn dữ liệu.

Intent it = new Intent(this, "com.example.GreetingActivity");

// Các d ữ li ệ u g ử i kèm it.putExtra("student_name", "John Kerry"); it.putExtra("student_age", 23);

// Yêu c ầ u start Activity ch ỉ đị nh trong Intent. this.startActivity(it);

Hoặc chúng ta có thể sử dụng code như sau:

Intent it2 = new Intent(this, "com.example.GreetingActivity");

// Các d ữ li ệ u g ử i kèm - S ử d ụ ng Bundle

Bundle extras = new Bundle(); extras.putString("student_country", "Da Nang – Viet Nam"); extras.putInt("student_yearbirth", 1986);

// -attach the Bundle object to the Intent object -

// Yêu c ầ u start Activity và s ẽ có ph ả n h ồ i t ừ Activity đượ c g ọ i this.startActivityForResult(it2, REQUEST_CODE);

Trong hàm onCreate của activity đích GreetingActivity, dữ liệu được truyền sang có thể lấy bằng cách gọi getIntent() để nhận Intent và sau đó đọc các trường dữ liệu bằng các phương thức như getStringExtra, getIntExtra hoặc getExtras, ví dụ lấy chuỗi bằng getStringExtra("name"), số nguyên bằng getIntExtra("age", 0) hoặc xử lý bundle bằng getExtras(); việc kiểm tra null và cung cấp giá trị mặc định giúp đảm bảo ứng dụng hoạt động ổn định khi dữ liệu được truyền không đầy đủ.

String name = it.getStringExtra("student_name"); int age = it.getIntExtra("student_age", 0);

Hoặc lấy dữ liệu theo dạng bundle:

// -get the Bundle object passed in -

String country = bundle.getString("student_country"); int year = bundle.getInt("student_yearbirth");

2.4.4 Lấy kết quả trả về từ Activity thông qua Intent

Trong nhiều trường hợp, khi mở một Activity mới nhằm yêu cầu thêm dữ liệu từ người dùng (ví dụ tên đăng nhập và mật khẩu), sau khi người dùng hoàn tất nhập liệu và quay lại Activity trước, dữ liệu vừa nhập cần được truyền ngược về Activity ban đầu để xử lý Để thực hiện, ta khởi chạy Activity thứ hai và nhận dữ liệu trả về bằng cơ chế giao tiếp giữa các Activity: có thể dùng startActivityForResult và override onActivityResult hoặc dùng API ActivityResultLauncher để đăng ký và nhận kết quả một cách trực quan Trên Activity thứ hai, khi người dùng xác nhận, đóng Activity bằng cách đóng gói dữ liệu vào một Intent (putExtra) và gọi setResult(RESULT_OK, data) rồi finish Ở Activity khởi đầu, nhận dữ liệu trả về trong onActivityResult hoặc trong callback của ActivityResultLauncher và tiến hành xử lý dữ liệu (kiểm tra tính hợp lệ, lưu trữ hoặc thao tác xử lý tiếp theo) Quá trình này mô tả các bước cơ bản: khởi tạo Activity thu thập dữ liệu từ người dùng, trả dữ liệu về cho Activity ban đầu và xử lý dữ liệu một cách hiệu quả và an toàn.

1 Trong GreetingActivity, thêm nút bấm „Got It‟:

Trong hàm xử lý sự kiện nhấp nút 'Got It' của GreetingActivity, ta thêm một đoạn mã trả về dữ liệu cho Activity gốc (Activity gọi nó) trước khi đóng GreetingActivity Đoạn mã này đóng gói thông tin cần thiết vào một Intent, gọi setResult với mã kết quả phù hợp (ví dụ RESULT_OK) và Intent trả về, rồi dùng finish() để kết thúc Activity hiện tại Việc trả dữ liệu từ GreetingActivity cho Activity cha cho phép luồng điều hướng giữa các Activity diễn ra mượt mà, tối ưu trải nghiệm người dùng và đảm bảo thông tin cần thiết được truyền tiếp một cách rõ ràng và có ý nghĩa.

// -set the data to pass back - itn.setData(Uri.parse( “Hello Got it! Have fun today!” )); setResult(RESULT_OK, itn);

2 Trong MainActivity, thay vì mở GreetingActivity bằng phương thức startActivity(), ta dùng startActivityForResult() kèm theo một mã yêu cầu: startActivityForResult(itent, 101);

3 Tiếp theo ta ghi đè hàm nhận sự kiện onActivityResult () khi Activity nhận kết quả tra về:

@Override public void onActivityResult(int requestCode, int resultCode, Intent data)

{ if (requestCode == 101 && resultCode == RESULT_OK) {

Toast.makeText(this, data.getData().toString(), Toast.LENGTH_SHORT).show();

Khi nhận được kết quả (dạng chuỗi) từ GreetingActivity, với mục đích minh họa, ta chỉ hiển thị text này lên màn hình dưới dạng Toast

2.4.5 Bộ lọc Intent (Intent Filter)

Khi bạn tạo một Activity hoặc một Service mới, bạn cần khai báo chúng trong AndroidManifest.xml Thông thường, khi sử dụng wizard trong Android Studio để tạo các component, phần đăng ký sẽ được tự động sinh ra và chèn vào AndroidManifest.xml, giúp bạn không phải tự viết mã đăng ký một cách thủ công.

Ví dụ, khi tạo MainActivity ta có file manifest dạng như sau:

Inside the AndroidManifest.xml file, the declaration of an Activity may include an element This tag defines the types of Intents that the Activity can respond to and handle, specifying the allowed actions, categories, and data schemes By using an , you control how the Activity is launched or invoked by other components or apps, guiding both system behavior and app interoperability.

Resource trong ứ ng d ụ ng Android

2.5.1 Resource (tài nguyên) là gì?

Trong mọi ứng dụng, tài nguyên và các giá trị cục bộ như văn bản, hình ảnh, biểu tượng ứng dụng và màu sắc đóng vai trò nền tảng cho giao diện người dùng Bài viết này sẽ giới thiệu chi tiết về tài nguyên Android và cách khai thác chúng để hiển thị nội dung một cách rõ ràng, nhất quán và hấp dẫn cho người dùng Việc quản lý đúng tài nguyên Android giúp ứng dụng thích ứng với các kích thước màn hình khác nhau, tối ưu hóa trải nghiệm và hiệu suất trên điện thoại, máy tính bảng và các thiết bị có kích thước hiển thị đa dạng.

Trong lập trình Android, có sự phân biệt rõ giữa tài nguyên (resources) và mã nguồn (source code) Mã nguồn được để trong thư mục java/, còn tài nguyên nằm trong thư mục res/ và bao gồm các file không liên quan trực tiếp đến mã Java, như hình ảnh, âm thanh, chuỗi văn bản, màu sắc, và thậm chí các file XML được dùng làm tài nguyên.

Khi mở thư mục res/, bạn sẽ thấy nhiều thư mục con được tạo sẵn khi khởi tạo một dự án Android Số lượng và tên các thư mục này phụ thuộc vào phiên bản Android Platform tại thời điểm bạn tạo dự án Bên cạnh các thư mục mặc định, bạn có thể tự tạo thêm nhiều thư mục khác để quản lý tài nguyên cho dự án một cách linh hoạt.

2.5.2 Các loại tài nguyên Để sử dụng tài nguyên trong một dự án Android, bạn cần phải sắp xếp chúng vào các thư mục con trong thư mục res Tên các thư mục con này được đặt theo quy định của hệ thống tài nguyên Android:

Thư mục animator chứa các tập tin XML định nghĩa hiệu ứng động cho các đối tượng view trong ứng dụng Thay vì định nghĩa hiệu ứng động lặp đi lặp lại trong mã nguồn, bạn có thể tạo tập tin XML animator tại đây với một hiệu ứng động cụ thể, nhằm quản lý, tái sử dụng và tối ưu hóa hiệu suất cho quá trình phát triển ứng dụng.

Trong phát triển ứng dụng, khi bạn cần tài nguyên hình ảnh cục bộ, hãy đặt chúng vào thư mục drawable để quản lý và tối ưu hóa việc tải tài nguyên Thư mục drawable cũng là nơi chứa các tập tin XML định hình hình dạng hoặc mô tả hình ảnh được vẽ ra trong mã, giúp bạn điều chỉnh giao diện một cách linh hoạt và tái sử dụng các thành phần hình ảnh Việc sắp xếp đúng thư mục drawable sẽ cải thiện hiệu suất và dễ bảo trì dự án, đồng thời cho phép tham chiếu hình ảnh và hình dạng một cách nhất quán từ mã nguồn.

• mipmap: Tương tự như drawable, thư mục mipmap lưu các hình ảnh, nhưng nó được sử dụng đặc biệt cho các biểu tượng launcher của ứng dụng

• layout: Chứa các tập tin XML là bố cục giao diện người dùng của ứng dụng

• menu: Chứa các tập tin menu XML được sử dụng tạo các mục trên action bar, menu điều hướng và menu con

• raw: Thư mục này được sử dụng để lưu trữ các tập tin tùy ý cho ứng dụng, chẳng hạn như âm thanh, video và các tập tin văn bản

Thư mục xml chứa các tập tin XML tùy ý được Android sử dụng cho nhiều tác vụ khác nhau, như xác định cấu hình tìm kiếm và quản lý các khả năng bên ngoài của hệ thống Những tệp XML này cho phép định nghĩa tham số cấu hình và cài đặt mà các ứng dụng và thành phần hệ thống có thể tham chiếu, từ đó tối ưu hóa quá trình tải cấu hình và tăng khả năng tích hợp với các thành phần bên ngoài.

Giá trị (values) là khu vực chứa các loại file thiết lập chung mà lập trình viên định nghĩa để mô tả thuộc tính, giao diện và các cấu hình, nhằm đảm bảo sự nhất quán và tối ưu hóa mã nguồn khi chỉnh sửa sau này Trong quá trình phát triển, không nên lặp lại các dòng lệnh giống nhau ở nhiều nơi trong dự án; thay vào đó, hãy định nghĩa chúng một lần và gọi tới khi cần Thư mục values có thể chứa các tài sản và cấu hình dùng chung như strings.xml, colors.xml, dimens.xml, styles.xml và các file thiết lập khác nhằm đồng bộ giao diện và logic, giảm thiểu sai sót và tăng khả năng bảo trì.

ThS Bùi Trung Úy 44 nhiều tập tin XML bao gồm các giá trị đơn giản được sử dụng trong ứng dụng, bao gồm:

color.xml là file định nghĩa các mã màu trong dự án Android của bạn Trong file này, mỗi màu được gán cho một tên mã màu cụ thể và khi bạn cần dùng màu nào, chỉ cần gọi tên mã màu đã được định nghĩa, giúp mã nguồn đồng nhất và dễ bảo trì.

#FFFFFF

#FFFF00

#FF0000

#00FFFF

#00FF00

#0000FF

+ dimens.xml : đây là file mà bạn sẽ định nghĩa ra các kích thước như cỡ chữ, chiều cao, chiều rộng các view

Ví dụ, một file dimens.xml mẫu

16dp

16dp

2dp

4dp

8dp

16dp

60dp

60dp

Strings.xml là file chứa các chuỗi văn bản trong ứng dụng Android, cho phép định nghĩa và tái sử dụng các đoạn văn bản ở nhiều màn hình khác nhau Khi cần hiển thị một chuỗi, bạn chỉ việc lấy từ strings.xml và nội dung sẽ hiển thị nhất quán trên mọi màn hình Việc chỉnh sửa được thực hiện ở một nơi duy nhất là file strings.xml, và mọi phần của ứng dụng sẽ tự động cập nhật thay đổi, giúp quản lý văn bản hiệu quả và tối ưu hóa trải nghiệm người dùng.

Ví dụ, một file strings.xml mẫu

Hello Android

Loading please wait…

Log Out

Notification Policy

Discover and Play

txtView.setText(Html.fromHtml(getString(R.string.html_text)));

Để đảm bảo giao diện đồng nhất cho mọi ứng dụng bạn xây dựng, hãy sử dụng styles.xml Thông qua styles, bạn có thể định nghĩa các phong cách cho các thành phần giao diện và thay thế giao diện mặc định cho các widget Các thuộc tính của một style có thể liên kết với nhiều view khác nhau trong các tập tin layout, từ đó giúp tái sử dụng và quản lý giao diện một cách nhất quán trên toàn bộ dự án.

2.5.3 Truy cập vào tài nguyên

Trong Android, mọi loại tài nguyên được gán tự động một định danh để nhận diện khi biên dịch và đóng gói ứng dụng, ví dụ như R.drawable.pic01, R.layout.activity_main hay R.id.text01 Các định danh này được định nghĩa dưới dạng các hằng số trong tập tin R.java, tập tin được sinh tự động trong quá trình biên dịch Bạn có thể dùng tên định danh này để truy cập nguồn tài nguyên từ mã Java hoặc từ các tập tin tài nguyên XML, nhờ đó tham chiếu tài nguyên trở nên nhất quán và dễ quản lý trên toàn bộ ứng dụng Android.

Truy cập tài nguyên trong code

Trong Android, nhiều đối tượng được khởi tạo từ nguồn tài nguyên và được thiết lập bằng định danh tài nguyên để cấu hình đúng cho đối tượng Ví dụ, để hiển thị một hình ảnh trong ImageView, ta có thể gắn một drawable resource bằng phương thức setImageResource, như imageView.setImageResource(R.drawable.pic01).

Trong Android, một đối tượng MediaPlayer được dùng để phát âm thanh hoặc video và tương tự như các thành phần media khác, nó có thể được tạo ra để phát các tập tin đa phương tiện ở định dạng raw bằng cách truyền vào ID tài nguyên của tập tin đó Ví dụ, mediaPlayer.create(getActivity(), R.raw.hello_song) cho phép khởi tạo MediaPlayer và bắt đầu phát nhạc ngay khi ứng dụng đang hoạt động, tối giản đường dẫn và tối ưu hóa truy cập tài nguyên nhúng trong thư mục res/raw.

Bạn có thể truy xuất tài nguyên gốc trong mã Android bằng cách gọi phương thức getResources() trên đối tượng Context Phương thức này trả về một đối tượng Resources chứa nhiều phương thức để truy cập tài nguyên cục bộ của ứng dụng, chẳng hạn như getColor() và getDrawable() Ví dụ: getResources().getColor(R.color.colorPrimary); hoặc getResources().getDrawable(R.drawable.kittens).

Truy cập tài nguyên trong XML

LẬP TRÌNH GIAO DIỆN ANDROID

FRAGMENT VÀ GIAO DIỆN NÂNG CAO

QUẢN LÝ DỮ LIỆU TRONG ANDROID

Ngày đăng: 23/02/2022, 10:19

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

🧩 Sản phẩm bạn có thể quan tâm