27/07/2011

Tại sao phải truy xuất View qua hàm findViewById

Trong khi lập trình Java, Delphi, C++ ... nếu chúng ta có Form a, b là Widget nằm trong a thì ta có thể truy xuất b bằng cách a.b hay một cách tương tự.
Vậy tại sao trong Android, nếu có Activity a và View b nằm trong file layout của a thì ta không truy xuất b qua a mà phải sử dụng hàm static của Activity findViewById?
Thật ra nếu ai nắm kỹ về định nghĩa Activity đều dễ dàng trả lời câu hỏi này:
Activity là đối tượng mà chúng ta đặt lên trên nó các View để xây dựng nên màn hình
Vậy các View không phải "nằm trong" hay đối tượng con của đối tượng Activity như trường hợp của Form ở trên.

24/07/2011

Tại sao mã nguồn Android có giấy phép sử dụng APL 2.0

Sau khi học qua Kiến trúc của Android:
Có một số bạn thắc mắc GNU libc có giấy phép sử dụng là LGPL vậy Android sử dụng GNU libc thì tại sao Android lại có giấy phép sử dụng là APL 2.0 chứ không phải là LGPL hay GPL?
Thật ra Android không dùng GNU libc (glibc) mà Android sử dụng Bionic libc.
Sau đây là một số đặc điểm của Bionic libc:
  • Giấy phép sử dụng: BSD License.
  • Kích thước: Vì libc được load lên trong mỗi process cho nên kích thước của libc càng nhỏ càng tốt. Bionic libc có kích thước khoảng 200KB bằng một nửa kích thước GNU libc.
  • Tốc độ:Bionic libc hiện thực lại pthread để nó nhỏ gọn hơn, tốc độ nhanh hơn để khắc phục hạn chế sức mạnh của CPU.
  • Bionic libc bổ sung thêm chức năng dành riêng cho Anroid như system properties và logging.
  • Bionic libc không hỗ trợ không số đặc điểm của POSIX như C++ exception, wchar cho nên Bionic libc không tương thích với GNU libc.

Tại sao gọi hàm setContentView trong onCreate?



Sau khi học qua vòng đời của một Activity:

có người thắc mắc rằng tại sao chúng ta không đặt lời gọi hàm setContentView để thiết lập layout cho Activity ở onStart hay onResume mà phải đặt nó trong onCreate?
Để trả lời cho câu hỏi này chúng ta xem xét mối quan hệ giữa các sự kiện xảy ra trong vòng đời một Activity và ba trạng thái của Activity (background/foreground/visible):
Chúng ta thấy rằng onStart/onResume ở trạng thái visible cho nên người dùng đã nhìn thấy màn hình của Activity. Nếu ta gọi hàm setContentView ở đây thì xảy ra tình trạng người dùng sẽ nhìn thấy màn hình trống trong khoảng thời gian nhất định.

19/07/2011

Gửi dữ liệu sang ứng dụng khác sử dụng Notification

Giả sử chúng ta muốn gửi dữ liệu sang ứng dụng khác có tên class:
com.nghelong.blogexample.MainActivity
sử dụng Notification. Điều này có nghĩa là khi ứng dụng chúng ta đang chạy thì xuất hiện một Notification message trên thanh status bar. Khi người dùng click vào Notification thì màn hình MainActivity bật lên.


Notification notification = new Notification(icon, tickerText, when);
Bundle xtra = new Bundle();
Intent ntent = new Intent(); 
ntent.setClassName("com.nghelong.blogexample",
                    "com.nghelong.blogexample.MainActivity");
//set data here
//xtra
ntent.putExtras(xtra);
int flags = Intent.FLAG_ACTIVITY_NEW_TASK
                    | Intent.FLAG_ACTIVITY_SINGLE_TOP
                    | Intent.FLAG_ACTIVITY_CLEAR_TOP; 
