Chủ Nhật, 31 tháng 1, 2010

Acer Liquid đã có thêm màu đen

Ngay khi còn là hình mẫu thử nghiệm hay cả khi bán ra tại Anh Quốc thì chiếc smartphone chạy Android mạnh mẽ nhất hiện nay của Acer là Liquid vẫn trung thành với màu vỏ trắng tinh, trông rất bắt mắt. Tuy nhiên, từ cuối tuần qua, đã xuất hiện thêm một phiên bản màu đen, cũng cá tính không kém và cũng chỉ được bán ra tại Anh.

Phiên bản màu đen này được 2 nhà bán lẻ Clove và Handtec công bố (phiên bản đầu tiên do Clove và Expansys phân phối), giá bán ra không chênh lệch nhau nhiều. Clove bán ra với giá £333.70 (khoảng 545 USD) trong khi Handtec bán ra với giá £328.99 (khoảng 538 USD), đã bao gồm cả thuế VAT và không có một thay đổi nào về cấu hình.

Nguồn: Leakandroid
Nguồn TinhTe.Com

Android đời tiếp theo sẽ mang tên Froyo, món Ya-ua đá tuyết


Trong một buổi họp báo với trang tin Engadget, vị khách mời Erick Tseng - trưởng nhóm dự án Android - đã tiết lộ về tên mã của phiên bản HĐH cho điện thoại mà họ đang phát triển. Theo đó, sau bản 2.1 mang tên Eclair, Android đời tiếp theo sẽ được Google gọi là Froyo.

Tên mã của các phiên bản Android trước đây đều có liên quan đến các món ăn: Cupcakes (bánh nướng), Donuts (bánh rán), Eclairs (bánh xốp kem), và chúng được xếp theo Alphabet, vì vậy Froyo cũng sẽ tuân theo chuỗi thứ tự này. Theo Tseng, Froyo là viết tắt của hai chữ "Frozen Yogurt" (ya-ua đá tuyết), có vẻ như nhóm lập trình Android rất có tâm hồn ăn uống. Tuy vậy vị đại diện Google này vẫn chưa tiết lộ rằng Froyo sẽ là Android mấy, ví dụ 2.2, hay 3.0

Nguồn TinhTe.Com

Phẫu thuật Dell Mini 5: Snapdragon 1Ghz,

Được Dell chính thức giới thiệu tại CES 2010 vừa qua nhưng chiếc Dell Mini 5 được giới thiệu trong bài này là chiếc đã từng xuất hiện trên Tinhte.com cách đây mấy tháng. Với màn hình 5", Dell Mini 5 khiến người ta bối rối vì không biết gọi nó là một chiếc điện thoại hay là một chiếc máy tính bảng dạng nhỏ hay là một chiếc MID (Mobile Internet Device). Có điều là chiếc Dell Mini 5 này vẫn có đầy đủ chức năng của một chiếc điện thoại bình thường, bạn có thể gọi đt, nhắn tin, vào 3G... Theo như những gì chúng tôi thấy bên trong chiếc Dell Mini 5 này thì nó được trang bị vi xử lý SnapDragon 1Ghz, 2 khe cắm thẻ MicroSD, pin 1530mAh...




Hình ảnh:(nhấn vào hình để xem hình to hơn)





Nguồn TinhTe.Com

Motorola sẽ có thêm 20 đến 30 mẫu di động Android trong năm nay

Trong buổi phỏng vấn với CNET Asia vào thứ tư qua, chủ tịch Motorola Châu Á Thái Bình Dương - ngài Spiro Nikolakopoulos đã cho biết: con số sản phẩm di động chạy trên Android mà Motorola dự kiến phát triển trong năm nay sẽ vào khoảng 20 đến 30 chiếc song song với việc phát triển đội ngũ chuyên viên và các chuyên mục hỗ trợ riêng cho Android. Dường như Motorola đã không quá lo ngại lắm đến việc Google tham gia vào thị trường di động chạy Android cũng như muốn khẳng định thêm hướng phát triển mảng smartphone theo Android.

Hiện đội ngũ chuyên viên phát triển các vấn đề liên quan đến Android của Motorla đang tập trung chủ yếu tại 3 quốc gia là Trung Quốc, Hoa Kỳ và Hàn Quốc. Tuy quy mô các nhóm đó hoàn toàn được giữ kín nhưng theo ngài Spiro cho biết thêm: hướng phát triển trong tương lai gần của họ sẽ là tập trung chủ yếu vào sản phẩm phục vụ cho thị trường Trung Quốc, nơi họ đã tạo lập được chỗ đứng từ lâu và một vài khu vực tiềm năng khác.

Nguồn: Engadget
Nguồn TinhTe.Com

Rỏ rỉ thông tin về chiếc điện thoại Gigabyte Android giá rẻ

Chiếc điện thoại chạy hệ điều hành Android rẻ nhất trên thị trường hiện nay là HTC Tattoo có giá 300 USD. Nhưng sắp tới, chiếc điện thoại Android đầu tiên của Gigabyte thuộc dòng GSmart sẽ còn có giá rẻ hơn nữa với cấu hình gần như tương đương nhau: CPU 528 MHz, 256 MB RAM/512 MB ROM, màn hình cảm ứng QVGA 2.8 inch, Wi-Fi, GPS, Bluetooth, thẻ nhớ microSD và lỗ cắm 3.5mm.



Tuy nhiên, vẫn có điểm khác nhau giữa GSmart và Tattoo. GSmart chỉ hoạt động trên hai băng tần GSM/EDGE trong khi Tattoo hỗ trợ cả GSM/EDGE và 3G với kết nối HSPDA 7.2 Mbps. Camera của GSmart có độ phân giải 2 MP auto-focus (của Tattoo là 3 MP auto-focus). Tuy cả hai đều chạy trên nền Android v1.6 nhưng Tattoo có giao diện Sense UI còn GSmart thì không.

Chiếc Android GSmart được mong đợi sẽ được bán vào tháng 2 năm nay tại Nga và giá sẽ thấp hơn mức 300 USD.

Cấu hình chi tiết của Android GSmart:
  • Sử dụng kết nối GSM/GPRS/EDGE
  • CPU Qualcomm ESM7225 528 MHz CPU
  • Màn hình cảm ứng QVGA 2.8 inch
  • Có Trackball
  • Tính năng cảm ứng chuyển động G-sensor (accelerometer)
  • Wi-Fi, GPS, Bluetooth 2.0
  • Lỗ cắm 3.5 mm
  • Camera 2 MP auto-focus
  • 256 MB RAM, 512 MB ROM
  • Thẻ nhớ MicroSD
  • Kích thước: 103 x 54 x 13.4 mm
  • Pin 1,500 mAh
Nguồn: unwiredview
Nguồn TinhTe.Com

[Video] Nokia N900 dual boot Maemo và Android

Chiếc Nokia N900 dùng hệ điều hành Maemo đã dành được nhiều sự quan tâm của giới công nghệ Việt Nam và cả trên thế giới. Maemo đã đem lại chiếc N900 nhiều nét mới, cả về giao diện lẫn cách dùng. Nếu có thể cài thêm Android, quả thật chiếc điện thoại này sẽ trở thành một chiếc laptop thu nhỏ với hai hệ điều hành song song. Và điều đó là hoàn toàn có thể với những người chuyên về kĩ thuật điện thoại trong đoạn video sau.




Nguồn TinhTe.Com

Sự cố Android và giải pháp của Trung Quốc

Theo IDG News Service, hôm Thứ Tư (27/01/2010) giới chức trách Trung Quốc cho biết hệ điều hành Android của Google sẽ không bị hạn chế nếu được điều chỉnh phù hợp với văn hóa người Trung Quốc. Thông tin này được đưa ra sau khi Google dọa rút khỏi thị trường Trung Quốc.

