Di động cho mọi người: Các hoạt động (Activities) và biểu tượng (icons) trong vòng đời ứng dụng Android của bạn

Thêm điều hướng cá tính vào ứng dụng Android của bạn

Lớp Activity chính là một khung màn hình công việc (workhouse) của ứng dụng di động, và nó cũng là nơi bạn có thể tinh chỉnh những tương tác của ứng dụng di động với người dùng. Giúp mọi thứ hoạt động chính xác theo cách mà bạn muốn trong vòng đời ứng dụng, sau đó sử dụng các biểu tượng (icon) và thanh hoạt động (Action-bar) hướng dẫn người dùng thông qua điều hướng giao diện người dùng (UI) và các tính năng khác của ứng dụng.

Andrew Glover, CTO, App47

Andrew GloverAndrew Glover là nhà phát triển, tác giả, diễn giả và nhà doanh nghiệp có niềm đam mê về phát triển theo hành vi, Tích hợp liên tục và phát triển phần mềm Agile. Ông là người sáng lập khung công tác BDD (Behavior-Driven Development - Phát triển theo hành vi) easyb và là đồng tác giả của ba cuốn sách: Continuous Integration (Tích hợp liên tục), Groovy in Action (Thực hành Groovy) và Java Testing Patterns (Các mẫu thử nghiệm Java). Bạn có thể xem blog và theo dõi ông trên Twitter.



25 09 2013

Giới thiệu

Về loạt bài này

Phát triển ứng dụng di động đang bùng nổ, và đó là thị trường cho các nhà phát triển ứng dụng di động. Loạt bài này trên developerWorks giới thiệu tổng quan về di động cho các nhà lập trình có kinh nghiệm nhưng vẫn còn mới với lĩnh vực di động này.

Bắt đầu viết các ứng dụng bằng mã Java™, sau đó mở rộng bộ công cụ của bạn để thêm vào các ngôn ngữ JVM, các Framework ngôn ngữ kịch bản, HTML5/CSS/JavaScript, các công cụ của bên thứ ba, và hơn thế nữa. Từng bước một, bạn sẽ rành về các kỹ năng cần thiết để phát triển bất kỳ ứng dụng di động nào.

Thiết bị di động ngày nay phát triển rất mạnh, nhiều hơn cả máy tính để bàn mà nhiều nhà phát triển đã sử dụng để viết ứng dụng đầu tiên của họ. Vì vậy, thật dễ dàng để quên rằng thiết bị di động vẫn là một môi trường hạn chế về tài nguyên. Khi phát triển một ứng dụng đi động, bạn đừng bao giờ quên những hạn chế của môi trường sẽ chạy nó. Điều này đặt biệt quan trọng khi bạn xem xét việc ứng dụng của bạn sẽ phải tranh chấp tài nguyên với ứng dụng khác — một số ứng dụng của họ được người dùng sử dụng cho các hoạt động hàng ngày nhiều hơn là của bạn.

Một cách chắc chắn rằng ứng dụng của bạn sẽ được sử dụng rộng rãi nếu nó tiết kiệm tài nguyên hệ thống. Trong Android, cơ cấu để cả hai cùng sử dụng và tiết kiệm tài nguyên hệ thống chính là lớp Activity. Bạn càng hiểu rõ về vòng đời của workhouse (nó rất giống với một Java Servlet), bạn sẽ càng có khả năng tinh chỉnh để ứng dụng của bạn sử dụng tài nguyên hệ thống một cách hiệu quả hơn.

Chúng ta sẽ bắt đầu nhanh vào vòng đời của lớp Activity. Bạn sẽ tìm hiểu về các phương thức xử lý từng giai đoạn trong vòng đời của một ứng dụng Android thông qua việc thực thi các ứng dụng Demo. Một khi bạn hiểu rõ cách mà các phương thức này làm việc với nhau, bạn sẽ có cách sắp xếp tốt cho việc sử dụng tài nguyên hệ thống một cách khôn ngoan. Sau đó bạn sẽ chuyển sang việc nhận định và cập nhật hệ thống điều hướng trong ứng dụng demo của bạn để sử dụng các action icons (biểu tượng hoạt động) của bạn hơn là các nút trong menu tương tác cho người dùng. Icon là một chuẩn trong giao diện ứng dụng di động, và trong phiên bản Android mới (4.2.2 hoặc cao hơn) đã loại bỏ các tùy chọn menu trong ưu tiên của các Action-bar. Biết làm thế nào để tích hợp những tính năng để các thiết bị Android của bạn sẽ phục vụ tốt!


Vòng đời của lớp Activity

