Wednesday, March 20, 2013

API - Fragments

Fragments

- Một Fragment đại diện cho một hành động hoặc một phần của user interface trong một activity.
- Có thể kết hợp nhiều fragment trong cùng một actitvity để xây dựng một multi-pane UI và tái sử dụng một fragment trong nhiều actitvity
- Có thể coi fragment là một thành phần mô-đun của một actitvity, nó có lifecycle của riêng mình, tiếp nhận các event, và có thể thêm hoặc loại bỏ trong khi activity đang chạy.
- Fragment được nhúng vào một actitvity và fragment's lifecycle bị ảnh hưởng trực tiếp bời lifecycle của activity chứa nó. Ví dụ: khi activity paused tất cả fragment chứa trong nó đều paused.
- Tuy nhiên khi một activity đang chạy (trạng thái resumed) bạn có thể thao tác độc lập với mỗi fragment.

- Khi bạn thêm một fragment như một phần của layout activity, nó phải được đặt trong một ViewGroup và nằm bên trong hệ thống phân cấp activity's view
- Có thể thêm một fragment vào activity layout bằng cách khai báo một element <fragment> trong file layout hoặc từ code bằng cách thêm nó vào một ViewGroup có sẵn.
- Fragment không nhất thiết phải là một phần của activity layout, bạn có thể sử dụng một fragment mà không cần tới UI của nó như một thành phần ẩn của activity.

Tiêu chí thiết kế

Android đã giới thiệu fragment trong Android 3.0 (API level 11). Chủ yếu để hỗ trợ việc thiết kế UI linh động trên các màn hình lớn, như tablet. Màn hình tablets lớn hơn các thiết bị cầm tay vì thế có nhiều khoảng trống đề kết hợp và thay đổi các thành phần UI. Fragment cho phép thiết kế mà không cần bạn phải quản lý các thay đổi phức tạp của hệ thống phân cấp view. Bằng cách chia layout ra các fragment, bạn có thể chỉnh sửa cách thức xuất hiện của activity tại thời điểm runtime và bảo toàn các thay đổi của nó trong một back stack được quản lý bởi activity.

Ví dụ. Một ứng dụng sử dụng một fragment để hiển thị list các bài viết bên trái, và một fragment khác để hiển thị nội dung của bài viết đó bên phải. Cả 2 fragment xuất hiện trong một activity, ngay cạnh nhau. Mỗi fragment có một lifecycle riêng và xử lý các event của chúng.



Bạn nên thiết kết mỗi fragment như một mô-đun và có thể tái sử dụng. Mỗi fragment đều có layout, lifecycle và các hành vi riêng vì thế bạn có thể sử dụng 1 fragment trên nhiều activity. Tránh thao tác trực tiếp 1 fragment từ 1 fragment khác. Điều này đặc biệt quan trọng bởi vì một mô-đun fragment cho phép bạn thay đổi sự kết hợp fragment cho các kích thước màn hình khác nhau. Khi thiết kế ứng dụng để hỗ trợ cả tablets và cầm tay, bạn có thể tái sử dụng fragment trong các thiết lập layout khác nhau để tối ưu trải nghiệm người dùng dựa trên khoản không gian sẵn có của màn hình. Ví dụ trên các thiết bị cầm tay, bạn cần phải ngăn cách các fragment để cung cấp một single-pane UI trong khi không thể sử dụng nhiều fragment trong một layout.


Friday, November 9, 2012

stackoverflow - How to get screen dimensions

Question:

I created some custom elements and I want to programatically place them to the upper right corner (n pixels from the top edge and m pixels from the right edge) therefore I need to get the screen width and screen height and then set position:
int px = screenWidth - m;
int py = screenWidth - n;
Does anyone know how to get screenWidth and screenHeight in the main Activity?
Thanks