Tuần trước, Google đã cho ngừng phát hành 2 mẫu điện thoại Android tại Trung Quốc. Điều này cho thấy tác động của chính phủ Trung Hoa đến công việc kinh doanh của Google. Phát ngôn viên bộ công nghiệp và công nghệ thông tin Trung Quốc Zhu Hongren nói: "Thị trường viễn thông Trung Quốc đang mở cửa và Trung Quốc sẽ không giới hạn sử dụng đối với bất kì hệ điều hành nào nếu chúng được điều chỉnh phù hợp với văn hóa Trung Quốc."

Lần đầu tiên vấn đề văn hóa địa phương được chú ý tới kể từ khi Google dự định ngừng hoạt động công cụ tìm kiếm Google.cn. Điều này cũng đồng nghĩa Google sẽ đóng cửa văn phòng tại Trung Quốc. Giải thích cho quyết định này, Google đã trích dẫn các quy tắc kiểm duyệt quá cứng rắn và những cuộc tấn công công nghệ gần đây từ Trung Quốc. Vẫn chưa có thông tin chính xác về dịch vụ nào của Google sẽ bị cấm, công cụ tìm kiếm Google hay bản đồ số Google Map. Nếu dịch vụ của Google bị khóa sẽ có rất nhiều điện thoại Android bị ảnh hưởng.

Hiện tại điện thoại sử dụng hệ điều hành Google Android đã có mặt tại Trung Quốc. Nhà cung cấp viễn thông China Mobile đã đặt hàng Lenovo và Dell cung cấp điện thoại Android với thương hiệu Lephone và Ophone.

Lenovo, tập đoàn máy tính Trung Quốc vừa mới mua lại mảng điện thoại từ một nhóm các nhà đầu tư, vẫn lên kế hoạch sản xuất và bán ra các mẫu điện thoại sử dụng hệ điều hành Android vào tháng 5. Theo người phát ngôn của Lenovo, công ty đang tiếp tục phát triển các mẫu điện thoại Android khác và vẫn chưa thấy ảnh hưởng nào từ sự cố của Google. Tuy nhiên, đại diện China Mobile lại từ chối bình luận khi được hỏi về vấn đề này. Ngoài ra, các điện thoại Android của Samsung và Motorola được cung cấp qua nhà mạng China Unicom cũng bị hoãn ngày phát hành. Motorola cho biết họ dự định sẽ thay thế công cụ tìm kiếm của Google bằng Baidu.com nhằm đảm bảo hoạt động cho các thiết bị Android.

Nguồn: Computerworld
Nguồn TinhTe.Com

Trên tay Motorola Cliq

Ấn tượng đầu tiên khi được cầm Motorola Cliq trên tay đó là máy thật chắc chắn, thiết kế đẹp, không giống như những hình ảnh đã được cung cấp trên mạng. Nếu ai thích G1 thì đây quả là một nâng cấp xứng đáng. Với tốc độ 528Mhz, iq không quá chậm, thao tác dễ dàng.


Thông số của Motorola Cliq:
  • Bộ xử lý: 528MHz MSM7201A
  • Màn hình cảm ứng 3.1″ HVGA, độ phân giải 320×480 pixels
  • Kích thước: 114mm x 58mm x 15.6mm, nặng 163 grams
  • Hệ điều hành: Android 1.5 (Cupcake), cài sẵn MotoBlur
    • MySpace, Photobucket, Picasa, Facebook for photos
    • Facebook, MySpace and Twitter Direct Messaging
    • Caller’s name, number, status and profile pic as Caller ID
  • Bàn phím QWERTY trượt ngang
  • Camera 5.0 megapixel với tính năng lấy nét tự động
  • Pin 1420 mAh lithium polymer
  • Kết nối: 3G, Bluetooth, WiFi, MicroUSB, GPS
  • Tai nghe: 3.5mm
  • Màu: có 2 màu chính là Titanium và Winter White
Chiếc Motorola Cliq trong bài viết này là phiên bản Titanium, máy cầm chắc tay. Có thể nói Motorola đã rất chăm chút cho Cliq, các chi tiết được làm sắc sảo, đặc biệt là các phím bấm bên hông máy. Cơ trượt của máy khá nhẹ, nhưng chắc chắn. Bàn phím 4 dòng của Cliq đủ to để bạn có thể thoải mái khi sử dụng, tuy nhiên các phím bấm có cảm giác hơi yếu, không được tốt như trên Droid.

Việc Motorola chuyển phím tìm kiếm xuống bàn phím trượt cũng gây một chút khó chịu khi sử dụng. Thay vì bạn có thể thao tác nhanh thì giờ bạn phải trượt bàn phím lên rồi mới tiến hành tìm kiếm được.

Màn hình của Cliq có lẽ là điểm kém nhất của chiếc máy này, hoặc cũng có thể do mình đã quen với những màn hình lớn hơn vì thế có cảm giác hơi tù túng khi thao tác trên màn hình của Cliq. Việc Motorola để quá nhiều widgets trên màn hình cũng làm giảm tốc độ của máy. Cliq và Magic có độ phân giải màn hình giống nhau, nhưng nếu so về khả năng hiển thị thì Magic tốt hơn.

Motorola Cliq có giắc cắm tai nghe 3.5mm phía trên của máy tiện lợi cho việc giải trí. Loa ngoài của máy cũng khá to và rõ, tuy nhiên không được xuất sắc. Motorola không có thay đổi nhiều về phần mềm giải trí được cài sẵn, và với hạn chế của chip xử lý, máy không thể chạy được một số file phim được convert sẵn cho ip vẫn được chia sẻ nhiều trên Tinhte. Nếu bạn cài thêm phần mềm NemoPlayer thì mọi việc cũng được giải quyết.

Một số hình ảnh khác của Motorola Cliq:






















Nguồn TinhTe.Com

[Video] 50 game cho android trong một clip


Nền tảng Android hứa hẹn nhiều cải tiến mới trong kỉ nguyên của smartphone. Một trong số cải tiến đó là trò chơi điện tử trên di động. Video dưới đây được quay tại hội nghị những nhà phát triển game 2010 (Game Developers Conference 2010) với 50 game cho Android sẽ được chơi thử trên Motorola Droid. Cũng trong dịp này, Google tuyên bố sẽ cung cấp miễn phí Nexus Ones và Verizon Droids để thu hút nhiều người tham dự với mong muốn nền tảng game cho Android sẽ được phát triển. Chắc hẳn đây sẽ là động thái giúp thúc đẩy hơn nữa tính năng giải trí của Android.

Nguồn TinhTe.Com

Motorola đang phát triển di động cho Google


Hình minh họa cho chiếc Motorola Shadow được nhắc tới trong nội dung điện đàm.
Trong nội dung cuộc điện đàm giữa BTV trang tin Electronista cùng CEO Motorola, Sanjay Jha vào giữa tuần qua thì thông tin khá mơ hồ trước đây về chiếc Motorola Shadow đã phần nào được làm rõ. Theo đó, chính vị chủ tịch này đã cho biết rằng: nó là một trong những chiếc di động thuộc kế hoạch 20-30 smartphone Android của họ trong năm nay và đó cũng là sản phẩm họ hướng đến người dùng thông qua thương hiệu Google, giống với Nexus One do HTC gia công vừa rồi.