Vòng đời của một Activity ánh xạ (maps) trực tiếp tới vòng đời của ứng dụng di động Android. Giống khi người dùng sử dụng ứng dụng của bạn hoặc thiết bị lưu trữ nó, nền tảng Android sẽ thực thi ngược trên một thể hiện Activity. Khi người dùng khởi động ứng dụng của bạn, một Activity đầu tiên thực thi định nghĩa vòng đời; nó thực thi các trạng thái khác nhau khi ứng dụng chạy nền, và những trạng thái khác nữa khi bị tắt. Hình 1 thể hiện mỗi trạng thái ứng với tương tác trong vòng đời của Activity.

Hình 1. Vòng đời Activity của Android
Sơ đồ vòng đời hoạt động của ứng dụng Android

Vòng đời của ứng dụng di động Android gồm 4 trạng thái:

  • Khởi động (Start)
  • Tạm ngưng và tiếp tục (Pause and resume)
  • Dừng và khởi động lại (Stop and restart)
  • Hủy bỏ (Destroy)

Tìm hiểu về từng giai đoạn và phương thức gọi của nó (mà bạn có thể thực hiện trong một thể hiện Activity) trong các phần tiếp theo.

Giai đoạn Start trong vòng đời Activity

Ứng dụng chạy thử (Demo)

Nếu bạn đang làm theo hướng dẫn của loạt bài này, thì chắc hẳn bạn đã tạo ứng dụng demo trong bài đầu tiênbài thứ hai. Nếu bạn chưa có ứng dụng demo, tôi khuyên bạn nên tạo một cái trước khi tiếp tục. Ngoài ra, bạn có thể sao chép các kho Git cho riêng ứng dụng demo Overheard Word của tôi (xem Tài nguyên).

Trong bài viết trước, bạn đã sử dụng phương thức gọi lại tương ứng với việc bắt đầu một Activity, đó là onCreate. Bạn cũng có thể làm quen với onStartonResume, hai phương thức bổ sung được gọi khi bắt đầu. Bây giờ hãy xem xét các phương thức trong phạm vi của vòng đời Activity.

Trong môi trường phát triển Android của Eclipse, bạn có thể dễ dàng ghi đè các phương thức bằng cách chọn tùy chọn Override/Implement Methods..., như Hình 2.

Hình 2. Ghi đè các phương thức vòng đời Activity
Ảnh chụp phương thức ghi đè của vòng đời hoạt động trong Eclipse.

Tiếp theo, chọn cả hai phương thức onStartonResume:

Hình 3. Chọn một phương thức gọi
Hình ảnh chọn phương thức gọi lại trong Eclipse.

Bây giờ sử dụng lớp Log của Android để tạo ra một số lời phát biểu, giống như tôi làm ở Liệt kê 1.

Liệt kê 1. Thực hiện các phương thức gọi Activity của Android
@Override
protected void onResume() {
    super.onResume();
    Log.d("overheardword", "onResume Invoked");
}

@Override
protected void onStart() {
    super.onStart();
    Log.d("overheardword", "onStart Invoked");
}

Bạn có thể kiểm tra kết quả bằng cách xuất ra vài thể hiện và xem chúng trong Logcat, giống như Hình 4.

Hình 4. Các thông tin debug của LogCat
Ảnh chụp các cậu lệnh gỡ lỗi (debug) của Logcat.

Ghi log Android với LogCat

Android có hệ thống ghi log của riêng mình, android.util.Log. Với lớp tiện ích này, bạn có thể ghi log ở nhiều cấp độ khác nhau (chẳng hạn như info, warn, debug, v.v...) và xem các bản ghi thông qua công cụ logcat liên kết với Android SDK của bạn. Trong Eclipse, bạn sẽ thấy LogCat như một tab, mà bạn có thể sử dụng để lọc các thẻ (tag) và thậm chí là các thể hiện của ứng dụng. Logcat cũng cho phép bạn truy cập các bản ghi trên một thiết bị đơn giản bằng cách cắm thiết bị vào máy tính để bàn của bạn hoặc máy tính xách tay thông qua cổng USB.

Như bạn có thể thấy, onCreate được gọi lần đầu tiên khi ứng dụng của bạn được nạp, trong khi onStartonResume được sử dụng trong phạm vi của các giai đoạn khác, chẳng hạn như khi một ứng dụng được chạy nền và khởi động lại.

Pause (tạm ngừng) và resume (tiếp tục) trong vòng đời Activity

Bởi vì các thiết bị di động thường chứa nhiều ứng dụng, các ứng dụng này cạnh tranh với nhau theo nhiều cách để thu hút sự chú ý của người dùng, điều quan trọng là ứng dụng của bạn biết khi nào để một ứng dụng khác chiếm màn hình và sử dụng tài nguyên của thiết bị. Đôi khi người dùng sẽ cần phải thực hiện một cuộc gọi đến trong khi sử dụng ứng dụng của bạn, hoặc ứng dụng của bạn có thể đưa ra một hộp thoại pop-up như một yêu cầu thông tin hoặc thông báo lỗi. Hoặc hành động sẽ phần nào cản trở các Activity hiện tại.