ntent.setFlags(flags);
PendingIntent pendingIntent = PendingIntent.getActivity(context, 0,
                ntent, PendingIntent.FLAG_UPDATE_CURRENT); 
notification.setLatestEventInfo(context, contentTitle, contentText,
                pendingIntent);
nm.notify(NOTIFICATION_ID, notification);
 

17/07/2011

Sử dụng ngôn ngữ trong ứng dụng Android không phụ thuộc vào locale của thiết bị

Các bạn chắc ai cũng biết Android support multi-language dựa vào cơ chế alternative resource và locale của device. Điều đó có nghĩa là ngoài thư mục res/values bạn cần chuẩn bị các thư mục res/values-[mã ngôn ngữ] hay res/values-[language code]-r[mã vùng] ( nếu như ngôn ngữ có nhiều vùng, nhiều quốc gia sử dụng) khi bạn muốn ứng dụng của bạn hỗ trợ một ngôn ngữ nào đó. Ngoài ra để ứng dụng bạn chuyển sang ngôn ngữ này thì bạn cần cấu hình cho thiết bị sử dụng locale tương ứng với ngôn ngữ.
Tuy nhiên có một tình huống đặt ra như sau: Bạn dùng máy với locale Tiếng Anh nhưng bạn lại muốn ứng dụng của bạn hiển thị Tiếng Việt. Hay ứng dụng của bạn có nơi hiển thị danh sách ngôn ngữ, người dùng chọn ngôn ngữ nào thì ứng dụng bạn hiển thị ngôn ngữ đó. Bài toán này được giải quyết như sau:

String languageToLoad  = "vi";
Locale locale = new Locale(languageToLoad);
Locale.setDefault(locale);
Configuration config = new Configuration();
config.locale = locale;
getBaseContext().getResources().updateConfiguration(config, null);
Trong tập tin AndroidManifest.xml:
<activity
  android:label="@string/app_name"
  android:name=".Dex"
  android:configChanges="locale">
<supports-screens
android:smallScreens="true"
android:normalScreens="true"
android:largeScreens="true"
android:anyDensity="true"
/>   
Sau đó để không phải restart lại ứng dụng chúng ta sử dụng câu lệnh sau:
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR); 
Tham khảo:
  1. Force Locale on Android
  2. Selecting language from within the app rather than by locale of the system settings

11/04/2011

QML Internationalization

  • Bước 1: Sử dụng một trong các hàm sau để đánh dấu các chuỗi cần biên dịch: qsTr(), qsTranslate(), QT_TR_NOOP() và QT_TRANSLATE_NOOP(). Ví dụ: Text {text:qsTr("Monday")}
  • Bước 2: Sử dụng lupdate để tạo translation source file:
    ví dụ:
    lupdate vidu.qml -ts vidu.ts
    Chúng ta dùng Linguist mở vidu.ts, dịch rồi release thu được tập tin vidu.qm
  • Bước 3: Thực thi qmlviewer với tuỳ chọn translatation:
    qmlviewer -translation vidu.qm vidu.qml

02/04/2011

Trạng thái mạng và android.net.conn.CONNECTIVITY_CHANGE

Đối với một số người mới lập trình hệ thống trên Android sẽ lúng túng khi sử dụng android.net.ConnectivityManager để quản lý trạng thái mạng (kết nối, đứt kết nối ...). Sau đây là một ví dụ đơn giản để giải quyết vấn đề này:
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
public class NetworkStateReceiver extends BroadcastReceiver {
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(android.net.conn.CONNECTIVITY_CHANGE)) {
//Làm việc gì đó
}
}
}
Trong manifest file:
<receiver class=".NetworkStateReceiver" android:name=".NetworkStateReceiver">
<intent-filter>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
  </intent-filter>
</receiver>   

Canterbury đặt dấu chấm hết cho Debian, Gentoo, Grml, OpenSUSE và Arch Linux

