MỤC LỤC
Qua chương này ta sẽ cảm thấy được việc xây dựng ứng dụng cho Android đơn giản như thế nào. Tài liệu này trình bày về cách xây dựng ứng dụng bằng Eclipse trên Windows, thế nên yêu cầu cài đặt Eclipse là cần thiết, tất nhiên hoàn toàn có thể xây dựng ứng dụng với các trình IDE yêu thích khác trên những hệ điều hành khác, tuy nhiên trong khuôn khổ tài liệu này sẽ không đề cập đến.
Ở mục Target chọn một nền tảng mà bạn muốn thiết bị sẽ chạy (nếu bạn mới vừa cài xong SDK Platform Android 3.0 như bước trên thì ngay chỗ này chọn là Android 3.0). Trình giả lập (Android Emulator) sẽ bắt đầu chạy và thiết bị ảo sẽ boot vào Android (hơi lâu)… nếu xuất hiện giao diện tương tự như sau thì bạn đã cài đặt thành công.
Trong cửa sổ mới hiện lên, nhập vào “ADT Plugin” ở mục Name, và nhập vào dòng địa chỉ dưới đây ở mục Location. Trong cửa sổ Available Software, nhấp chọn vào Developer Tools sau đó nhấp Next vài lần, và cuối cùng là nhấp Finish.
Đây là Package Namespace (tuân theo quy luật đặt tên package trong ngôn ngữ Java) dùng khi bạn muốn sắp xếp toàn bộ mã nguồn của mình gọn gàng và tiện cho việc chia sẻ mã nguồn sau này. Package name này bắt buộc không được trùng tên với mọi package đã được cài đặt trong Android; vì l{ do này nên cách đặt tên theo phong cách đặt tên miền (domain-style) được khuyến khích. Các ứng dụng trên Android đều mang tính tương thích lùi, tức là nếu bạn xây dựng ứng dụng với “Build Target” là phiên bản Android 1.1 thì hoàn toàn yên tâm là trên các phiên bản Android lớn hơn (1.5 chẳng hạn) ứng dụng của bạn vẫn chạy bình thường.
ADT plug-in sẽ tự động làm mọi việc: khởi động Android Emulator, đóng gói ứng dụng, cài ứng dụng vào “thiết bị ảo”, sau cùng là chạy ứng dụng.
Ứng dụng hữu dụng chỉ khi nó được tương tác với người dùng ở mặt tiền. Bạn có thể tạo ra một ứng dụng hoàn toàn “vô hình”, nhưng tốt hơn là nên cung cấp một giao diện cơ bản để người dùng có thể hiệu chỉnh các thiết lập, dừng hoặc thoát hoàn toàn ứng dụng.
Trong một thư mục project, có một số thành phần (file, thư mục con) được tạo ra mặc định, còn lại phần lớn thì sẽ được tạo ra sau nếu cần trong quá trình phát triển ứng dụng. File kiểm soát cách các thành phần trong ứng dụng (activity, service, intent receiver,…) tương tác với nhau, cách ứng dụng tương tác với các ứng dụng khác, cũng như đăng k{ các quyền hạn về sử dụng tài nguyên trong máy. Manifest bắt đầu bằng thẻ root <manifest> với thuộc tính package để quy ước package của project và thuộc tính xmlns:android như là một quy định để chuẩn hóa cấu trúc file manifest.
Khi tạo mới một Android Project thì Eclipse sẽ tự động tạo sẵn cho ta 1 số file, thế nên như ứng dụng Hello world ở chương 2 tuy ta chưa gừ bất kz dũng code nào nhưng ứng dụng đã sẵn sàng, và khi chạy xuất ra màn hình dòng text “Hello World, HelloAndroid ”.
Eclipse sẽ tự động tạo ra một file Manifest bao gồm lớp Activity mặc định khi bạn tạo mới một Android Project (xem lại chương 2, mục tạo mới một Android Project). Trong đoạn code bạn vừa thay đổi, bạn tạo ra một TextView - chỉ chấp nhận tham số truyền vào phương thức khởi tạo là một thể hiện (instance) của lớp Context. Cho nên bạn truyền vào phương thức khởi tạo của TextView tham số this vẫn được chấp nhận, this ở đây chính là một tham chiếu của Context trong ứng dụng của bạn.
Chuỗi “Hello, Android ” trên thanh tiêu đề được Eclipse tạo ra tự động, và nội dung của chuỗi được định nghĩa trong file res/values/strings.xml, chuỗi được sử dụng như là tiêu đề của ứng dụng được quy định trong file AndroidManifest.xml (xem bên trên - mục Android Manifest).
Cấu trúc của một file layout rất đơn giản: nó là một văn bản XML với mỗi node là tên của một lớp View (mỗi mọi thành phần giao diện phải là một View - xem ở trên), tất nhiên bạn hoàn toàn có thể sử dụng tên của một lớp bất kz miễn sao nó được kế thừa từ lớp View. “Back stack” hoạt động theo trình tự “vào sau, ra trước”, cho nên khi người sử dụng đã thao tác xong với activity hiện tại và nhấn “BACK”, chương trình sẽ “pop” ra từ stack activity liền trước và activity đó sẽ tiếp tục hoạt động trở lại. Có nhiều phương thức callback mà một activity có thể nhận được khi có sự thay đổi trạng thái (khởi tạo, dừng, resume hoặc hủy) và bạn có thể thực hiện một thao tác tương ứng với sự thay đổi trạng thái.
Chẳng hạn khi bị dừng lại thì activity sẽ phải giải phóng bộ nhớ, đóng truy cập database,… Khi được khởi động lại bạn có thể truy cập những dữ liệu cần thiết và resume các thao tác bị gián đoạn trước đó.
Có một số phương thức bạn có thể sử dụng để kiểm soát vòng đời của activity trước những sự gián đoạn không mong muốn dẫn đến activity bị dừng lại, thậm chí bị hủy bỏ. Những phương thức này sẽ được nói tới trong phần Kiểm soát vòng đời Activity.
Thẻ <category> chỉ định Activity này sẽ được liệt kê trong danh sách ứng dụng của hệ thống (để người dùng có thể chạy activity này). Nếu bạn muốn ứng dụng của bạn bảo mật và không cho phép bất cứ ứng dụng nào khác có thể kích hoạt Activity này thì bạn không cần thêm bất kz <intent-filter>. Khi bạn tạo một Android Project mới thì Eclipse đã tự định ra khai báo Activity với Intent-filter như trên.
Bạn có thể bắt đầu một Activity khác trong activity đang chạy bằng phương thức startActivity(), truyền vào tham số là một Intent quy định rừ Activity nào bạn muốn bắt đầu và sẽ thực hiện hành động cụ thể nào (hệ thống sẽ chọn ra Activity chính xác cho bạn, nó có thể thuộc một ứng dụng khác).
Chú ý: trong hầu hết trường hợp bạn không nên dùng cách này để kết thúc một Activity, vì hệ thống Android sẽ làm nhiệm vụ này cho bạn. Tất nhiên lúc này Activity đang “paused” vẫn còn “sống” (activity vẫn còn được lưu trong bộ nhớ) tuy nhiên activity này có thể bị kết thúc bởi hệ thống khi bộ nhớ đã cạn kiệt. Khi Activity hoàn toàn bị che đi bởi một Activity khác (hay nói cách khác là Activity này đang nằm trong “background”).
Một Stopped Activity thì vẫn còn “sống”, tuy nhiên nó không còn hiển thị cho người dùng sử dụng và có thể bị kết thúc bất cứ lúc nào bởi hệ thống.
Trong phương thức này ta thường sẽ giải phóng bộ nhớ, hoặc dừng các hành động nào đó có thể chiếm dụng nhiều ram, cpu để cho Activity được kích hoạt tiếp theo làm việc trơn tru. Theo sau bởi phương thức onResume() nếu Activity được kích hoạt lại (quay về foreground), hoặc onStop() nếu nó ẩn đi. Phương thức này có thể được gọi bởi vì ở đâu đó có lời gọi finish() hoặc finishActivity(), cũng có thể vì hệ thống cần phải hủy bỏ để giải phóng bộ nhớ.
Ta cũng đã tìm hiểu về cách khai báo Activity trong file Manifest, cách bắt đầu chạy một Activity, cũng như cách kiểm soát vòng đời của Activity Ở chương sau ta sẽ tiếp tục nói về một thành phần khác cũng quan trọng không kém.
Điều này đòi hỏi phải có một sự xử l{ đa tiến trình, một tiến trình làm nhiệm vụ tính toán và vẽ, một tiến trình khác làm nhiệm vụ chờ các sự kiện xảy ra (cụ thể trong game là sự kiện touch màn hình) để xử l{. Bên trên ta đã tạo ra lớp AnimationView để hiển thị hình ảnh, và cũng để xử l{ sự kiện, tuy nhiên như thế thì chưa thể chạy đa tiến trình, giờ ta sẽ tạo ra một lớp mới có nhiệm vụ đảm nhiệm xử l{ và hiển thị hình ảnh thay cho lớp AnimationView. Nhưng cần lưu { rằng ta chỉ đặt duy nhất một thẻ <AnimationView> vào file XML Layout, cho nên bất kz lớp nào muốn hiển thị hình ảnh lên màn hình thì đều phải thông qua tham chiếu tới AnimationView.
Phương thức này cần truyền vào tham số là một Canvas bởi vì khi tạo mới một quả bóng, tọa độ của quả bóng sẽ được xác định ngẫu nhiên, nhưng vẫn cần phải nằm trong vùng màn hình nên ta cần truyền vào Canvas hiện tại để xác định kích thước của Canvas đó, từ đó xác định tọa độ cho quả bóng.
Phương thức này trả về một số kiểu Int, dùng để xác định lượng điểm số tương ứng với kích thước quả bóng. // xóa mọi hình ảnh trước đó bằng cách tô màu trắng canvas.drawColor(Color.WHITE);. // di chuyển quả bóng sang vị trí mới, sau đó là vẽ this.balls.get(i).update(canvas);.
Tới đây ta chạy thử game, các quả bóng đã xuất hiện và bay qua lại trên màn hình.