Khi một Activity bị che khuất một phần, phương thức onPause được gọi. Khi Activity tạm ngưng để lấy lại tiêu điểm, phương thức onResume được gọi. Mỗi phiên pause-and-resume (tạm-ngưng-và-tiếp-tục) có nghĩa là các Activity bị ảnh hưởng đã được che khuất một phần nhưng không hoàn toàn ẩn.

Khi ứng dụng được ẩn hoàn toàn, chẳng hạn, khi người dùng có một cuộc gọi điện thoại, onPause cũng được gọi, nhưng trong trường hợp này nó được theo sau bởi onStop. Khi ứng dụng được khôi phục một lần nữa, onRestart được gọi, tiếp theo là onStart, và sau đó onResume.

Hãy xem điều gì sẽ xảy ra khi bạn thực hiện onPause, onRestart, và onStop. Nếu bạn đã có một ứng dụng Android trong quá trình làm việc theo loạt bài này, hãy thêm một số thông báo vào mã của bạn và sau đó chạy nó. Bấm vào nút Home để ẩn hoàn toàn ứng dụng, và sau đó nhấn vào biểu tượng của ứng dụng để đưa nó trở lại. Đầu tiên, bạn sẽ thấy phương thức onPause theo sau bởi onStop. Khi bạn nhấn vào biểu tượng để gọi lại ứng dụng, bạn sẽ thấy phương thức onRestart theo sau bởi onStart, và sau đó là onResume.

Việc hủy bỏ một Activity cũng là một điều gì đó bình thường trong quá trình chạy một ứng dụng. Ví dụ, bạn có thể là chấm dứt một thể hiện Activity bằng cách gọi phương thức finish của nó. Điều quan trọng ở đây là bởi vì một Activity đang được tắt, nó sẽ theo vòng đời giống như khi nó được ẩn, nhưng lời gọi cuối cùng của nó là phương thức onDestroy.

Trong Liệt kê 2, tôi sử dụng ứng dụng Overheard Word (xem bài "Di động cho mọi người: Lập trình xử lý cử chỉ trong Android" hay lấy về tệp nguồn từ Github) để làm rõ cho quá trình này, bằng cách gọi phương thức finish khi vuốt lên.

Liệt kê 2. Ví dụ hủy bỏ một Activity
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
   try {
       final SwipeDetector detector = new SwipeDetector(e1, e2, velocityX, velocityY);
       if (detector.isDownSwipe()) {
        return false;
       }else if (detector.isUpSwipe()) {
        finish();
       }else if (detector.isLeftSwipe()) {
        Toast.makeText(getApplicationContext(), "Left Swipe", Toast.LENGTH_SHORT).show();
       }else if (detector.isRightSwipe()) {
        Toast.makeText(getApplicationContext(), "Right Swipe", Toast.LENGTH_SHORT).show();
       }
   } catch (Exception e) {
       // nothing
   }
   return false;
}

Các phương thức vòng đời Activity mà bạn dùng nhiều là onCreate, onRestart, và onDestroy. Ví dụ, tôi đã dùng onRestart để làm mới khía cạnh khung nhìn giao diện người dùng của ứng dụng và phương thức onDestroy để phát hành kết nối đến một cơ sở dữ liệu như SQLite chạy cục bộ trên các thiết bị Android.

Có thể nó chưa rõ ràng, nhưng một khi bạn bắt đầu làm việc với các mã nguồn bên ngoài — chẳng hạn như các dịch vụ web bên ngoài hoặc hệ thống tập tin của thiết bị hoặc cơ sở dữ liệu — các giai đoạn vòng đời này sẽ trở nên cực kỳ quan trọng.

Tiếp theo chúng ta hãy xem những gì sẽ xảy ra khi chúng ta sử dụng hai phương thức móc ActivityonCreateOptionsMenuonOptionsItemSelected— để thực hiện hành vi Thực đơn (Menu) của ứng dụng. Một khi chúng ta có được hai phương thức đồng bộ, chúng ta sẽ liên kết tính năng của nó với các biểu tượng giao diện người dùng pizazz.


Chuyển hướng với Menu và Action

Khi tôi tạo ra dự án Overheard Word trong Eclipse, phương thức Activity đầu tiên mà tôi định nghĩa là onCreateOptionsMenu. Như bạn có thể đoán, phương thức này tạo ra một Menu tùy chọn. Trên các thiết bị Android cũ, Menu tùy chọn được đại diện bởi nút Menu. Trên các thiết bị mới hơn, nó được biểu diễn như là một loạt các dấu chấm theo chiều dọc, được hiển thị riêng trong những ứng dụng. Các thiết bị Android mới hơn không cần phải có một nút Menu.