Ngài CEO cũng không cho biết thêm bất kỳ thông tin nào về cấu hình, cấu tạo cũng như thời gian ra mắt. Nhưng theo góc nhìn của vị CEO này bày tỏ thông qua nội dung cuộc điện đàm thì sản phẩm Nexus One chỉ là bước thử nghiệm đầu tiên của Google và họ còn muốn hợp tác với một đối tác khác, có thể tạo ra đột phá hoặc chí ít cũng nâng cao khả năng cạnh tranh cùng các smartphone đến từ RIM, Palm hay Apple.

Trong năm vừa qua, Motorola đã bán ra 12 triệu máy di động trên toàn cầu, trong đó chỉ có 2 triệu máy là smartphone. Trong đó, hai cái tên nổi bật nhất hiện nay chính là Droid (Milestone) và Cliq.


Nguồn: Electronista
Nguồn TinhTe.Com

Thứ Bảy, 23 tháng 1, 2010

Kết nối emulator với máy tính - UDPConnection:

Chương trình UDPConnection:

package org.anddev.android.udpconnection;

import android.app.Activity;
import android.os.Bundle;

public class UDPConnection extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
setContentView(R.layout.main);

/* kich hoat Server */
new Thread(new Server()).start();
try {
Thread.sleep(500);
} catch (InterruptedException e) { }

// Kich hoat Client
new Thread(new Client()).start();
}
}

Chương trình Server: cái này chạy trên emulator

package org.anddev.android.udpconnection;

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

import android.util.Log;

public class Server implements Runnable {

public static final String SERVERIP = "127.0.0.1"; // 'Within' the emulator!
public static final int SERVERPORT = 4444;

public void run() {
try {
/* lay ten Server */
InetAddress serverAddr = InetAddress.getByName(SERVERIP);

Log.d("UDP", "Server: Connecting...");
/* tao moi UDP-Socket */
DatagramSocket socket = new DatagramSocket(SERVERPORT, serverAddr);

byte[] buf = new byte[17];
/* chuan bi mot UDP-Packet de chua du lieu nhan duoc */
DatagramPacket packet = new DatagramPacket(buf, buf.length);
Log.d("UDP", "Server: Receiving...");

/* nhan UDP-Packet */
socket.receive(packet);
Log.d("UDP", "Server: Received: '" + new String(packet.getData()) + "'");
Log.d("UDP", "Server: Done.");
} catch (Exception e) {
Log.e("UDP", "Server: Error", e);
}
}
}

Chương trình Client:

package org.anddev.android.udpconnection;

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

import android.util.Log;

public class Client implements Runnable {

public void run() {
try {
// lay ten Server
InetAddress serverAddr = InetAddress.getByName(Server.SERVERIP);

Log.d("UDP", "Client: Connecting...");
/* tao moi UDP-Socket */
DatagramSocket socket = new DatagramSocket();

/* chuan bi du lieu de gui */
byte[] buf = ("Hello from Client").getBytes();

/* tao UDP-packet voi du lieu va dia chi den */
DatagramPacket packet = new DatagramPacket(buf, buf.length, serverAddr, Server.SERVERPORT);
Log.d("UDP", "Client: Sending: '" + new String(buf) + "'");

/* gui goi tin */
socket.send(packet);
Log.d("UDP", "Client: Sent.");
Log.d("UDP", "Client: Done.");
} catch (Exception e) {
Log.e("UDP", "Client: Error", e);
}
}
}
Kết quả:

Beginning Smartphone Web Development - Ebooks mới nhất về Android kèm tut (22/1/2010)

Product Description
Today’s Web 2.0 applications (think Facebook and Twitter) go far beyond the confines of the desktop and are widely used on mobile devices. The mobile Web has become incredibly popular given the success of the iPhone and BlackBerry, the importance of Windows Mobile, and the emergence of Palm Pre (and its webOS platform). At Apress, we are fortunate to have Gail Frederick of the well-known training site Learn the Mobile Web offer her expert advice in Beginning Smartphone Web Development. In this book, Gail teaches the web standards and fundamentals specific to smartphones and other feature-driven mobile phones and devices.

* Shows you how to build interactive mobile web sites using web technologies optimized for browsers in smartphones
* Details markup fundamentals, design principles, content adaptation, usability, and interoperability
* Explores cross-platform standards and best practices for the mobile Web authored by the W3C, dotMobi, and similar organizations
* Dives deeps into the feature sets of the most popular mobile browsers, including WebKit, Chrome, Palm Pre webOS, Pocket IE, Opera Mobile, and Skyfire

By the end of this book, you’ll have the training, tools, and techniques for creating robust mobile web experiences on any of these platforms for your favorite smartphone or other mobile device.
You’ll learn how to:

* Build interactive mobile web pages that comply with industry standards and best practices.
* Develop web sites using the markup languages of the mobile Web: XHTML-MP, Wireless CSS, and WML.
* Use Mobile JavaScript and Ajax for client-side web interactivity.
* Adapt the syntax and design of mobile web pages to target smartphone models.
* Enhance mobile web pages to target advanced features of smartphone browsers.
* Validate and compress mobile markup to optimize for network transmission and browser performance.
* Simulate smartphone browsers using emulators and development tools.

Who is this book for?
Mobile application developers and their managers need to learn mobile web technologies because it’s in their economic interest. Time-to-market and opportunity costs are significantly lower for web-based mobile applications than for native ones.
Desktop web developers at software companies and IT departments of non-technology businesses need to learn mobile web technologies to meet the demands of managers who will soon be asking them to “mobilize this web site.” These developers will want to do the minimum work possible to maximize the compatibility of their mobile web sites. The standards-based approach advocated in this book will allow them to build gracefully adaptive and portable mobile web experiences that perform well across mobile browser platforms.
About the Author
Gail Rahn Frederick is an expert web developer and software architect in the mobile industry. Her products target 500+ device models and have been deployed at 10+ mobile operators in North America and Europe. She advocates standards-based mobile development techniques as a blogger and conference presenter.
Gail teaches standards-based mobile web development in Portland, OR. Her students learn mobile markup languages, mobile design and usability, content adaptation, best practices, advanced web development for smartphones and defensive programming for the mobile ecosystem.
Rajesh Lal is an author, designer, developer, and technology evangelist working at Nokia, Mountain View. Rajesh has been involved in Mobile UI/UX design for past five years and has hands-on experience with a variety of Mobile devices, namely Sony Mylo, Window’s Mobile, Apple’s iPhone, Nokia S60, and Maemo devices. He has authored multiple books on gadgets and widgets and enjoys taking an objective and pragmatic approach to design. His tutorial on how to design an effective user interface for small devices can be found at http://smallinterface.com.
Product Details

* Paperback: 350 pages
* Publisher: Apress; 1 edition (January 22, 2010)
* Language: English
* ISBN-10: 143022620X
* ISBN-13: 978-1430226208


link : http://www.mediafire.com/?zkz4to2jzym

source : http://www.wowebook.com/e-book/web-d...velopment.html

Android Collection Ebooks-Mediafire Links - Tổng hợp sách cho android

Lên mấy forum của nước ngoài sưu tầm được một số sách cũng kha khá gọi là quà ra mắt để các bác đỡ mất công tìm kiếm. Những cuốn sách này hầu hết đều viết cho firmware 1.5, 1.6. Ở phiên bản 2.x hiện giờ có nhiều thứ mới và phức tạp hơn một chút nhưng về cơ bản thì vẫn giống nhau thôi nên chắc chắn mấy cuốn này sẽ rất có ích cho các bác tham khảo và nghiên cứu.


Apress - Android Essentials (2008)
http://www.mediafire.com/?czynyzgjkjz


Apress - Beginning Android (2009)
http://www.mediafire.com/?o1uzkgytnmz


Apress - Pro Android (2009)
http://www.mediafire.com/?muyzitwnmmj