Best Answer:
If you want the the display dimensions in pixels you can use getSize:
Display display = getWindowManager().getDefaultDisplay();
Point size = new Point();
display.getSize(size);
int width = size.x;
int height = size.y;
If you're not in an Activity you can get the default Display via WINDOW_SERVICE:
WindowManager wm = (WindowManager) ctx.getSystemService(Context.WINDOW_SERVICE);
Display display = wm.getDefaultDisplay();
Before getSize was introduced (in API level 13), you could use the getWidth and getHeightmethods that are now deprecated:
Display display = getWindowManager().getDefaultDisplay(); 
int width = display.getWidth();  // deprecated
int height = display.getHeight();  // deprecated
For the use case you're describing however a margin/padding in the layout seems more appropriate.
Source: http://stackoverflow.com/questions/1016896/android-how-to-get-screen-dimensions

Friday, October 12, 2012

Networking - Bài 2

Client server
  • Để xử lý nhiều  yêu cầu kết nối với các mục đích khác nhau và chúng đến gấn như đồng thời modern server operating system sử dụng khái niệm port
  • Port không phải là thiết bị vật lý, chúng đại diện cho một vùng nhớ cụ thể của máy tính
  • Server có thể lắng nghe trên nhiều port tại một address
  • Mọi máy tính với địa chỉ IP đều hỗ trợ một phạm vi hàng nghìn port cho phép xử lý nhiều kết nối cùng lúc
  • Port được chia ra thành 3 phạm vi:
    • Well-known ports: 0 -> 1023
    • Registered ports: 1024 -> 49151
    • Dynamic and/or private ports: 49152 -> 65535
Checking network status

  • Android cung cấp các tiện ích của host để xác định các hình thiết bị và trạng thái của các dịch vụ khác nhau bao gồm cả network.
  • Lớp ConnectivityManager xác định kết nối mạng có tồn tại hay không và để get các cảnh bảo về sự thay đổi trên mạng.
  • Đoạn code dưới đây là một phần của main Activity trong ứng dụng NetworkExplorer thể hiện cách sử dụng cơ bản của ConnectivityManager.
@Override
public void onStart() {
super.onStart();
ConnectivityManager cMgr = (ConnectivityManager)
this.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo netInfo = cMgr.getActiveNetworkInfo();
this.status.setText(netInfo.toString());
}

    • Ví dụ trên cho bạn thấy bạn có thể lấy một handle cho ConnectivityManager thông qua phương thức getSystemService của ngữ cảnh bằng cách truyền vào hằng số CONNECTIVITY_SERVICE.
    • Khi bạn đã có được mannager bạn có thể lấy được thông của mạng thông qua đối tượng của lớp NetworkInfo
  • Phương thức isAvailable hoặc isConnected(trả về giá trị boolean) được sử dụng để kiểm tra kết nối mạng
  • Có thể truy vấn trực tiếp NetworkInfo.State sử dụng phương thức getState. State là một enum định nghĩa các trạng thái thô của kết nối. Các giá trị của nó CONNECTED, CONNECTING, DISCONNECTED, DISCONNECTING.

2D Graphich


1.     Color
·        Màu sắc trong android được đại diện bởi 4 con số cho alpha, red, green, blue (ARGB). Mỗi thành phần có 256 giá trị ó 8 bits vì thế nó được đóng gói trong 32-bit Integer.
·        Alpha thể hiện cho độ trong suốt. Giá trị thấp nhất là 0 ó trong suốt. Giá trị lớn nhất là 255 óđục.
·        Bạn có thể tạo ra color bằng cách sử dụng các hằng số tĩnh trong lớp Color
int color = Color.BLUE;

·        Nếu bạn biết ARGB và biết con số đại diện cho blue bạn có thể dùng một hàm tĩnh của lớp Color
color = Color.argb(127, 255, 0, 255);

·        Một cách khác là định nghĩa một color trong XML resource file:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="mycolor">#7fff00ff</color>
</resources>

Bạn có thể tham chiếu color mà bạn đã định nghĩa bằng cách sử dụng java code
color = getResources().getColor(R.color.mycolor);