Trong trình giả lập của một thiết bị cũ, bạn sẽ thấy một nút trên là "Menu". Bằng cách nhấn vào nó, một thể hiện của ứng dụng sẽ hiển thị một Menu tùy chọn. Trong trường hợp này, chúng tôi sẽ xem xét các tùy chọn cho việc điều hướng. Ví dụ, nếu người dùng nhấn vào nút Home, anh ta sẽ thấy thông tin giống như thể hiện ở Hình 5.

Hình 5. Một Menu chưa được thực hiện
Ảnh chụp mục menu chưa thực hiện được hiển thị trong trình giả lập Android.

Trên máy tính bảng không có nút Menu. Thay vì lựa chọn các mục từ menu (thanh thực đơn), người dùng được hỏi để thực hiện các actions (hành động) khác nhau. Giao diện người dùng mới này được gọi là Action-bar (thanh hành động), được hiển thị trong Hình 6.

Hình 6. Action-bar mới của Android
Thanh hoạt động mới của Android trong trình giả lập Android.

Nút Menu và Action-bar hoạt động như nhau, Action-bar được dùng trên nhiều thiết bị mới hơn. Vì mục tiêu của chúng ta là đang phát triển trên phiên bản Android cũ hơn (hãy nhớ lại rằng hơn 50% thiết bị Android chạy Gingerbread!), tôi sẽ sử dụng nút Menu quen thuộc cho mục đích minh họa. Sau đó, tôi sẽ chỉ bạn các cập nhật mã định hướng để dùng Action-bar, trong trường hợp bạn muốn viết ứng dụng cho các thiết bị Android phiên bản mới hơn.

Tạo một Menu tùy chọn

Bước đầu tiên để trang bị cho Overhead Word một giao diện người dùng tương tác hiệu quả hơn là việc sử dụng một Menu tùy chọn cho phép người dùng thoát ứng dụng. Thoát ứng dụng là một giai đoạn của vòng đời Activity, vì vậy chúng tôi sẽ dùng các phương thức Activity để thực hiện chức năng này.

Hãy nhớ rằng tất cả mọi thứ liên quan đến giao diện người dùng trong một ứng dụng Android ứng với một tập tin XML, vì vậy chỉnh sửa tập tin XML chính là cách bạn tạo ra giao diện người dùng. Các tập tin XML của ứng dụng Android nằm trong thư mục tương ứng trong thư mục res của dự án (ví dụ, tập tin layout nằm trong thư mục layout).

Một bài tập nhanh, hãy nhìn vào thực thi mặc định của phương thức onCreateOptionsMenu trong hoạt động chính của Overheard Word — bạn thấy được gì từ những dòng mã?

public boolean onCreateOptionsMenu(Menu menu) {
  getMenuInflater().inflate(R.menu.overheard_word, menu);
  return true;
 }

Nếu bạn đang nghĩ rằng bạn sẽ phải tìm một tập tin XML có tên overheard_word.xml trong thư mục nguồn menu, thì bạn đang trên đường trở thành một chuyên gia Android rồi đấy!

I... Quit! (Tôi... thoát!)

Tiếp theo, hãy chỉnh sửa tập tin mã nguồn XML của Menu để thêm vào một mục quit. Bắt đầu bằng cách tìm tập tin strings.xml trong thư mục res/values. Sau đó tạo một dòng như bên dưới:

<string name="quit_menu">Quit</string>

Dòng này tạo ra từ Quit tham chiếu đến định danh quit_menu (bằng cách này, ta có thể tạo điều kiện để đa ngôn ngữ hóa ứng dụng sau này). Tiếp theo, mở tệp overheard_word.xml trong thư mục menu. Trong tệp đó, ta thay đổi tiêu đề thành @string/quit_menu, như vậy ta đã liên kết từ Quit với mục của Menu.

Bây giờ hãy khởi động trình giả lập và nhấn vào nút Menu. Bạn sẽ thấy một Menu xuất hiện ở dưới cùng của màn hình với một tùy chọn: Quit. Tuy nhiên nếu bạn nhấn chọn nó thì cũng chưa có gì xảy ra cả bởi vì ta vẫn chưa làm gì với nó.

Chúng ta sẽ thêm mã thực thi cho tùy chọn Quit trong một phút. Nhưng trước tiên, hãy xem xét một yếu tốt quan trọng khác của bất kỳ chức năng của ứng dụng, đó là cảm giác nhìn nhận của mình. Bạn có thể thấy rất nhiều giao diện người dùng di động hiện nay (thậm chí cả những ứng dụng Web ngày càng đầu tư vào diện người dùng) sử dụng những biểu tượng để điều hướng. Hãy xem những gì sẽ xảy ra khi chúng ta thay thế các nút có tên chung chung sang một biểu tượng tự do.