Dự án Canterbury sẽ cho ra đời Canterbury Linux. Đây có thể ví như sự kiện nhà Tần thống nhất Trung Hoa vậy vì Canterbury là sự hợp nhất của Debian, Gentoo,Grml, OpenSUSE và Arch Linux.
 Thông tin chính thức đã có trên trang chính của các distro trên:
  • http://www.debian.org/News/2011/20110401
  • http://www.gentoo.org/news/20110401-canterbury.xml 
  • http://blog.grml.org/archives/352-The-Canterbury-Project.html 
  • http://news.opensuse.org/2011/04/01/the-canterbury-distribution/ 
  • http://www.archlinux.org/news/the-canterbury-project/ 
Do đó tất cả những thần dân của Debian, Gentoo, Grml, OpenSUSE hay Arch bây giờ có thể hợp nhất dưới mái nhà chung Centerbury rồi.
Sự hợp nhất này đem lại cái lợi lớn là làm đơn giản hoá cho các nhà phát triển ứng dụng tuy nhiên lại làm mất đi sự phong phú, đa dạng trong cộng đồng chim cánh cụt.

24/03/2011

Alert Dialog trong Android

Trong lập trình phát triển ứng dụng Android để giao tiếp với người dùng có hai cách:
  1. Sử dụng một màn hình (Activity)
  2. Sử dụng hộp thoại (Dialog)
Tuỳ tình huống cụ thể chúng ta chọn giải pháp phù hợp.
Việc sử dụng một Dialog thông minh đôi khi cho chúng ta một giải pháp tuyệt vời.
Để hiển thị Dialog trong Android chúng ta thường sử dụng AlertDialog.
Sau đây là đoạn mã sử dụng AlertDialog tôi thường sử dụng:
AlertDialog.Builder mAltBld = new AlertDialog.Builder(this);
mAltBld.setMessage("")
.setCancelable(false)
.setPositiveButton("Yes", new DialogInterface.OnClickListener()
{
public void onClick(DialogInterface aDialog, int aID){
//Thực hiện điều gì đó khi người dùng bấm nút Yes.
}
})
.setNegativeButton("No",new DialogInterface.OnClickListener()
{
public void onClick(DialogInterface aDialog, int aID){
//Thực hiện điều gì đó khi người dùng bấm nút No.
aDialog.cancel();
}

});
AlertDialog mAlert = mAltBld.create();
//Tiêu đề cho AlertDialog
mAlert.setTitle("Tiêu đề");
//Biểu tượng cho AlertDialog
mAlert.setIcon(R.drawable.icon);
mAlert.show();

03/03/2011

Lấy tên phương thưc hiện tại

Trong lập trình Java. Dôi khi bạn muốn lấy tên phương thức hiện tại ví dụ để xuất thông tin phục vụ cho gỡ rối chẳng hạn. Sau đây là kinh nghiệm của cá nhân mình:
Đối với Java 4:
new Exception().getStackTrace()[0].getMethodName();
Đối với Java 5:
Thread.currentThread().getStackTrace()[1].getMethodName();

Cấu hình Firefox hoạt động với Ultrasurf

Một điều đáng tiếc cho các thần dân FirefoxUltrasurf không tự cấu hình Firefox khi cài đặt (và hầu hết các công cụ che dấu IP dựa trên VPN khác cũng vậy ngoại trừ IP Privacy)
Có hai lựa chọn cho bạn khi bạn muốn sử dụng Firefox kết hợp với Ultrasurf để dấu mình khi truy xuất mạng:
  1. Cài Ultrasurf Firefox Addon.
  2. Tự cấu hình Firfox sử dụng các máy chủ Ultrasurf.