·        Hàm getResources() trả về một lớp ResourceManager của Activity hiện tại, và hàm getColor cho manager biết phải tìm color theo id nhận được

2.     Paint
·        Chứa style, color, và các thông tin khác cần thiết để vẽ đồ họa (bitmap, text, geometric shape).
·        Cài đặt color với phương thức Paint.setColor() ví dụ:
cPaint.setColor(Color.LTGRAY);

3.     Canvas
·        Đại diện cho mặt ngoài mà bạn sẽ vẽ trên nó.
·        Ban đầu canvas trống rỗng, các phương thức của lớp Canvas cho phép bạn vẽ các đường thẳng, hình chữ nhật, hình tròn, và các dạng hình học khác trên nó.
·        Trong Android, màn hình hiển thị là một Activity, nó làm chủ một View, View này làm chủ một Canvas. Bạn có thể vẽ trên canvas này bằng cách ghi đè phương thức View.onDraw(). Tham số duy nhất của phương thức này là một canvas mà bạn vẽ trên.Đây là một ví dụ:
public class Graphics extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(new GraphicsView(this));
}
static public class GraphicsView extends View {
public GraphicsView(Context context) {
super(context);
}
@Override
protected void onDraw(Canvas canvas) {
// Drawing commands go here
}
}
4.     Path
·        Lớp Path dữ một tập hợp vector-drawing cammand như các đường thẳng, hình chữ nhật, đường cong. Dươi đây là một ví dụ định nghĩa một đường tròn:
circle = new Path();
circle.addCircle(150, 150, 100, Direction.CW);

Nó sẽ tạo ra một đường tròn tại tọa độ x = 150, y = 150 với bán kính là 100 px. Tiếp theo chúng ta sẽ sử dụng path này để vẽ một đường tròn bên ngoài và thêm một số chữ xung quan bên trong
private static final String QUOTE = "Now is the time for all " +
"good men to come to the aid of their country." ;
canvas.drawPath(circle, cPaint);
canvas.drawTextOnPath(QUOTE, circle, 0, 20, tPaint);

5.     Drawable
·        Lớp Drawable được sử dụng cho một phần tử nhìn thấy giống như bitmap hoặc solid color được dùng chỉ để hiển thị.
·        Bạn có thể kết hợp drawable với các graphic khác, hoặc có thể sử dụng chúng trên user interface widgets (background, button, view…)
·        Dawable nhận một sự đa dạng của các form:
o   Bitmap: PNG, JPEG image
o   NinePatch: một PNG có thể kéo dài. Nó được chia ra làm 9 phần. Được sử dụng làm background của resizable bitmap button.
o   Shape: Vector-drawing cammand, dựa trên lớp Path.
o   Layers: Một container cho các child drawable mà vẽ trên cũng của child khác theo z-order.
o   States: Một container mà show một trong các drawables của nó dựa trên trạng thái của nó (một bit mask). Một cách sử dụng khác là để thiết lập các tùy chọn khác nhau và focus các trạng thái cho các button.
o   Levels: Một container chỉ show duy nhất một trong các child drawable của nó dựa trên level của nó (Một phạm vi của số nguyên). Có thể sử dụng cho pin và tín hiệu kế.
o   Scale: Một container cho một child drawable mà có thế hiệu chỉnh kích thước của nó dựa trên level hiện hành. Sử dụng cho zoomable picture viewer.

Networking - Bài 1

Để có thể làm việc với mạng chương trình của bạn phải được cấp quyền như sau:

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
  • Android sử dụng giao thức HTTP để gửi và nhận dữ liệu
  • Android có 2 loại HTTP client:
    • HttpURLConnection
    • HttpClient
  • Cả 2 loại trên đều hỗ trợ HTTPs, download, upload, tùy chỉnh timeout, IPv6 và tổng hợp connection.