Các biểu tượng (icon) trong thiết kế giao diện người dùng

Trước khi tôi bước vào lĩnh vực phát triển di động, tôi cũng đã thiết kế các biểu tượng, nhưng hiếm khi sử dụng chúng trong các ứng dụng thương mại của tôi. Khi các ứng dụng Web trở nên tương tác hơn thì tôi sử dụng biểu tượng nhiều hơn. Tuy nhiên đó cũng vẫn chưa phải lúc cho đến khi tôi bước vào lĩnh vực di động, đó mới thật sự là mối quan tâm của tôi.

Biểu tượng của tôi ở đâu?

Ngày nay thật dễ dàng để tìm các biểu tượng để dùng tự do trong các ứng dụng thương mại và nguồn mở. Bạn cũng có thể trả một chi phí nhỏ để mua các biểu tượng mà bạn cần. Tôi có tạo ra một gói biểu tượng gọi là Glyphish (xem Tài nguyên), chứa hàng trăm biểu tượng với mức giá hợp lý. Glyphish cũng cung cấp một giấy phép miễn phí. Hãy dùng tính năng tìm kiếm để tìm các biểu tượng phù hợp mà bạn muốn trong phần này.

Nếu bạn sử dụng các biểu tượng trong việc thiết kế giao diện người dùng di động cho Android, bạn cần phải nắm thật kỹ về độ phân giải màn hình của thiết bị. Bởi hệ sinh thái Android là vô cùng lớn, ứng dụng của bạn có thể chạy trên hàng loạt các thiết bị, từ thiết bị có màn hình nhỏ với độ phân giải thấp đến những máy tính bảng có độ phân giải cao với màn hình 7-inch. Một biểu tượng hiển thị tốt trên một thiết bị cầm tay có thể bị vỡ trên máy tính bảng.

Thật may mắn là bạn có thể điều khiển hình dạng của các biểu tượng ứng dụng trong các thiết bị khác nhau. Hãy xem trong thư mục res trong ứng dụng Android của bạn. Bạn sẽ thấy một vài thư mục có tên là drawable-something-pdi (trong đó "something" là một loạt các ký tự). Các thư mục này tương ứng với các độ phân giải màn hình thiết bị. Đặt biểu tượng đúng kích cỡ và các tập tin hình ảnh khác trong các thư mục này sẽ đảm bảo rằng các biểu tượng hiển thị chính xác trên các loại thiết bị khác nhau.

Ví dụ, đối với thiết bị độ phân giải siêu cao, Android sẽ tìm các biểu tượng trong thư mục drawable-xxhdpi. Một biểu tượng trong thư mục này phải có độ phân giải là 96 x 96 pixels và ít nhất là 320 dpi. Một biểu tượng trong thư mục drawable-ldpi phải là 36 x 26 pixels và 120 dpi. Bạn cũng có tùy chọn để tạo ra một thư mục drawable mặc định mà Android sẽ sử dụng nếu nó không tìm thấy tập tin có độ phân giải tương ứng.

Để đơn giản, tôi sẽ tạo ra một thư mục drawable trong ứng dụng Overheard Word. Trong đó, tôi sẽ đặt một biểu tượng có kích thước 26 x 26 (a .png) để dùng cho tùy chọn thoát (Quit).

Hình 7. Thêm một biểu tượng vào thư mục drawable
Hình ảnh thư mục drawable trong Eclipse.

Tiếp theo, tôi tham chiếu đến biểu tượng trong Menu tùy chọn của tôi, bằng cách cập nhật các mục menu trong tập tin overheard_word.xml như bên dưới:

android:icon="@drawable/quit_icon"

Nếu bạn đang cùng làm với tôi thì bạn nên cập nhật id của phần tử như bên dưới. Cung cấp cho nó một giá trị chuỗi mô tả:

android:id="@+id/quit_item"

Việc có một mô tả, một chuỗi giá trị dễ hiểu sẽ giúp ích rất nhiều cho chúng ta trong các bước tiếp theo để thực hiện hành động thoát bên trong phương thức onOptionsItemSelected. Chúng ta có thể tham khảo các mục Menu trong trường hợp lựa chọn, thông qua ID của quit_item. Ngay bây giờ, hãy mở trình giả lập của bạn lên và nhấn vào Menu. Tôi nghĩ bạn sẽ thích những gì bạn thấy!

Hình 8. Biểu tượng tuyệt đẹp! (Courtesy của Glyphish)
Hình ảnh biểu tượng Quit mới của Overheard Word trong trình giả lập Android.

Thực hiện các hành vi của Menu