Manning - Unlocking Android (2009)
http://www.mediafire.com/?mkyan21zj2u


McGraw-Hill - Android_ A Programmer™s Guide (2008)
http://www.mediafire.com/?3giiwxrnolr


O_Reilly - Android Application Development (2009)
http://www.mediafire.com/?nnomontiznn


Wrox - Professional Android Application Development (2008)
http://www.mediafire.com/?t5nimyj0yml

Em thích nhất là cuốn này. Nó rất hay cho những người mới bắt đầu với android.

Pragmatic - Hello Android (2008)
http://www.mediafire.com/?mczdowyyian
Links:
1.Apress.Pro.Android.Games.Dec.2009.rar :
http://www.mediafire.com/file/yjttmx...s.Dec.2009.rar
2.Beginning_Android.rar :
http://www.mediafire.com/file/m25mdz...ng_Android.rar
3.CommonsWare.LLC.The.Busy.Coders.Guide.to.Android .Development.Feb.2009.rar :
http://www.mediafire.com/file/akhkzr...t.Feb.2009.rar
4.Manning.Unlocking.Android.Apr.2009.rar :
http://www.mediafire.com/file/jmtmir...d.Apr.2009.rar
5.Oreilly.Android.Application.Development.May.2009 .rar :
http://www.mediafire.com/file/vdzjni...t.May.2009.rar
6.Pragmatic.Hello.Android.2nd.Edition.Nov.2009.rar :
http://www.mediafire.com/file/e2jz4m...n.Nov.2009.rar
7.Pro_Android.rar :
http://www.mediafire.com/file/yhmnze...ro_Android.rar
8.QUE.Web.Geeks.Guide.to.the.Android.Enabled.Phone .Sep.2009.rar :
http://www.mediafire.com/file/nkumgc...e.Sep.2009.rar

goodluck!

Làm việc với XML trên Android

Một bài chất lượng từ IBM tiếng Việt:

Xây dựng các ứng dụng Java cho các thiết bị di động
Michael Galpin, Kiến trúc sư phần mềm, Ludi Labs
Tóm tắt: Android là một hệ điều hành nguồn mở, hiện đại và là SDK cho các thiết bị di động. Với hệ điều hành này, bạn có thể tạo ra các ứng dụng di động rất mạnh. Điều này thậm chí còn trở nên hấp dẫn hơn nữa khi các ứng dụng của bạn có thể truy cập các dịch vụ Web, có nghĩa là bạn cần sử dụng ngôn ngữ của Web là: XML. Trong bài viết này, bạn sẽ thấy nhiều lựa chọn khác nhau để làm việc với XML trên Android và cách sử dụng chúng để xây dựng các ứng dụng Android của chính bạn.
Ngày: 08 01 2010
Mức độ: Trung bình
Cũng sẵn có bằng tiếng Anh
PDF: A4 và Thư (234KB | 12 pages)Tải Adobe® Reader®
Hoạt động: 628 các khung nhin
Góp ý kiến: 0 (Thêm các bình luận)
1 star2 stars3 stars4 stars5 stars Điểm trung bình (dựa trên 0 ý kiến)


Bắt đầu
Trong bài viết này, bạn học cách xây dựng các ứng dụng Android có thể làm việc với XML từ Internet. Các ứng dụng Android được viết bằng ngôn ngữ lập trình Java™, do vậy mà kinh nghiệm làm việc với công nghệ Java là điều cần phải có. Để phát triển cho Android, bạn sẽ cần đến Android SDK. Toàn bộ mã trình được trình bày trong bài viết này sẽ làm việc với bất kỳ phiên bản nào của Android SDK, nhưng phiên bản SDK 1.5_pre đã được sử dụng để phát triển mã trình. Bạn có thể phát triển các ứng dụng Android chỉ với SDK và một trình biên tập văn bản là đủ, nhưng sẽ dễ dàng hơn nhiều nếu sử dụng Android Developer Tools (ADT), là một trình bổ sung Eclipse. Đối với bài viết này, phiên bản 0.9 của ADT đã được dùng với Eclipse 3.4.2, một phiên bản Java. Xem Tài nguyên để lấy các liên kết dẫn đến tất cả các cộng cụ này.

XML trên Android
Nền tảng Android là một nền tảng phát triển di động mã nguồn mở. Nó giúp bạn truy cập vào tất cả các khía cạnh của thiết bị di động mà nó chạy trên đó, từ các đồ họa cấp thấp, đến phần cứng như là thiết bị camera trên điện thoại. Với rất nhiều thứ có thể sử dụng Android, có thể bạn sẽ tự hỏi tại sao bạn cần phiền đến XML. Đó không phải vì làm việc với XML rất thú vị; mà là nó đang làm việc với những thứ mà nó kích hoạt. XML thường được dùng như là một định dạng dữ liệu trên Internet. Nếu bạn muốn truy cập dữ liệu từ Internet, các khả năng có thể là dữ liệu sẽ ở dạng XML. Nếu bạn muốn gửi dữ liệu đến một dịch vụ Web, có thể bạn cũng cần gửi cả dữ liệu XML. Nói ngắn gọn là nếu ứng dụng Android của bạn thúc đẩy Internet, thì có thể bạn sẽ cần phải làm việc với XML. Thật may mắn là bạn có rất nhiều lựa chọn có sẵn để làm việc với XML trên Android.

Các trình phân tích XML

Các từ viết tắt thông dụng

  • API: Application programming interface (Giao diện lập trình ứng dụng)
  • RSS: Really Simple Syndication (Giao thức tập hợp thông tin đơn giản)
  • SDK: Software Developers Kit (Bộ dụng cụ cho nhà phát triển phầm mềm)
  • UI: User interface (Giao diện người dùng)
  • URL: Universal Resource Locator (Địa chỉ tài nguyên)
  • XML: Extensible Markup Language (Ngôn ngữ đánh dấu mở rộng)
Một trong nhữn ưu điểm lớn nhất của nền tảng Android chính là việc nó thúc đẩy ngôn ngữ lập trình Java. Android SDK không hoàn toàn cung cấp sẵn mọi thứ cho Môi trường Thời gian chạy Java (JRE) chuẩn của bạn, nhưng nó lại hỗ trợ một phần rất đáng kể cho nó. Nền tảng Java đã và đang hỗ trợ rất nhiều cách khác nhau để làm việc với XML trong thời gian nhất định, và hầu hết các API có liên quan đến XML của Java đều được hỗ trợ đầy đủ trên Android. Ví dụ, Simple API của Java cho XML (SAX) và Document Object Model (DOM) hiện đều có sẵn trên Android. Nhiều năm qua, cả hai API này là một phần của công nghệ Java. Sản phẩm Streaming API mới đây cho XML (StAX) hiện chưa có trong Android. Tuy nhiên, Android lại cung cấp một thư viện tương đương về mặt chức năng. Điều cuối cùng là Java XML Binding API cũng không có sẵn trong Android. Chắc chắn có thể thực hiện API này trong Android. Tuy nhiên, nó lại có xu hướng là một API nặng ký, với rất nhiều thể hiện khác nhau thuộc các lớp khác nhau thường cần việc trình bày một tài liệu XML. Do vậy mà nó không lý tưởng lắm cho một môi trường bị ràng buộc chẳng hạn như thiết bị cầm tay mà Android được thiết kế để chạy trên đó. Trong các phần tiếp theo, bạn sẽ lấy một nguồn XML đơn giản có sẵn trên Internet, và xem cách phân tích nguồn đó như thế nào trong phạm vi một ứng dụng Android sử dụng các API khác nhau được nhắc đến ở trên.Trước tiên, hãy xem các phần cần thiết của ứng dụng đơn giản sẽ sử dụng XML từ Internet.