Kiểm tra kết nối mạng

  • sử dụng hàm getActivityNetworkInfo() và isConnected() để kiểm tra kết nối mạng có sẵn dùng hay không
public void myClickHandler(View view) {
    ...
    ConnectivityManager connMgr = (ConnectivityManager) 
        getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo networkInfo = connMgr.getActiveNetworkInfo();
    if (networkInfo != null && networkInfo.isConnected()) {
        // fetch data
    } else {
        // display error
    }
    ...
}
a

Saturday, October 6, 2012

Intent trong Android



Intent:
  • Là một cấu trúc dữ liệu mô tả cách thức,đối tượng thực hiện của 1 Activity
  • Là cầu nối giữa các Activity:một ứng dụng Android gồm nhiều Activity và mỗi Activity thực hiện một nhiệm vụ khác nhau
  • Intent giống người đưa thư giúp chúng ta truyền triệu gọi cũng như truyền dữ liệu cần thiết để có thể thực hiện Activity này từ Activity khác (tương tự như di chuyển qua lại giữa các window Form)
  • Intent là khái niệm đặc trưng và then chốt của Android Platform  
Một Intent được thực hiện bởi các thành phần khác nhau như
  • Mong muốn hành động hoặc dịch vụ
  • Dữ liệu,loại thành phần nên xử lý
  • Các ý định và hướng dẫn về việc làm thế nào khởi động một activity
Intent Filter: Activity, ServiceBroadCast Receiver sử dụng Intent Filter để thông báo cho hệ thống biết các dạng Implicit Intent (cái này là gì thì tí nữa sẽ định nghĩa sau) mà nó có thể xử lý,hay nói cách khách Intent filter là bộ lọc Intent,chỉ cho phép những Intent được chỉ định đi qua nó.