Bây giờ tôi đã có một biểu tượng đẹp đẽ cho nút Quit (và tôi hy vọng bạn cũng có một cái tương tự cho ứng dụng của bạn), tuy nhiên tôi cần phải viết thêm mã để nói cho ứng dụng biết cần phải làm gì khi nút Quit được nhấn.

Việc thực hiên bất kỳ hành vi nào trong Menu tùy chọn đều bắt đầu bằng việc nạp chồng phương thức onOptionsItemSelected. Vì vậy hãy nạp chồng phương thức đó, và cập nhật mã của bạn giống như tôi ở bên dưới (nhưng nhớ chỉnh lại ID của mục Menu phù hợp với ứng dụng của bạn):

Liệt kê 3. Xử lý lựa chọn các mục Menu
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
    case R.id.quit_item:
        this.finish();
        return true;
    default:
        return super.onOptionsItemSelected(item);
    }
}

Lưu ý rằng đây chỉ là một câu switch (chuyển đổi) đơn giản. Nếu id của quit_item được chọn, phương thức finish sẽ được gọi, về cơ bản sẽ thoát ứng dụng.

Hãy chạy thử đoạn mã mới trong trình giả lập của bạn: chạm vào nút Menu, nhấn tùy chọn thoát (X), và xem điều gì xảy ra trong LogCat. Bạn sẽ thấy một vòng đời Activity đầy đủ chạy các giai đoạn: onPause rồi onStop và sau đó là onDestroy.


Action-bars trong Android 3.x

Như tôi đã đề cập, các phiên bản mới hơn của Android (Honeycomb và các bản sau này) tránh sử dụng các tùy chọn Menu trong Action-bar. Các thiết bị mới hơn thậm chí còn không yêu cầu phải có một nút Menu, vì vậy thật đáng để tìm hiểu cách làm việc của chức năng điều hướng trong ứng dụng của bạn (hay các tính năng khác) với một Action-bar.

Sẽ không mất nhiều bước để kiểm tra chắc chắn rằng tính năng điều hướng mà trước đây được viết cho một Menu tùy chọn giờ đây sẽ làm việc với một Action-bar. Bạn đã thực hiện tất cả các phương thức cần thiết; những gì còn lại là thực hiện một số thay đổi mã nguồn XML của bạn.

Trước tiên, bạn cần phải tạo ra một thiết bị giả lập giống với thiết bị thật có sử dụng một Action-bar chứ không phải là một nút Menu. Cách dễ nhất để làm điều đó là tạo ra một thiết bị giả lập máy tính bảng. Mở ứng dụng dòng lệnh của Android SDK Manager bên trong thư mục mà bạn đã cài đặt Android SDK (công cụ dòng lệnh của android được tìm thấy trong thư mục tools). Khi SDK Manager chạy, hãy chọn tùy chọn Manage AVDs... từ Menu Tools. Nó sẽ hiển thị cho bạn một hộp thoại để bạn định nghĩa một giả lập mới hay Android Virtual Device (AVD). Chọn 7.0'' WSVGA (Tablet) (1024 x 600: mdpi), sau đó thiết lập Target cho trình giả lập từ Android 4.2.2 trở lên. Sau khi thiết lập thì bạn sẽ có một trình giả lập không có các nút Menu, như trong Hình 9.

Hình 9. Tạo một trình giả lập cho máy tính bảng
Hình ảnh lựa chọn để giả lập một máy tính bảng.

Tiếp theo, chạy ứng dụng của bạn trên trình giả lập đó. Bạn sẽ thấy một đường thẳng đứng với dấu ba chấm ở bên góc phải. Nhìn đẹp phải không? Theo mặc định, Android vẫn giữ lại các Menu, ngay cả trong phiên bản hiển thị mới hơn. Bằng cách cập nhật mã nguồn XML của ứng dụng bạn có thể nâng cấp xuất hiện Action-bar và hành vi để nó tự nhiên hơn.

Bắt đầu với tập tin AndroidManifest.xml của ứng dụng, nơi bạn sẽ cập nhật Target của SDK:

<uses-sdk android:minSdkVersion="11" android:targetSdkVersion="17" />

Kế tiếp, vào Properties (thuộc tính) của dự án trong Eclipse và cập nhật Project Build Target lên bất kỳ phiên bản nào cao hơn Android 4.2.2. Nhấn OK và để dự án của bạn tự build (xây dựng) lại. Sau đó, tìm tập tin XML của Menu trong thư mục menu. Cập nhật nó như bên dưới mà vẫn giữ lại định nghĩa item cho Quit.

android:showAsAction="always"

Cuối cùng, nếu dự án của bạn không có hai thư mục con trong thư mục res tên là values-v11values-v14, thì hãy tạo các thư mục đó. Sau đó, trong thư mục values-v11, thêm vào tệp XML như sau:

<resources>
 <style name="AppBaseTheme" parent="android:Theme.Holo.Light"></style>
</resources>

Trong thư mục values-v14, thêm vào tệp:

<resources>
 <style name="AppBaseTheme" parent="android:Theme.Holo.Light.DarkActionBar"></style>
</resources>

Bây giờ hãy khởi động lại trình giả lập và bạn sẽ thấy biểu tượng của bạn nằm ở góc phải bên trên:

Hình 10. Một Action-bar với các biểu tượng
Hình ảnh một biểu tượng mới, robot màu xanh.

Bây giờ hãy trở về tập tin Menu trong thư mục menu nơi mà mục quit item được định nghĩa và thay đổi showAsAction thành never. Chạy lại ứng dụng và bạn sẽ thấy dấu ba chấm ở góc phải.

Đừng quên thiết lập lại nhé

Lưu ý rằng nếu bạn muốn giữ thiết bị của bạn chạy Gingerbread, bạn cần phải tái thiết lập dự án của bạn và những thay đổi trong tệp XML. Những thay đổi này không tương thích.


Thú vị hơn với các biểu tượng

Hơn nữa, khi bạn thêm một Menu tùy chọn vào ứng dụng chạy trên Gingerbread, bạn sẽ thấy nó chuyển đổi khá tốt sang các thiết bị mới có Action-bar, và học cách làm thế nào để nâng cấp tính năng đó, nếu bạn chọn, chỉ cần một vài cập nhật XML trong ứng dụng của bạn.

Bây giờ chúng ta hãy điểm lại những gì bạn đã học về các biểu tượng. Bạn đã hoàn thành một việc nặng nhọc là thêm một biểu tượng vào Menu điều hướng trong ứng dụng, vì thế sẽ không vất vả để cập nhật biểu tượng chính của nó. Biểu tượng này đại diện cho ứng dụng của bạn, vì vậy biết cách để cập nhật và tùy chỉnh nó là rất quan trọng.

Tôi sẽ cập nhật biểu tượng của Overheard Word, và bạn có thể cùng làm với ứng dụng của bạn. Một lần nữa, hãy tìm nhanh trong các trang web có chứa biểu tượng. Trong số đó, tôi có tìm thấy một gói biểu tượng thú vị, và một vài biểu tượng cụ thể phù hợp với sở thích của tôi:

Hình 11. Một biểu tượng mới tiện lợi
Biểu tượng chính mới của Overheard Word hiển thị bảng và bút viết.

Hãy nhớ lại rằng các biểu tượng hiển thị khác nhau trên các thiết bị khác nhau. Từ khi tôi chắc rằng người dùng có được ấn tượng tốt ban đầu về Overheard Word, thì thật tốt khi lấy được độ phân giải của biểu tượng đúng với thiết bị đích. Thật may mắn là tôi biết có một trang web làm được điều đó.

Đầu tư vào các biểu tượng

Tôi hoàn toàn có thể sử dụng các biểu tượng miễn phí để minh họa, tuy nhiên tôi nhận ra rằng nếu muốn phát triển ứng dụng chuyên nghiệp thì cần phải đầu tư vào các biểu tượng trả phí. Một biểu tượng (hay gói biểu tượng) thể hiện thương hiệu của bạn, bởi vì bạn muốn nó là độc nhất. Nếu các biểu tượng đó phổ biến hay nghiệp dư thì sẽ khiến người khác đánh giá về bạn?

Android Asset Studio (xem Tài nguyên) là một dự án Google Code có nhiều tiện ích hữu ích cho các nhà phát triển Android. Một biểu tượng mà tôi dùng nhiều nhất là biểu tượng Launcher. Tất cả những gì tôi làm là nhấn vào đường dẫn các biểu tượng Launcher và cập nhật biểu tượng của tôi. Tiện ích tạo các tệp biểu tượng với các kích thước chính xác cho các cấu hình thiết bị khác nhau, sau đó tôi tải về trong một tệp zip. Tệp này có bốn thư mục, mỗi thư mục chứa một phiên bản kích thước và độ phân giải của tập tin mà tôi đã tải lên.

Hình 12. Các biểu tượng Launcher với kích thước chính xác cho Android
Các biểu tượng Launcher cung cấp các biểu tượng có kích thước chính xác cho 4 thiết bị Android khác nhau.

Tiếp theo, tôi sao chép các tập tin ic_launcher.png từ mỗi thư mục vào các thư mục con tương ứng trong thư mục res của ứng dụng của tôi. Lưu ý rằng trong quá trình này, tôi dường như thay thế tệp biểu tượng gốc mà Eclipse đã sinh ra.

