Tập hợp các kiến thức cơ bản và các ví dụ cụ thể kèm theo phân tích về việc phát triển ứng dụng cho smartphone hệ điều hành android. Cung cấp cho người đọc cái nhìn cơ bản về công tác lập trình một ứng dụng hoặc một chương trình game.
Phát triển ứng dụng Smartphone Tài liệu lưu hành nội bộ Đây là tài liệu tham khảo sử dụng trong môn học Lập trình ứng dụng Smartphone – Android được tổng hợp, biên soạn từ nhiều nguồn bởi các thành viên của Nhóm nghiên cứu và ứng dụng công nghệ A106-Đại học Hoa Sen. Nhóm A106-http://profiles.hoasen.edu.vn/groups/584/ Phát triển ứng dụng Smartphone – Android Phát triển ứng dụng Smartphone Phần 01: Làm quen với Android Lê Đức Huy Email: leduchuy89vn@gmail.com Phát triển ứng dụng Smartphone – Android Mục lục 1 Tổng quan Android 4 1.1 Các thành phần của một ứng dụng Application 5 1.1.1 Activity 5 1.1.2 Service 5 1.1.3 Content provider 5 1.1.4 Broadcast receiver 6 1.2 AndroidManifest.xml 7 2 Hello Android 8 2.1 Phân tích ứng dụng “Hello Android” 13 3 Activity 18 Vòng đời của một Activity 19 4 Cơ chế sử lý sự kiện trên Android 22 5 Intent 26 Intent là gì? 26 5.1 Intent chứa những dữ liệu gì ? 27 Tự định nghĩa action 29 Intent có 02 dạng chính 30 Intent Filter 30 Luật xác định thành phần phù hợp Intent 31 5.2 Sử dụng Intent như thế nào? 32 5.2.1 Intent tường minh thực thi Activity 32 5.2.2 Intent không tường minh thực thi Activity 32 5.2.3 Truyền nhận thông tin giữa các Activity sử dụng đối tượng intent 33 Phát triển ứng dụng Smartphone – Android Phát triển ứng dụng Smartphone – Android 1 Tổng quan Android Ứng dụng Android được viết bằng ngôn ngữ Java. Bộ công cụ Android SDK biên dịch mã lệnh cùng với bất kì dữ liệu cũng như tài nguyên(hình ảnh, âm thanh) đi kèm với ứng dụng tạo thành gói có phần mở rộng .apk (Viết tắt của từ Android package). Tất cả phần mã thực thi đi kèm với tài nguyên (resources) được nén trong một tệp đơn có đuôi .apk được xem như là một ứng dụng chạy trên các thiết bị chạy Android. File nén này có thể dùng để cài đặt và thực thi. Khi được cài đặt vào thiết bị, mỗi ứng dụng Android “sống” trong một “hộp cát bảo mật” của chính nó. Trong đó: o Hệ điều hành Android được xem như một hệ thống Linux đa người dùng. Nơi mà mỗi ứng dụng được xem như một người dùng. o Mặc định, hệ thống sẽ cấp phát cho mỗi ứng dụng một định danh (User ID-Unique Linux user ID), định danh này chỉ được sử dụng bởi hệ điều hành và ứng dụng không hề hay biết về định danh này. Hệ thống sẽ gán quyền cho mọi tệp tin trong một ứng dụng để chỉ những User ID được gán cho ứng dụng đó mới có thể truy cập chúng. o Mỗi tiến trình trên nền tảng Android sẽ có một máy ảo (Virtual machine) của riêng nó, bằng cách này các câu mã lệnh của một ứng dụng sẽ được thực thi một cách độc lập với các ứng dụng khác. o Mặc định, mỗi ứng dụng sẽ chạy trên tiến trình của riêng nó. Android sẽ khởi động tiến trình khi mà bất kì một thành phần nào của ứng dụng cần thực thi và sau đó sẽ tắt mọi tiến trình khi mà nó không cần dùng thêm nữa hoặc khi hệ thống cần bộ nhớ cho ứng dụng khác. Bằng cách này Android đã hiện thực hiện “nguyên tắc đặc quyền tối thiểu”. Đó là, theo mặc định, mỗi ứng dụng sẽ chỉ được truy cập đến những thành phần mà nó cần phải sử dụng để làm việc và không thêm gì khác. Điều này tạo ra một môi trường cực kì bảo mật, nơi luôn đảm bảo mọi ứng dụng không thể truy xuất các phần khác của hệ thống nếu nó không được quyền. Điều này không có nghĩa là mọi ứng dụng hoàn toàn độc lập với các ứng dụng khác cũng như với hệ điều hành. Có nhiều cách để một ứng dụng có thể chia sẻ dữ liệu với ứng dụng khác hoặc để truy xuất các dịch vụ của hệ điều hành(contact, phone, sms, email…) như: o Nếu hai ứng dụng có thể truy xuất nguồn tài nguyên của nhau thì có thể cho hai ứng dụng nhận cùng một User ID. Để tiết kiệm nguồn tài nguyên thì các ứng dụng có cùng User ID sẽ thực thi trên cùng một tiến trình trên cùng một máy ảo. o Một ứng dụng có thể yêu cầu quyền được truy xuất dữ liệu của thiết bị như contact, sms, SD card, camera, Bluetooth… Mọi quyền được sử dụng trên một ứng dụng cụ thể phải được gán khi ứng dụng đó được cài đặt lên thiết bị (Android sẽ thông báo những quyền(Truy cập Internet, contact, sms…) mà ứng dụng cần sử dụng để hỏi người dùng có đồng ý cho phép cài đặt hay không). Phát triển ứng dụng Smartphone – Android Phần dưới đây sẽ cung cấp cho người đọc một số khái niệm về các thành phần của một ứng dụng Android. 1.1 Các thành phần của một ứng dụng Application Cách thành phần của một ứng dụng Android là các khối thiết yếu dùng để ghép thành một ứng dụng Android. Mỗi thành phần là một góc nhìn khác nhau tạo thành một ứng dụng Android đầy đủ. Không phải bất kì ứng dụng nào cũng có đầy đủ các thành phần dưới đây, việc có hay không có một thành phần nào tùy thuộc vào mỗi ứng dụng. Một số thành phần sẽ có quan hệ phụ thuộc lẫn nhau. Mỗi thành phần có một vai trò khác nhau giúp định nghĩa một ứng dụng Android đầy đủ. Dưới đây có bốn loại thành phần. Mỗi loại có một mục đích khác nhau và có một vòng đời khác nhau giúp định nghĩa cách mà một thành phần được tạo ra và được hủy khác nhau: 1.1.1 Activity Một Activity đại diện một màn hình đơn với giao diện người dùng. VD: Chương trình Email tích hợp sẳn của hệ điều hành Android có một activity để hiển thị một danh sách các email, một activity thứ hai dùng để hiển thị nội dung chi tiết của một email. Mặc dù cách activity làm việc với nhau để tạo nên một trải nghiệm thống nhất trên ứng dụng, tuy nhiên bản thân chúng hoàn toàn độc lập với nhau. VD: Khi soạn thảo email với ứng dụng Email tích hợp sẳn người dùng có thể mở một activity của ứng dụng Camera nếu người dùng cần chia sẽ một tấm hình chụp bằng thiết bị hiện tại. 1.1.2 Service Service là một thành phần dùng để thực thi một công việc dưới dưới nền hệ điều hành (Công việc được thực thi ẩn với người dùng). Thành phần này được dùng cho các công việc cần nhiều thời gian để thực thi hoặc dùng để điều khiển thực thi các công việc từ xa bởi một tiến trình khác. VD: Ứng dụng A chạy trên tiến trình pA kết nối đến ứng dụng B hiện đang chạy trên tiến trình pB để yêu cầu B thực hiện một công việc nào đó. 1.1.3 Content provider Một content provider dùng quản lý việc chia sẻ một tập dữ liệu ứng dụng nào đó. Bạn có thể lưu trữ dữ liệu trền file, trên SQLite database, trên web hoặc trên bất kì nơi lưu trữ nào mà ứng dụng có thể truy xuất. Thông qua việc sử dụng content provider một ứng dụng khác có thể truy vấn, chỉnh sửa tập dữ liệu đó. VD: Ứng dụng Contact tích hợp sẳn trong Android cung cấp một content provider dùng để quản lý danh sách contact trên ứng dụng. Bằng cách này, bất kì chương trình nào cũng có thể truy xuất danh sách contact này mặc cho “nguyên tắc đặc quyền tối thiểu” đã đề cập ở trên. (Lưu ý: Nếu không cung cấp một content provider thì dữ liệu contact chỉ có thể được sử dụng bởi ứng dụng Contact và không thể được truy xuất bởi ứng dụng nào khác). Phát triển ứng dụng Smartphone – Android 1.1.4 Broadcast receiver Broadcast receiver là một thành phần hồi đáp những tín hiệu được phát ra trên toàn hệ thống. Có rất nhiều broadcast receiver được xây dựng sẳn trên hệ điều hành Android. VD: Có broadcast receiver dùng để bắt tín hiệu tắt màn hình, tín hiệu pin yếu… Người phát triển có thể tự xây dựng một broadcast receiver để bắt các tín hiện cần thiết cho ứng dụng. VD: Bắt tín hiệu để biết một dữ liệu nào đó đã được tải về thiết bị và sẳn sang để sử dụng. Mặc dù một broadcast receiver không hiển thị giao diện cho người dùng quan sát nhưng nó có thể tạo các thông báo trên thanh trạng thái. Trong một số trường hợp broadcast receiver có thể khởi động một service để thực thi một số công việc nào đó. Một khía cạnh độc đáo của hệ điều hành Android là nó được thiết kế để bất kì ứng dụng nào cũng có thể khởi động một activity của ứng dụng khác. VD: Nếu bạn muốn người dùng ứng dụng có có thể chụp hình từ camera của thiết bị. Hiển nhiên công việc này đã được một ứng dụng khác làm rồi, bạn không cần tạo mới một activity để làm công việc này mà đơn giản chỉ cần khởi động một activity chụp ảnh của ứng dụng Camera để chụp hình. Khi chụp hình hoàn tất, bức ảnh sẽ được trả về cho ứng dụng của bạn. Bằng cách này ta có thể tiết kiệm rất nhiều thời gian bằng cách sử dụng lại cách thành phần có sẳn của hệ điều hành. Khi hệ thống khởi động một thành phần, nó cũng khởi động tiến trình cho ứng dụng đó(Nếu nó chưa được khởi động). VD: Nếu ứng dụng của bạn sử dụng một activity của ứng dụng Camera để chụp hình, hệ thống sẽ khởi động tiến trình của ứng dụng Camera. Chính vì điểm này mà một ứng dụng Android sẽ hoàn toàn khác so với các ứng dụng trên các nền tảng khác. Một ứng dụng Android không có một điểm bắt đầu duy nhất (Không có hàm main). Do hệ thống thực thi mỗi ứng dụng trên một tiến trình riêng biệt cùng với quyền truy xuất hạn chế nên bất kì một ứng dụng nào cũng không được quyền khởi động một thành phần của ứng dụng khác. Để khởi động một thành phần của ứng dụng khác, bạn phải chuyển một đối tượng kiểu Intent đến hệ điều hành, đối tượng kiểu Intent này sẽ chứa các thông tin về thành phần mà bạn muốn khởi động. Nhờ những thông tin này mà hệ điều hành sẽ khởi động thành phần phù hợp. Khởi động thành phần Ba trong số bốn loại thành phần chính của một ứng dụng Android (Activity, Service, Broadcast receiver) có thể được khởi động bởi một đối tượng Intent. Trong đó đối tượng Intent có ý nghĩ gần giống như một đường dẫn đến một địa chỉ web (URLs) mà hằng ngày mọi người vẫn sử dụng. Định dạng URLs được Tim Berners phát minh để sử dụng trong giao thức Hypertext Transfer Protocol (HTTP). Định dạng này là một hệ thống các động từ đi kèm các địa chỉ. Địa chỉ sẽ xác định nguồn tài nguyên như Web page, hình ảnh Động từ sẽ xác định cần phải làm cái gì với nguồn tài nguyên đó: GET để lấy dữ liệu về, POST để đưa dữ liệu lên để thực thi một công việc nào đó. Khái niệm Intent cũng tương tự, Intent là một mô tả trừu tượng của một hành động được thực thi. Trong đó đối tượng Intent sẽ xác định thành phần nào (Activity, Service, Broadcast receiver) sẽ được khởi động, dữ liệu cũng như hành động cần thực thi với dữ liệu đi kèm. Phát triển ứng dụng Smartphone – Android VD: Để hiển thị thông tin của một contact. Ta cần tạo một đối tượng kiểu Intent xác định hành động là “xem thông tin contact” thành phần Android sẽ được khởi động để thực thi hành động là activity “Contact details” của ứng dụng Contact (Ứng dụng tích hợp sẳn trong hệ điều hành Android) và dữ liệu đi kèm sẽ là id của contact cần xem thông tin. Có thể sử dụng Intent để: - Khởi động một Activity. - Khởi động một Service. - Kết nối đến một Remote service. - Khởi động một Broadcast receiver. - Thực thi một câu truy vấn dữ liệu trên Content Provider 1.2 AndroidManifest.xml Trước khi hệ điều hành Android có thể khởi động một thành phần (Activity, Services, Broadcast receiver) thì hệ thống phải biết thành phần này có tồn tại hay không bằng cách đọc file AndroidManifest.xml của ứng dụng. Mỗi ứng dụng phải khai báo mọi thành phần (Activity, Service, Broadcast receiver) trong file này và phải đặt ở thư mục gốc của ứng dụng. Mỗi file manifest có những khai báo: - Định danh xác định các quyền của người sử dụng như truy xuất internet, truy xuất danh sách contact… - Xác định phiên bản API tối thiểu mà ứng dụng có thể thực thi. Phiên bản API này tương ứng với các phiên bản của hệ điều hành Android. - Các tính năng phần cứng cần thiết cho ứng dụng như GPS, camera, Bluetooth… - Các bộ API liên kết sử dụng trong ứng dụng (VD: Google map…). - Và … - Một file AndroidManifest.xml có cấu trúc như sau: Phát triển ứng dụng Smartphone – Android <?xml version="1.0" encoding="utf-8"?> <manifest > <application android:icon="@drawable/app_icon.png" > <activity android:name="com.example.project.ExampleActivity" android:label="@string/example_label" > </activity> </application> </manifest> Trong đó có thẻ gốc là thẻ manifest. Thẻ gốc này sẽ có ít nhất một thể con là application với các thuộc tính xác định icon của ứng dụng, tên ứng dụng… . Trong thẻ application sẽ đặt các khai báo các thành phần tồn tại trong ứng dụng bằng cách sử dụng các thẻ: o <activity>: Khai báo một Activity. o <service>: Khai báo một service. o <receiver>: Khai báo một Broadcast reciever. o <provider>: Khai báo một Content Provider. Ngoài việc khai bao các thành phần tồn tại trong ứng dụng còn có các khai báo: o <supports-screens>: Khai báo loại màn hình mà ứng dụng hổ trợ. o <uses-configuration>: Khai báo phần cứng nhập liệu cần thiết cho ứng dụng (VD: Bàn phím, trackball, phiếm bấm năm chiều…). o <uses-feature>: Các tính năng phần cứng cần thiết cho ứng dụng. o <uses-sdk>: Phiên bản API tối thiểu. 2 Hello Android Ứng dụng kinh điển nhất mà mọi lập trình viên khi làm việc với một ngôn ngữ lập trình là xuất là câu “Xin chào thế giới”. Để bắt đầu làm quen với Android ta sẽ bắt đầu với ứng dụng “Xin chào Android”. Tạo mới một project Android với các thông số sau: Project name: Hello Android Build target: Android 2.3.3. Phát triển ứng dụng Smartphone – Android Application name: Hello Android Package name: niit.android Create Activity: main Sau khi tạo project ta sẽ có được một cấu trúc như sau: [...]... thể sử dụng trong ứng dụng, mọi activity đều phải được khai báo trong tệp AndroidManifest.xml với một thẻ như ví dụ sau: Phát triển ứng dụng Smartphone – Android ... sử dụng trong ứng dụng( thư viện của hãng thứ ba) src/ : Thư mục chứa mã nguồn Java của ứng dụng res/ : Thư mục chứa các tài nguyên của ứng dụng, như các icons, tệp tin layout, res/drawable/ : Thư mục chứa file hình ảnh (PNG, JPEG, ) res/layout/ : Thư mục chứa các tệp tin xml đánh giấu giao diện res/menu/ : Thư mục chứa các tệp tin xml đánh giấu menu của ứng dụng Phát triển ứng dụng Smartphone – Android. .. encoding="utf-8"?> . thẻ main.xml như trong hình để xem nội dung của file main.xml. Phát triển ứng dụng Smartphone – Android Thay đổi nội dung của tệp main.xml với nội dung như sau: <?xml version="1.0". Android . Tạo mới một project Android với các thông số sau: Project name: Hello Android Build target: Android 2.3.3. Phát triển ứng dụng Smartphone – Android Application name: Hello Android. dụng Smartphone – Android Tệp AndroidManifest.xml có nội dung như sau: <?xml version="1.0" encoding="utf-8"?> <manifest xmlns :android= "http://schemas .android. com/apk/res /android& quot;