Các thuộc tính của Intent:
  • Component name:tên của component mà sẽ xử lí intent (ví dụ: “com.example.project.app.MyActivity1”),khi thuộc tính này được xác định thì các thuộc tính khác sẽ thành không bắt buộc(optional)
  • Action:là một chuỗi đặt tên cho các hành động mà Intent sẽ yêu cầu thực hiện (ví dụ:Action_view,action_call…)
  • Data:là xử liệu sẽ được xử lí trong action thường được biểu diễn dưới dạng URI (ví dụ : tel:/216 555-1234 , "http://maps.google.com”, ...)
  • Category:bổ sung thông tin cho các action của Intent (ví dụ: Category_launcher thông báo sẽ thêm launcher như một ứng dụng top level)
  • Extras:chứa tất cả các cặp (key,value) do ứng dụng thêm vào để truyền qua Intent (cấu trúc Bundle)
  • Type:định dạng kiểu dữ liệu (chuẩn MIME )thường là tự xác định

Cơ chế cung cấp Intent cho các component:
  • Một Intent được thông qua đến Context.startActivity() or Activity.startActivityForResult() để khởi động một Activity hoặc sử dụng Activity hiện tại để thực hiện một hành động mới(Nó cũng có thể được truyền cho Activity.setResult() để trả về thông tin cho hoạt động này đó được gọi là startActivityForResult()).
  • Một Intent được thông qua đến Context.startService() để bắt đầu một service hoặc cung cấp chỉ dẫn mới cho một dịch vụ đang hoạt động.
  • Một Intent có thể thông qua đến Context.bindService() để có thể thiết lập kết nối giữa các component gọi điện thoại và service mục tiêu,nó có thể tùy chọn bắt đầu Service nếu nó chưa hoạt động

Intent Resolution:khi các Intent được phát ra Android sẽ tìm cách phù hợp nhất để thực hiện yêu cầu.Quyết định thực thi cái gì dựa trên mức độ mô tả của lời gọi.
  • Explicit Intent:chỉ rõ một Component cụ thể( bằng setComponent(ComponentName) hoặc setClass(Context, Class) ), nó cho biết chính xác lớp nào cần chạy. Đây là cách thông thường mà một ứng dụng bật các activity nội tại của nó khi người dùng tương tác với ứng dụng.
  • Implicit Intent :không chỉ rõ component nào. Tuy nhiên, chúng chứa đủ thông tin để hệ thống xác định các component sẵn có nào là phù hợp nhất để chạy cho intent đó.
  • Cơ chế phân giải Intent(Intent Resolution) về cơ bản là so sánh intent với các mô tả <intent-filter> trong các ứng dụng đã cài trên thiết bị.

Friday, October 5, 2012

Android - Safe and Secure

- Mọi ứng dụng chạy trong tiến trình Linux của nó.
- Phần cứng không cho phép tiến trình này truy cập vào vùng nhớ của tiến trình kia.
- Mỗi một ứng dụng đều có một user ID riêng, các ứng dụng khác không thể đọc hoặc ghi các file mà nó tạo ra.
- Việc truy cập vào một số hoạt động quan trọng bị hạn chế, bạn cần phải xin phép sử dụng chúng trong file AndroidManifest.xml. Package Manager sẽ có hoặc không cấp phép. Một vài quyền thường dùng:
+INTERNET: truy cập internet
+READ_CONTACT: đọc dữ liệu contact của người dùng
+WRITE_CONTACT: ghi dữ liệu contact của người dùng
+RECEIVE_SMS: quản lý các SMS tới
+ACCESS_COARSE_LOCATION
+ACCESS_FINE_LOCATION
- Ví dụ để quản lý tin SMS tới ta định nghĩa như sau trong file manifest:

<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.google.android.app.myapp" >
       <uses-permission android:name="android.permission.RECEIVE_SMS" />
</manifest>
- Có thể giới hạn truy cập tới các bộ phận của toàn bộ hệ thống. Bằng cách sử dụng XML tag trong AndroidManifest.xml bạn có thể giới hạn người có thể khởi động activity, gắn vào một service, broadcast các intent để nhận hoặc truy cập dữ liệu trong một content provider.

Android - Using Resources

- Resource là các tài nguyên cục bộ như text string, bitmap, hoặc các thành phần noncode mà chương trình cần để chạy
- Tại thời điểm build time tất cả tài nguyên sẽ được biên dịch vào trong chương trình
- Trong android bạn có thể tạo và lưu trữ tài nguyền trong thư mục res của project.
- Bộ biên dịch tài nguyên của android sẽ xử lý các tài nguyên theo các thư con mà chúng chưa trong và theo định dạng của tài nguyên đó. Ví dụ: PNG, JPG định dạng bitmaps phải lưu trữ ở thư mục res/drawable, tập tin XML mô tả giao diện lưu trữ ở res/layout
- Bộ biên dịch sẽ nén và đóng gói các tài nguyên sau đó tạo ra class R chứa các định danh dùng để tham chiếu tới tài nguyên trong chương trình.

Android - Building in Blocks

Activities
- Một activity là một màn hình giao diện người dùng.
- Một chương trình có thể định nghĩa nhiều actitity để xử lý các giai đoạn khác nhau của chương trình

Intent
- Là cơ chế mô tả một hành động cụ thể
- Ví dụ: chúng ta có intent để "send an email". Nếu ứng dụng của bạn cần gửi một email, bạn sẽ gọi intent này. Hoặc nếu bạn viết một chương trình gửi email, bạn có thể đăng ký một activity để xử lý intent này.

Services
- Là một tiến trình chạy trong chế độ background, không cho phép người dùng tương tác trực tiếp với nó.

Content Providers
- Là một tập dữ liệu gói gọn trong một API tùy biến cho phép đọc và ghi.
- Là một cách để chia sẻ dữ liệu global giữa các ứng dụng
- Ví dụ: google cung cấp một content provider cho các contact, tất cả các thông tin như: tên, địa chỉ, số điện thoại... có thể được chia sẻ cho bất cứ ứng dụng nào cần dùng đến.