Cuối cùng, tôi khởi động lại ứng dụng và đợi cho đến khi nó hiển thị trong trình giả lập. Tôi nhấn vào nút Home và kiểm tra kết quả: một biểu tượng tiện lợi có ý nghĩa (ít nhất là đối với tôi) rằng OverHeard Word là một ứng dụng thú vị nhất trên bất kỳ thiết bị nào!

Hình 13. Giờ đây nó đã có biểu tượng!
Biểu tượng chính mới của Overheard Word trong trình đơn ứng dụng của thiết bị.

Kết luận

Trong bài này, bạn có cái nhìn ở mức cao hơn về vòng đời của một Activity và học được cách làm việc với nó để cải thiện mức tài nguyên của thiết bị. Bạn cũng học được cách xác định và thực hiện các cấu trúc điều hướng sử dụng các Menu và Action-bar, và làm thế nào để thay thế các nút bấm với các biểu tượng.

Tất cả những gì bạn học được trong bài viết này là tối quan trọng để xây dựng một ứng dụng Android. Phát triển ứng dụng di động trên nền Android là một lựa chọn dễ dàng, tất nhiên cũng có rất nhiều điều thú vị, tôi cũng hy vọng đây là một nền tảng khác mà bạn có thể dùng để phát triển Java. Với hàng trăm ngàn ứng dụng có sẵn trong Google Play và các kho ứng dụng khác, thì các ứng dụng được xếp hạng đầu tiên thường có chất lượng, có thiết kế cẩn thận và viết mã tối ưu. Cũng còn nhiều điều phải học lắm!

Tài nguyên

Học tập

Lấy sản phẩm và công nghệ

  • Kho Github Overheard Word chứa mã nguồn trong bài này.
  • Tìm hiểu thêm về Gesticulate: Giúp nhận dạng cử chỉ trong Android trở nên đơn giản hơn.
  • Dùng thử các biểu tượng Launcher của Android được dùng trong bài này.
  • Các biểu tượng cho ứng dụng di động của bạn: Truy cập trang ArtDesignerGlyphish để mua giấy phép sử dụng biểu tượng cho ứng dụng di động và web, hay tìm hàng ngàn biểu tượng miễn phí với Icon Finder.
  • Tải về Android: Android SDK cung cấp các thư viện API và các công cụ phát triển mà bạn cần để build, kiểm thử và gỡ lỗi ứng dụng Android.
  • Tải về gói phát triển của IBM (IBM developer kits): Cập nhật hệ thống của bạn bằng các công nghệ và công cụ mới nhất tại đây.

Thảo luận

  • Tham gia vào cộng đồng developerWorks. Kết nối với các thành viên developerWorks và khám phá các blog, diễn đàn, nhóm và thư viện wiki.

Bình luận

developerWorks: Đăng nhập

Các trường được đánh dấu hoa thị là bắt buộc (*).


Bạn cần một ID của IBM?
Bạn quên định danh?


Bạn quên mật khẩu?
Đổi mật khẩu

Bằng việc nhấn Gửi, bạn đã đồng ý với các điều khoản sử dụng developerWorks Điều khoản sử dụng.

 


Ở lần bạn đăng nhập đầu tiên vào trang developerWorks, một hồ sơ cá nhân của bạn được tạo ra. Thông tin trong bản hồ sơ này (tên bạn, nước/vùng lãnh thổ, và tên cơ quan) sẽ được trưng ra cho mọi người và sẽ đi cùng các nội dung mà bạn đăng, trừ khi bạn chọn việc ẩn tên cơ quan của bạn. Bạn có thể cập nhật tài khoản trên trang IBM bất cứ khi nào.

Thông tin gửi đi được đảm bảo an toàn.

Chọn tên hiển thị của bạn



Lần đầu tiên bạn đăng nhập vào trang developerWorks, một bản trích ngang được tạo ra cho bạn, bạn cần phải chọn một tên để hiển thị. Tên hiển thị của bạn sẽ đi kèm theo các nội dung mà bạn đăng tải trên developerWorks.

Tên hiển thị cần có từ 3 đến 30 ký tự. Tên xuất hiện của bạn phải là duy nhất trên trang Cộng đồng developerWorks và vì lí do an ninh nó không phải là địa chỉ email của bạn.

Các trường được đánh dấu hoa thị là bắt buộc (*).

(Tên hiển thị cần có từ 3 đến 30 ký tự)

Bằng việc nhấn Gửi, bạn đã đồng ý với các điều khoản sử dụng developerWorks Điều khoản sử dụng.

 


Thông tin gửi đi được đảm bảo an toàn.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=70
Zone=Công nghệ Java, Nguồn mở
ArticleID=946364
ArticleTitle=Di động cho mọi người: Các hoạt động (Activities) và biểu tượng (icons) trong vòng đời ứng dụng Android của bạn
publish-date=09252013