Trình đọc tin Android
Ứng dụng sẽ lấy điểm tin RSS từ trang nhà phát triển Android phổ biến Androidster và phân tách nó thành một danh sách các đối tượng Java đơn giản mà bạn có thể sử dụng để quay lại Android ListView (xem Tải về để lấy mã nguồn). Đây là hoạt động đa hình thái cổ điển — tức là các thực thi khác nhau (các thuật toán phân tích XML khác nhau) cung cấp hoạt động giống nhau. Ví dụ 1 cho bạn thấy bạn có thể mô hình hóa điều này dễ dàng như thế nào trong mã trình Java sử dụng một giao diện.

Ví dụ 1. giao diện trình phân tích điểm tin XML
package org.developerworks.android;
import java.util.List;

public interface FeedParser {
List parse();
}

Trong Ví dụ 2, lớp Message là một POJO (Plain Old Java Object) cổ điển miêu tả một cấu trúc dữ liệu.

Ví dụ 2. Message POJO
public class Message implements Comparable{
static SimpleDateFormat FORMATTER =
new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss Z");
private String title;
private URL link;
private String description;
private Date date;

// getters and setters omitted for brevity
public void setLink(String link) {
try {
this.link = new URL(link);
} catch (MalformedURLException e) {
throw new RuntimeException(e);
}
}

public String getDate() {
return FORMATTER.format(this.date);
}

public void setDate(String date) {
// pad the date if necessary
while (!date.endsWith("00")){
date += "0";
}
try {
this.date = FORMATTER.parse(date.trim());
} catch (ParseException e) {
throw new RuntimeException(e);
}
}

@Override
public String toString() {
// omitted for brevity
}

@Override
public int hashCode() {
// omitted for brevity
}

@Override
public boolean equals(Object obj) {
// omitted for brevity
}
// sort by date
public int compareTo(Message another) {
if (another == null) return 1;
// sort descending, most recent first
return another.date.compareTo(date);
}
}

Message, trong Ví dụ 2, thường rất dễ làm. Nó ẩn đi một vài trạng thái bên trong của mình bằng cách cho phép truy cập ngày tháng và các liên kết như các chuỗi đơn giản, trong khi thể hiện chúng như các đối tượng được sắp xếp một cách rõ ràng (một java.util.Date và một java.net.URL). Nó là một Value Object (Đối tượng Giá trị) cổ điển, do vậy nó thực thi equals()hashCode() dựa trên trạng thái bên trong của nó. Nó cũng thực hiện giao diện Comparable vì thế bạn có thể sử dụng nó để sắp xếp (theo ngày tháng). Thực tế, dữ liệu được phân loại từ điểm tin, do vậy mà điều này không cần thiết.
Mỗi thực thi trình phân tích sẽ cần đưa một URL đến điểm tin Androidster và sử dụng cái này để mở một kết nối HTTP đến trang Androidster. Hoạt động phổ biến này được mô hình hóa một cách tự nhiên trong mã trình Java sử dụng lớp cơ sở trừu tượng như trong Ví dụ 3.