Trong bài viết này tôi nói về lựa chọn thứ 2. Bạn thực hiện theo các bước sau đây:
  1. Mở Firefox.
  2. Vào Tools --> Options ...
  3. Chọn trang Network, nhấn nút Settings


  4. Trong cửa sổ "Connection Settings" chọn "Manual proxy configuration"


  5. Điền vào ô HTTP Proxy và ô Port các giá trị tương ứng là 127.0.0.19666 (xem hình trên).
  6. Nhấn OK rồi OK một lần nữa.
  7. Khởi động chương trình Ultrasurf (bạn có thể nhìn thấy biểu tượng cái khoá màu vàng ở gócdưới bên tay phải màn hình của bạn)

  8. Vào trang WhatIsMyIPAddress.com để kiểm tra IP của bạn. Nó sẽ hiện lên một trong các IP của Ultrasurf. Bây giờ bạn đã có thể lướt Web ẩn danh rồi.
Lưu ý:
Bạn đừng quên chuyển "Connection Settings" từ "Manual proxy configuration" sang "Direct connection to the internet" sau khi thoát chương trình Ultrasurf nếu không bạn không thể truy xuất mạng bằng Firefox được.

    03/01/2011

    Chuyện tình Rau muống biển


    Hôm nay xem ảnh một người bạn vô tình nhìn thấy ảnh hoa muống biển.
    Bao nhiêu ký ức tuổi thơ quay về. Nhớ ngày xưa khi chăn trâu, chăn bò, có loài rau rất tốt, hoa tim tím rất đẹp nhưng trâu, bò không ăn. Có phải trâu, bò cũng cảm động với chuyện tình muống biển? Thưở đó, F thường hái hoa muống biển để giữa vòng ngón tay cái và ngón tay trỏ của bàn tay trái . Dùng tay phải đập mạnh, hoa vỡ ra, một tiếng kêu nhỏ phát ra.
    Từ khi F nghe câu chuyện đau lòng về muống biển thì F không còn chơi trò này nữa.
    HOA MUỐNG BIỂN
    (Khải Nguyên)
    Thiếu phụ ngóng chồng
    Nỗi đau hóa đá - vọng phu.


    Em ngóng đợi anh
    Nỗi buồn hóa thành hoa muống biển.


    Bông hoa trắng xinh xinh
    Nhụy hoa buồn tim tím
    Rưng rức mắt người
    Rưng rức trái tim đau...

    Sao em không hóa thành hòn đá ngóng trông nhau
    Bền vững, thủy chung, trầm mặc trông ra phía biển
    Em lại hóa thành loài hoa rau muống
    Cứ mãi bồng bềnh... làm khổ suốt đời nhau


    Dưới cái nắng ban trưa - lá héo, hoa úa màu
    Cứ dại khờ, oằn mình, vật vã dưới chân ai - trên cát
    Anh hiểu được em - nỗi buồn kia tan nát
    Người ấy không về... mê mải cuối trời xa...


    Suốt một đời, sao em chẳng nhận ra
    Hóa kiếp thân em - nỗi buồn xưa còn đó
    Lữ khách ơi, đừng một lần giẫm lên loài hoa nhỏ!
    Để cô muống chân tình tan nát... cõi lòng đau! 
    Chuyện tình Rau muống biển
    Nhạc:Hoàng Phương
    Trình bày: Giao Linh
    Em đến thăm anh mùa vui bên biển
    Nụ hoa muống biển rung rinh rung rinh 
    Chao sóng vỗ về chào em chào em 
    Làn gió mát ru, triền sóng hát ca 
    Hải âu tung trời đùa, cá tôm theo thuyền về 
    Anh kể chuyện tình về biển em nghe. 
    Thuở loài người có tên trước biển 
    Và không ai gọi biển như bây giờ 
    Có chàng trai tên Biển cùng yêu thương cô Muống chân tình 
    Biển mải mê khơi tìm luồng cá 
    Con nước vô tình cuốn biển trôi xa! 
    Muống âu sầu rồi chết bên bờ 
    Đời gọi tên từ đó loài hoa, loài hoa muống biển 
    Đời gọi tên từ đó: bông hoa trắng xinh xinh, nhụy hoa buồn tim tím 
    Mùa xuân không về phố bao giờ!!! 
    Để đêm đêm nghe biển ru bóng dừa... 
    Mùa xuân không về phố bao giờ! 
    Mùa xuân không về phố bao giờ! 
    Để đêm đêm nghe biển thức vọng về... 
    Để đêm đêm nghe biển thức vọng về.

    04/08/2010

    Khắc phục màn hình CRT bị nhoè

    Sáng nay tự nhiên cái màn hình máy tính LG Flatron ez T530S tự nhiên chữ bị nhoè.
    Sau một hồi chỉnh sửa các thông số về monitor và display adapter không đem lại kết quả.
    F nghĩ chắc là do phần cứng rùi. Cuối cùng mở cái màn hình ra và nhớ lại cái kiến thức xa xưa rồi không dùng về màn hình CRT. F cho rằng phải có cái nút để chỉnh biến trở cho mấy chùm tia quét chứ.  Dùng screw chỉ chỏ hồi cũng tìm ra 2 cái ốc hình chữ nhật. Trong đó có một cái là adjustable thôi.Chỉnh qua chỉnh lại đến mức OK.
    Lưu ý: Mở màn hình CRT là việc làm vô cùng nguy hiểm vì bạn dễ dàng bị điện giật. Do đó bạn chỉ áp dụng bài viết này cho mình khi bạn có kiến thức về an toàn điện.

    16/07/2010

    Firebird Developer Day Lần 7

    NHÀ TỔ CHỨC:

    Mind The Bird

    Giới thiệu về MindTheBird trên website http://www.mindthebird.com
    MindTheBird! is the Firebird Community activation campaign, with main goal to support launch of Firebird 2.5 and ensure the visibility of Firebird in the world of information technologies, media, open-source enthusiasts and end users.
    MindTheBird! provides a messaging framework, marketing materials and guidance for Firebird end-users, journalists and even competitors. We encourage all developers and enthusiasts of Firebird to be the part of this very important campaign.
    Be Firebird ambassador. Take a look around our website and we'll show you how you can help Firebird.
    MindTheBird đã tổ chức một số cuộc thi:
    1. Useful and Cool Stored Procedures
      Ba SP thắng giải:

    2. Firebird Articles
      Ba bài viết đạt giải:

    3. Thiết kế logo sinh nhật thứ 10 của Firebird.
      Tải về tại đây.

    Webinar:Technological history of Firebird - 3 decades of innovations

    Webinar do Ann Harrison trình bày lúc 14:00 08/04/2010.
    Tải toàn bộ webinar về tại đây (zip, 10.5MB)

    Webinar:SuperClassic: new architecture in Firebird

    Webinar do Dmitry Yemanov trình bày lúc 15:30 06/04/2010.
    Tải toàn bộ webinar về tại đây (zip, 35MB)

    10/07/2010

    Tích hợp blog RSS feed vào Facebook

    Có hai trường hợp xảy ra:

    1. Tích hợp RSS feed vào tài khoản facebook của bạn.
    2. Tích hợp RSS feed vào fan page do bạn tạo ra.

    Trường hợp 1:
    -Click vào "Profile" để quay về trang của tài khoản của bạn.
    -Click chuột vào "Options".
    -Bạn nhìn thấy rất nhiều biểu tượng trong đó có Blog/RSS.
    -Nhấn chuột vào nó và patse cái liên kết URL của RSS Feed.
    Chỉ đơn giản vậy thôi. Bây giờ bạn quay lại tab "Wall" sẽ thấy xuất hiện các headline bài viết mới của bạn trong blog xuất hiện ở đó. Trong tab "Notes" bạn sẽ bài viết mới của bạn import vào đây.
    Trường hợp 2:
    -Click chuột vào "Edit page".
    -Di chuyển xuống "Notes".
    -Chọn "Edit".
    -Bây giờ bạn theo hướng dẫn trên màn hình để làm các bước kế tiếp.

    08/07/2010

    Mozilla Firefox 4.0 có gì mới?

    Mozilla vừa cho phát hành bản beta 1 của Firefox 4.0 (trước đây gọi là Firefox 3.7).
    Trong phiên bản 4.0 này Mozilla Firefox có những điểm đổi mới sau đây:
    • Về các tab: Vị trí của các tab chỉ mặc định ở trên đầu cửa sổ trong Windows. Trong Mac OS và Linux thvì ị trí của các tab sẽ thay đổi tuỳ theo theme.
    • Trong Windows 7 & Windows Vista thì thanh trình đơn sẽ được thay thế bằng nút Firefox.
    • Bạn có thể tìm kiếm hay chuyển đến một tab đang mở trong Smart Location Bar (Thanh vị trí thông minh).
    • Addon Manager mới, Extension Management API mới (giao diện sẽ thay đổi).
    • Cải tiến API để hỗ trợ js-ctype.
    • Nút Stop & Reload được gộp chung lại thành một nút trên Windows, Mac, Linux.
    • Mặc định Thanh công cụ Bookmark Toolbar bị thay thế bởi nút Bookmark (nếu thích bạn có thể cấu hình quay về như cũ).
    • Crash protection (chống đóng băng) cho Windows, Mac, Linux khi các trình cộng thêm như Adobe Flash, Apple QuickTime, Microsoft Silverlight bị lỗi.
    • Hỗ trợ một phần cho CSS Transitions.
    • Hỗ trợ đầy đủ WebGL nhưng mặc định thì chức năng này không kích hoạt.
    • Trên Mac OS X thì hỗ trợ trình cộng thêm (plugin) Core Animation redering model.Trình cộng thêm này giúp vẽ hình nhanh hơn và hiệu quả hơn.
    • Hỗ trợ HD HTML5 WebM.
    • Trên Windows thì thí nghiệm hỗ trợ Direct2D redering backend. Tuy nhiên mặc định cức năng này không kích hoạt.
    • Web developer có thể sử dụng Websockets như Bidirectional Communication API đơn giản hơn, nhanh hơn.
    • Web developer có thể sử dụng HTML History API để thay đổi URL của trang mà không cần tải lại trang.
    • Sử dụng việc xây dựng khung chậm (lazy frame construction) để làm tăng tính đáp ứng khi sinh trang.
    • Việc tìm kiếm liên kết đã lưu được tiến hành bất đồng bộ để tăng khả năng đáp ứng khi tải trang tránh trường hợp trang bị đóng băng như trước đây.
    • CSS: visited selector để tránh một số website lợi dụng kiểm tra history của người dùng.
    • HTML5 parser mới.
    • Hỗ trợ thêm một số HTML5 form control.
    Để dùng thử Firefox 4.0beta 1. Tải về tại đây.

    29/06/2010

    Nokia sẽ ly hôn với Symbian và se duyên cùng Linux

    Để cạnh tranh với Apple và Google, Nokia quyết định không sử dụng hệ điều hành Symbian trên dòng điện thoại N-Series của mình nữa. Thay vào đó Nokia sẽ sử dụng hệ điều hành MeeGo (một hệ điều hành nhân Linux, được phát triển dưới sự hợp tác của Nokia và Intel, bằng sự kết hợp Maemo và Moblin). Sở dĩ có quyết định này vì Apple và Google quá thành công với việc sử dụng hệ điều hành Linux trên các sản phẩm của họ. Apple rất thành công hệ điều hành iPhone OS, Google thì sử dụng Androi, Palm dùng WebOS hay Limo. Tất cả chúng đều là hệ điều hành Linux.
    Theo số liệu của Gartner thì thị phần của điện thoại sử dụng HĐH Linux tăng từ 8.5% lên 14% trong quý I năm 2010.