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