Ví dụ 3. Lớp trình phân tích điểm tin cơ bản
public abstract class BaseFeedParser implements FeedParser {

// names of the XML tags
static final String PUB_DATE = "pubDate";
static final  String DESCRIPTION = "description";
static final  String LINK = "link";
static final  String TITLE = "title";
static final  String ITEM = "item";

final URL feedUrl;

protected BaseFeedParser(String feedUrl){
try {
this.feedUrl = new URL(feedUrl);
} catch (MalformedURLException e) {
throw new RuntimeException(e);
}
}

protected InputStream getInputStream() {
try {
return feedUrl.openConnection().getInputStream();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}

Lớp cơ sở lưu trữ feedUrl và sử dụng nó để mở java.io.InputStream. Nếu có bất kỳ sai sót nào, đơn giản nó thả một RuntimeException, sao cho ứng dụng dừng hoạt động một cách nhanh chóng. Lớp cơ sở cũng xác định một vài hằng số đơn giản cho tên các thẻ. Ví dụ 4 trình bày một số nội dung mẫu từ điểm tin, qua đó bạn có thể thấy được ý nghĩa của các thẻ này.

Ví dụ 4. Điểm tin XML mẫu




android_news

android_news

http://www.androidster.com/android_news.php

Sun, 19 Apr 2009 19:43:45 +0100

FeedCreator 1.7.2



Samsung S8000 to Run Android, Play DivX, Take Over the
World

http://www.androidster.com/android_news/samsung-s8000-to-run-android-
play-divx-take-over-the-world

More details have emerged on the first Samsung handset
to run Android. A yet-to-be announced phone called the S8000 is being
reported ...

Thu, 16 Apr 2009 07:18:51 +0100





Android Cupcake Update on the Horizon

http://www.androidster.com/android_news/android-cupcake-update-
on-the-horizon

After months of discovery and hearsay, the Android
build that we have all been waiting for is about to finally make it
out ...

Tue, 14 Apr 2009 04:13:21 +0100







Như bạn có thể thấy từ mẫu trong Ví dụ 4, một ITEM tương đương với một thể hiện Message. Các nút con của mục chọn (TITLE, LINK và v.v..) tương đương các đặc tính của thể hiện Message. Vì bạn biết điểm tin trông như thế nào rồi và có sẵn tất cả các phần phổ biến, hãy xem làm thế nào để phân tách điểm tin này sử dụng các công nghệ khác nhau có sẵn trên Android. Bạn sẽ bắt đầu với SAX.

Sử dụng SAX
Trong môi trường Java, bạn có thể thường xuyên sử dụng SAX API khi bạn muốn có một trình phân tích nhanh và muốn hạn chế tối đa việc sử dụng (footprint) bộ nhớ ứng dụng của bạn. Điều đó khiến cho cho nó rất phù hợp cho thiết bị di động chạy Android. Bạn có thể sử dụng SAX API như là từ môi trường Java, mà không cần đến những thay đổi đặc biệt cần thiết để chạy trên Android.Ví dụ 5 trình bày một thực thi SAX của giao diện FeedParser.

Ví dụ 5. Thực thi SAX
public class SaxFeedParser extends BaseFeedParser {

protected SaxFeedParser(String feedUrl){
super(feedUrl);
}

public List parse() {
SAXParserFactory factory = SAXParserFactory.newInstance();
try {
SAXParser parser = factory.newSAXParser();
RssHandler handler = new RssHandler();
parser.parse(this.getInputStream(), handler);
return handler.getMessages();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}

Nếu trước đây bạn đã sử dụng SAX, thì cái này trông cũng khá quen thuộc. Như với bất kỳ thực thi SAX nào, phần lớn các chi tiết đều nằm trong trình xử lý SAX. Trình xử lý nhận các sự kiện từ trình phân tích SAX khi nó chạy nhanh qua tài liệu XML. Trong trường hợp này, bạn vừa tạo ra một lớp mới gọi là RssHandler và đăng ký nó như là một trình xử lý cho trình phân tích, như trong Ví dụ 6.

Ví dụ 6. Trình xử lý SAX
import static org.developerworks.android.BaseFeedParser.*;

public class RssHandler extends DefaultHandler{
private List messages;
private Message currentMessage;
private StringBuilder builder;

public List getMessages(){
return this.messages;
}
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
super.characters(ch, start, length);
builder.append(ch, start, length);
}

@Override
public void endElement(String uri, String localName, String name)
throws SAXException {
super.endElement(uri, localName, name);
if (this.currentMessage != null){
if (localName.equalsIgnoreCase(TITLE)){
currentMessage.setTitle(builder.toString());
} else if (localName.equalsIgnoreCase(LINK)){
currentMessage.setLink(builder.toString());
} else if (localName.equalsIgnoreCase(DESCRIPTION)){
currentMessage.setDescription(builder.toString());
} else if (localName.equalsIgnoreCase(PUB_DATE)){
currentMessage.setDate(builder.toString());
} else if (localName.equalsIgnoreCase(ITEM)){
messages.add(currentMessage);
}
builder.setLength(0);   
}
}

@Override
public void startDocument() throws SAXException {
super.startDocument();
messages = new ArrayList();
builder = new StringBuilder();
}

@Override
public void startElement(String uri, String localName, String name,
Attributes attributes) throws SAXException {
super.startElement(uri, localName, name, attributes);
if (localName.equalsIgnoreCase(ITEM)){
this.currentMessage = new Message();
}
}
}

Lớp RssHandler mở rộng lớp org.xml.sax.helpers.DefaultHandler. Lớp này cung cấp các thực thi mặc định, không thao tác cho tất cả các phương thức tương tự các sự kiện được tạo ra bởi trình phân tích SAX. Điều này cho phép các lớp con chỉ ghi chèn lên các phương thức khi cần thiết. RssHandler có một API bổ sung, getMessages. Cái này trả về danh sách các đối tượng Message mà trình xử lý thu thập được khi nó nhận các sự kiện từ trình phân tích SAX. Nó có hai biến trong khác, một là currentMessage cho thể hiện Message đang được phân tích, và một là biến StringBuilder gọi là builder lưu trữ dữ liệu ký tự từ các nút văn bản. Các biến này đều được bắt đầu khi phương thức startDocument được dẫn ra khi trình phân tích gửi sự kiện tương ứng cho trình xử lý.
Hãy xem phương thức startElement trong Ví dụ 6. Phương thức này được gọi mỗi khi bắt gặp thẻ mở trong tài liệu XML. Bạn chỉ cần quan tâm khi nào thẻ đó là thẻ ITEM. Trong trường hợp đó, bạn tạo ra một Message mới. Bây giờ hãy nhìn vào phương thức characters. Phương thức này được gọi ra khi bắt gặp dữ liệu ký tự từ các nút văn bản. Dữ liệu dễ dàng được thêm vào biến builder. Cuối cùng hãy xem phương thức endElement. Phương thức này được gọi ra khi bắt gặp thẻ kết thúc. Đối với các thẻ tương ứng với các đặc tính của một Message, giống như TITLELINK, đặc tính thích hợp được thiết đặt trên currentMessage sử dụng dữ liệu từ biến builder. Nếu thẻ kết thúc là một ITEM, thì currentMessage thêm vào danh sách Messages. Đây là sự phân tích SAX rất điển hình; ở đây không có gì là duy nhất đối với Android. Vì thế nếu bạn biết cách viết một trình phân tích SAX Java, thì bạn biết cách viết một trình phân tích SAX Android. Tuy nhiên, Android SDK có bổ sung thêm một số tính năng thuận tiện vào SAX.

Phân tích SAX dễ dàng hơn
Android SDK có chứa một lớp tiện ích được gọi là android.util.Xml. Ví dụ 7 trình bày cách cài đặt một trình phân tích SAX với cùng lớp tiện ích như thế.

Ví dụ 7. Trình phân tích SAX Android
public class AndroidSaxFeedParser extends BaseFeedParser {

public AndroidSaxFeedParser(String feedUrl) {
super(feedUrl);
}

public List parse() {
RssHandler handler = new RssHandler();
try {
Xml.parse(this.getInputStream(), Xml.Encoding.UTF_8, handler);
} catch (Exception e) {
throw new RuntimeException(e);
}
return handler.getMessages();
}

}

Lưu ý là lớp này vẫn sử dụng trình xử lý SAX chuẩn, vì đơn giản bạn đã sử dụng lại RssHandler như trong Ví dụ 7 ở trên. Việc có thể sử dụng lại trình xử lý SAX rất tốt, nhưng nó vẫn có đôi chút phức tạp về mã trình. Bạn có tưởng tượng, nếu bạn phải phân tích một tài liệu XML phức tạp hơn rất nhiều, trình phân tích có thể trở thành mảnh đất màu mỡ cho các lỗi. Ví dụ, hãy xem lại phương thức endElement trong Ví dụ 6. Lưu ý cách phương thức này kiểm tra như thế nào nếu currentMessage có giá trị không trước khi nó cố cài đặt các thuộc tính? Bây giờ hãy nhìn vào XML mẫu trong Ví dụ 4. Lưu ý rằng có các thẻ TITLELINK nằm ngoài các thẻ ITEM. Đó là lý do tại sao kiểm tra giá trị không được đưa vào. Nếu không thì thẻ TITLE đầu tiên có thể gây ra một NullPointerException. Android bao gồm cả biến thể SAX API của chính nó (xem Ví dụ 8) loại bỏ yêu cầu bạn phải viết trình xử lý SAX của chính bạn.

Ví dụ 8. Trình phân tích SAX Android đơn giản
public class AndroidSaxFeedParser extends BaseFeedParser {

public AndroidSaxFeedParser(String feedUrl) {
super(feedUrl);
}

public List parse() {
final Message currentMessage = new Message();
RootElement root = new RootElement("rss");
final List messages = new ArrayList();
Element channel = root.getChild("channel");
Element item = channel.getChild(ITEM);
item.setEndElementListener(new EndElementListener(){
public void end() {
messages.add(currentMessage.copy());
}
});
item.getChild(TITLE).setEndTextElementListener(new EndTextElementListener(){
public void end(String body) {
currentMessage.setTitle(body);
}
});
item.getChild(LINK).setEndTextElementListener(new EndTextElementListener(){
public void end(String body) {
currentMessage.setLink(body);
}
});
item.getChild(DESCRIPTION).setEndTextElementListener(new
EndTextElementListener(){
public void end(String body) {
currentMessage.setDescription(body);
}
});
item.getChild(PUB_DATE).setEndTextElementListener(new EndTextElementListener(){
public void end(String body) {
currentMessage.setDate(body);
}
});
try {
Xml.parse(this.getInputStream(), Xml.Encoding.UTF_8,
root.getContentHandler());
} catch (Exception e) {
throw new RuntimeException(e);
}
return messages;
}
}

Như đã hứa, mã phân tích SAX mới không sử dụng trình xử lý SAX. Thay vào đó nó sử dụng các lớp từ gói android.sax trong SDK. Các lớp này cho phép bạn mô hình hóa cấu trúc của tài liệu XML của bạn và thêm một trình nghe sự kiện nếu cần. Trong mã trình trên, bạn khai báo rằng tài liệu của bạn sẽ có một phần tử gốc có tên rss và rằng phần tử này sẽ có ba phần tử con là channel. Tiếp đến bạn nói rằng channel sẽ có ba phần tử con được gọi là ITEM và bạn bắt đầu gắn các trình nghe. Đối với mỗi trình nghe, bạn đã sử dụng một lớp bên trong vô danh đã thực hiện giao diện bạn quan tâm (hoặc EndElementListner hoặc EndTextElementListener). Chú ý không cần phải theo dõi dữ liệu ký tự. Việc này không chỉ đơn giản hơn mà thực sự còn hiệu quả hơn. Cuối cùng, khi bạn gọi dẫn phương thức tiện ích Xml.parse, bây giờ bạn đưa vào trình xử lý được tạo ra từ phần tử gốc.
Toàn bộ mã trình ở trên trong Ví dụ 8 thuộc loại tùy chọn. Nếu bạn thấy thoải mái với mã trình phân tích SAX chuẩn trong môi trường Java, thì bạn có thể tích vào đó. Nếu bạn muốn thử các trình bao bọc tiện lợi do Android SDK cung cấp, bạn cũng có thể sử dụng nó. Nếu bạn không muốn sử dụng SAX thì sao đây? Vẫn còn có một vài lựa chon khác. Lựa chọn đầu tiên bạn sẽ thấy đó là DOM.

Làm việc DOM
DOM phân tích trên Android được hỗ trợ hoàn toàn. Nó làm việc chính xác như khi nó làm việc trong mã trình Java mà bạn sẽ chạy trên máy tính để bàn hoặc trên một máy chủ. Ví dụ 9 trình bày một thực thi dựa trên DOM của giao diện trình phân tích.

Ví dụ 9. Thực thi dựa trên DOM của một trình phân tích điểm tin
public class DomFeedParser extends BaseFeedParser {

protected DomFeedParser(String feedUrl) {
super(feedUrl);
}

public List parse() {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
List messages = new ArrayList();
try {
DocumentBuilder builder = factory.newDocumentBuilder();
Document dom = builder.parse(this.getInputStream());
Element root = dom.getDocumentElement();
NodeList items = root.getElementsByTagName(ITEM);
for (int i=0;i
Giống như ví dụ SAX đầu tiên, không có gì là cụ thể đối với Android về mã trình này. Trình phân tích DOM đọc tất cả các tài liệu XML vào bộ nhớ rồi sau đó cho phép bạn sử dụng các DOM API để chạy ngang qua cây XML, truy vấn dữ liệu mà bạn muốn. Đây là mã trình rất dễ làm, và, trong một số cách, còn đơn giản hơn cả các thực thi dựa trên SAX. Tuy nhiên, thông thường DOM tiêu tốn nhiều bộ nhớ hơn vì trước tiên mọi thứ đều được đọc vào bộ nhớ. Điều này có thể là một vấn đề trên thiết bị di động chạy Android, nhưng nó có thể đáp ứng được trong một vài trường hợp sử dụng nhất định mà dung lượng tài liệu XML sẽ không bao giờ quá lớn. Có thể điều này ngụ ý rằng các nhà phát triển Android đã đoán rằng trình phân tích SAX sẽ phổ biến hơn rất nhiều trên các ứng dụng Android, do đó các tiện ích bổ sung được cung cấp cho nó. Một loại trình phân tích XML khác cũng có trên Android, và đó là trình phân tích kéo.

Trình phân tích kéo XML
Như đã đề cập trong các phần trước, Android không cung cấp hỗ trợ cho StAX API của Java. Tuy nhiên Android lại đi kèm với một trình phân tích kéo làm việc tương tự như StAX. Nó cho phép mã ứng dụng của bạn kéo hoặc tìm kiếm các sự kiện từ trình phân tích, trái ngược với trình phân tích SAX tự động đẩy các sự kiện cho trình xử lý. Ví dụ 10 miêu tả một thực thi trình phân tích kéo của một giao diện trình phân tích điểm tin.
Ví dụ 10. Thực thi dựa trên trình phân tích kéo
public class XmlPullFeedParser extends BaseFeedParser {
public XmlPullFeedParser(String feedUrl) {
super(feedUrl);
}
public List parse() {
List messages = null;
XmlPullParser parser = Xml.newPullParser();
try {
// auto-detect the encoding from the stream
parser.setInput(this.getInputStream(), null);
int eventType = parser.getEventType();
Message currentMessage = null;
boolean done = false;
while (eventType != XmlPullParser.END_DOCUMENT && !done){
String name = null;
switch (eventType){
case XmlPullParser.START_DOCUMENT:
messages = new ArrayList();
break;
case XmlPullParser.START_TAG:
name = parser.getName();
if (name.equalsIgnoreCase(ITEM)){
currentMessage = new Message();
} else if (currentMessage != null){
if (name.equalsIgnoreCase(LINK)){
currentMessage.setLink(parser.nextText());
} else if (name.equalsIgnoreCase(DESCRIPTION)){
currentMessage.setDescription(parser.nextText());
} else if (name.equalsIgnoreCase(PUB_DATE)){
currentMessage.setDate(parser.nextText());
} else if (name.equalsIgnoreCase(TITLE)){
currentMessage.setTitle(parser.nextText());
}   
}
break;
case XmlPullParser.END_TAG:
name = parser.getName();
if (name.equalsIgnoreCase(ITEM) &&
currentMessage != null){
messages.add(currentMessage);
} else if (name.equalsIgnoreCase(CHANNEL)){
done = true;
}
break;
}
eventType = parser.next();
}
} catch (Exception e) {
throw new RuntimeException(e);
}
return messages;
}
}
Trình phân tích kéo làm việc tương tự như trình phân tích SAX. Nó có các sự kiện tương tự (phần tử bắt đầu, phần tử kết thúc) nhưng bạn phải kéo từ chúng (parser.next()). Các sự kiện được gửi đi dưới dạng các mã số, vì thế bạn có thể sử dụng một case-switch đơn giản. Chú ý, thay vì nghe cho đến khi kết thúc các phần tử như trong phân tích SAX, với trình phân tích kéo, thật dễ dàng tiến hành hầu hết các xử lý ngay từ đầu. Trong mã trình trong Ví dụ 10, khi một phần tử bắt đầu, bạn có thể gọi dẫn parser.nextText() để kéo tất cả dữ liệu ký tự từ tài liệu XML. Điều này mang đến một sự đơn giản hóa tốt cho phân tích SAX. Cũng cần chú ý rằng bạn đặt một cờ (biến boolean done) để nhận biết khi nào bạn đến phần kết thúc nội dung mà bạn quan tâm. Điều này cho phép bạn sớm tạm dừng việc đọc tài liệu XML, vì bạn biết rằng mã trình sẽ không quan tâm đến phần còn lại của tài liệu. Điều này có thể rất hữu ích, đặc biệt nếu bạn chỉ cần một phần nhỏ tài liệu đang được truy cập. Bạn có thể giảm đáng kể thời gian phân tích bằng cách dừng việc phân tích càng sớm càng tốt. Hơn nữa, kiểu tối ưu hóa này đặc biệt quan trọng trên thiết bị di động nơi tốc độ kết nối có thể chậm. Trình phân tích kéo có một vài ưu điểm về hiệu năng cũng như ưu điểm sử dụng dễ dàng. Cũng có thể sử dụng nó để viết XML.

Tạo XML
Đến tận bây giờ, tôi vẫn đã và đang tập trung phân tích XML từ Internet. Tuy nhiên, thỉnh thoảng ứng dụng của bạn cần gửi XML tới một máy chủ ở xa. Hiển nhiên bạn có thể sử dụng một StringBuilder hoặc cái gì đó tương tự để tạo ra một chuỗi XML. Một thay thế khác nữa bắt nguồn từ trình phân tích kéo trong Ví dụ 11.
Ví dụ 11. Viết XML bằng trình phân tích kéo
private String writeXml(List messages){
XmlSerializer serializer = Xml.newSerializer();
StringWriter writer = new StringWriter();
try {
serializer.setOutput(writer);
serializer.startDocument("UTF-8", true);
serializer.startTag("", "messages");
serializer.attribute("", "number", String.valueOf(messages.size()));
for (Message msg: messages){
serializer.startTag("", "message");
serializer.attribute("", "date", msg.getDate());
serializer.startTag("", "title");
serializer.text(msg.getTitle());
serializer.endTag("", "title");
serializer.startTag("", "url");
serializer.text(msg.getLink().toExternalForm());
serializer.endTag("", "url");
serializer.startTag("", "body");
serializer.text(msg.getDescription());
serializer.endTag("", "body");
serializer.endTag("", "message");
}
serializer.endTag("", "messages");
serializer.endDocument();
return writer.toString();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
Lớp XmlSerializer là một phần trong gói giống như XmlPullParser được dùng trong phần trước. Thay vì kéo vào các sự kiện, nó đẩy chúng ra đến một luồng hoặc một bộ ghi. Trong trường hợp này, nó dễ dàng đẩy chúng sang một thể hiện java.io.StringWriter. Nó cung cấp một API đơn giản cùng với các phương thức để bắt đầu và kết thúc một tài liệu, xử lý các phần tử và thêm văn bản hoặc các thuộc tính. Đây có thể là một lựa chọn thay thế khá tốt cho việc sử dụng một StringBuilder, vì dễ dàng đảm bảo XML của bạn chuẩn xác.

Tổng kết
Loại ứng dụng nào bạn muốn xây dựng cho các thiết bị Android? Dù là loại nào đi nữa, nếu nó cần làm việc với dữ liệu từ Internet, thì có thể nó cần phải làm việc với XML. Trong bài viết này, bạn đã thấy rằng Android được tích hợp đi cùng với rất nhiều công cụ xử lý XML. Bạn có thể chọn lấy một trong các công cụ đó như là công-cụ-lựa-chọn của bạn, hoặc bạn có thể lựa chọn căn cứ vào trường hợp sử dụng. Thông thường sự lựa chọn an toàn là chọn cùng với SAX, và Android cung cấp cho bạn cả cách truyền thống để thực hiện SAX và một trình bao bọc tiện lợi khéo léo trên cả SAX. Nếu tài liệu của bạn nhỏ, thì có lẽ DOM là cách đơn giản hơn nên theo. Nếu tài liệu của bạn lớn, nhưng bạn chỉ cần một phần tài liệu, thì trình phân tích kéo XML có lẽ là cách hiệu quả hơn nên theo. Cuối cùng, để viết XML, gói trình phân tích kéo cũng cung cấp một cách thuận tiện để làm việc đó. Vì thế, cái mà XML của bạn cần có là gì đi nữa, thì Android SDK vẫn có cho bạn.

Chương trình Android đầu tiên: Giải phương trình bậc 2 « Đào Hải Nam

Cách đây ít ngày, Google đã đưa ra bộ công cụ phát triển phần mềm cho Android (Android SDK), một nền tảng mới cho các dòng máy di động. Android là một nền tảng hoàn chỉnh dựa trên hệ điều hành Linux (kernel 2.6), các ứng dụng chạy trên máy ảo Java – phiên bản được thiết kế cho các dòng máy di động có tên Dalvik.
Các tính năng mà Android hỗ trợ rất rộng, bao gồm đồ họa 2D, 3D (dựa trên OPENGLES), khả năng định vị (hiện chỉ dùng GPS), Bluetooth, EDGE, 3G, WiFi, hỗ trợ thoại GSM, dữ liệu có thể được lưu trữ trong cơ sở dữ liệu SQLLite… tất nhiên các thiết bị hỗ trợ Android sẽ không do Google sản xuất, và một số tính năng nâng cao như Wifi, GPS, 3D hardware accelerator… sẽ phụ thuộc vào từng dòng thiết bị cụ thể.
Một tin vui cho các lập trình viên là các bước phát triển ứng dụng trên Android rất đơn giản, với sự hỗ trợ của nhiều thư viện có sẵn, mô hình lập trình khá sáng sủa, cùng với IDE Eclipse, đến thời điểm hiện tại thì bộ tài liệu của nó còn khá sơ sài, đặc biệt là về API. Tuy nhiên, đối với những người đã thành thạo Java, đặc biệt là đã từng xây dựng các ứng dụng cho di động thì việc tiếp cận rất dễ dàng.
Địa chỉ chính thức của Android hiện tại là: http://code.google.com/android/
Sau khi đọc qua tài liệu về Android, bạn có thể theo hướng dẫn của nó để tải về bộ SDK, Eclipse và cấu hình, cài đặt các thành phần liên quan. Tôi đã thử viết một chương trình cực kỳ phức tạp, đó là chương trình giải phương trình bậc 2 :D . Thật đáng kinh ngạc, chỉ sau ít phút, tôi đã có ngay một chương trình để chạy trên thiết bị Android.
Trước khi thử viết chương trình, bạn nên đọc qua tài liệu của nó, tối thiểu bạn phải có khả năng tạo một bộ khung chương trình trong Eclipse, sau đó hãy thay nội dung của hai file main.xml và GPTB2.java như sau (dự án có tên GPTB2, tên lớp activity chính cũng đặt là GPTB2.java)
xml version=1.0 encoding=utf-8 ?>
<LinearLayout xmlns:android=http://schemas.android.com/apk/res/android android:orientation=vertical android:layout_width=fill_parent android:layout_height=fill_parent>
<TextView android:layout_width=fill_parent android:layout_height=wrap_content android:text=Giải phương trình bậc 2 />
<EditText id=@+id/a android:layout_width=300pt android:layout_height=80pt android:numeric=true />
<EditText id=@+id/b android:layout_width=300pt android:layout_height=80pt android:numeric=true />
<EditText id=@+id/c android:layout_width=300pt android:layout_height=80pt android:numeric=true />
<Button id=@+id/calculate android:layout_width=250pt android:layout_height=80pt android:text=Calculate />
<TextView id=@+id/result android:layout_width=fill_parent android:layout_height=fill_parent />
LinearLayout>
Tiếp theo là file GPTB2.java

package com.daohainam.ptb2;

import android.app.Activity;
import android.os.Bundle;
import android.widget.*;
import android.view.*;

public class PTB2 extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
setContentView(R.layout.main);

final Button button = (Button) findViewById(R.id.calculate);
final TextView result = (TextView) findViewById(R.id.result);
button.setOnClickListener(new Button.OnClickListener() {
public void onClick(View v) {
String sa = ((EditText) findViewById(R.id.a)).getText().toString();
String sb = ((EditText) findViewById(R.id.b)).getText().toString();
String sc = ((EditText) findViewById(R.id.c)).getText().toString();

try
{
double a = Double.parseDouble(sa);
double b = Double.parseDouble(sb);
double c = Double.parseDouble(sc);

if (a == 0)
{
result.setText(“Phương trình bậc I: “);
if (b == 0)
{
if (c == 0)
result.setText(result.getText() + “Phương trình có vô số nghiệm”);
else
result.setText(result.getText() + “Phương trình vô nghiệm”);
}
else
{
result.setText(result.getText() + “x = “ + (-c/b));
}
}
else
{
double delta = b*b – 4*a*c;

if (delta <>
{
result.setText(“Phương trình vô nghiệm\n”);
}
else
if (delta == 0)
{
result.setText(“Phương trình có nghiệm kép = “ + (-b/(2*a)));
}
else
{
double delta_sqrt = Math.sqrt(delta);
result.setText(“x1 = “ + ((b*b + delta_sqrt)/(2 * a)) + “\n” + “x2 = “ + ((b*b – delta_sqrt)/(2 * a)));
}
}

} catch (Exception ex)
{
result.setText(ex.toString());
}
}
});
}
}

Vậy là xong, khi chạy bạn sẽ có thể thấy giao diện chương trình như sau:

Nhập các giá trị cần thiết và nhấn vào nút Calculate để xem kết quả.
Bạn cũng có thể download toàn bộ dự án tại đây (mã nguồn này được xây dựng dựa trên bản SDK đầu tiên)

Cập nhật: Mã nguồn tại đây được xây dựng dựa trên bản SDK 1.5r2.
Giao diện

Nguồn Đào Hải Nam