Thành phần của một ứng dụng android - học lập trình android cơ bản

Khái niệm đầu tiên bạn sẽ được tiếp cận khi học lập trình android cơ bản đó là tìm hiểu các thành phần của một ứng dụng android, chức năng, ý nghĩa của thành phần đó với ứng dụng như thế nào.
Để tạo nên một ứng dụng android thì có 7 thành phần cơ bản: Activity, Intent, Service, BroadcastReceiver, Content provider, View, Lưu trữ cơ sở dữliệu. 
1. Activity
Đây là thành phần quan trọng nhất của bất kì ứng dụng Android nào. Activity chỉ một việc mà người dùng có thể thực hiện trong một ứng dụng, nó đảm nhận việc tạo ra cửa sổ (window) để người lập trình đăth lên đó 1 giao diện UI với setContentView(View). Một activity có nhiều dạng khác nhau: Một cửa sổ toàn màn hình (full screen window), một cửa sổ floating (với windowsIsFloating) hay nằm lồng bên trong 1 activity khác (với ActivityGroup).
Hai phương thức mà mọi lớp con của Activity đều phải thực hiện:
onCreate(Bundle): nơi khởi tạo activity, người lập trình gọi setContentView(int) kèm theo layout để thực hiện UI của mình. Đồng thời còn có findViewByld(int) giúp gọi các widget để dùng trong UI
onPause(): nơi giải quyết sự kiện ngươi dùng rời khỏi activity, mọi dữ liệu được tạo ra cần phải được lưu vào
Các lớp activity muốn sử dụng được Context.startActivity thì phải khai bào với tag <activity> trongfile Android Manifest.xml

thành phần của ứng dụng android-khóa học lập trình android cơ bản

Vòng đời của một activity: Các activity được quản lí dưới dạng các activity stack: Khi một activity mới được khởi tạo, nó sẽ được đưa lên đầu stack và được ưu tiên, các activity khác muốn chạy trở lại thì cần phải chờ tới khi Activity mới này kết thúc
Một Activity có 4 trạng thái:
Running: khi một activity đang chay trên màn hình
Paused: khi một act vấn đang chạy trên màn hình nhưng đang bị một act chiếm toàn màn hình hiển thị phía trên. Tuy vẫn lưu trữ dữ liệu, những các paaaused activity này sẽ bị hệ thống bắt chấm dứt khi thiếu bộ nhớ trầm trọng.
Stopped: khi 1 activity bị che khuất hoàn toàn nời một activity khác, tuy vẫn lưu trữ dữ liệu, những các stopped activity này sẽ thường xuyên bị hệ hống bắt chấm dứt để dành chỗ cho các tiến trình khác.
Killed hay Shutdown: khi 1 activity đang pause hay stopped, hệ thống sẽ xóa activity ấy ra khỏi bộ nhớ.
Lược đồ biểu diễn vòng đời của một Activity:

thành phần của ứng dụng android-khóa học lập trình android cơ bản


Toàn bộ vòng đời của Avtivity được định nghĩa nhà các phương thức sau:
- protected void onCreate(Bundle savedInstanceState); /*Gọi khi mới tạo activity để setup các view, binding dữ liệu,… Kèm theo sau luôn là onStart(). */
- protected void onRestart();//Gọi sau khi activity bị stopped và trước khi được khởi động lại, kèm theo sau luôn là onStart().
- protected void onStart(); //Gọi khi activity hiện lên trước mắt người dùng. Kèm theo sau là onResume() nếu activity hiện lên nền hay onStop(0 nếu bị ẩn đi.
- protected void onResume();//Gọi khi activity bắt đầu tương tác với người dùng và đang trên cùng của activity stack. Kèm theo sau luôn là onPause().
- protected void onPause();//Gọi khi hệ thống sắp khởi động lại 1 activity khác trướcđó, kèm theo sau là onresume nếu activity trở lại trên cùng hay onStop() nếu bị ẩn đi.
- protected void onStop();//Gọi khi activity không còn hiển thị trước người dùng. Kèm theo sau là onRestart() nếu activity hiện lên trở lại hay onDestroy nếu sắp xoá activity đi.
- protected void onDestroy(); //Gọi ngay trước khi kết thúc activity, xảy ra khi hàm finish() được gọi hoặc khi hệ thống yêu cầu buộc phải kết thúc.

2. Intent
Intent là một mô tả trừu tượng của một hành động được thực thi, đại diện cho một hành động đi kèm với một ngữ canhr xác định.
Intent được sử dụng với phương thức startActivity() để mở một Activity, và dùng với BroadcastIntent để gửi nó đến bất cứ BroadcastReceiver liên quan nào, và dùng với startService(Intent), bindService(Intent, ServiceConnection, int) để giao tiếp với các Service chạy dưới nền.
Intent cung cấp một chức năng cho phép kết nối hai chương trình khác nhau trong quá trình thực thi (runtime). Chức năng quan trọng và được sử dụng nhiều nhất của một Intent là mở một Activity (Truyền thông tin giữa hai Activity khác nhau).
Thành phần chính của Intent:
- Action: Xác định hành động sẽ được thực thi, các hành động này có thể là: ACTION_VIEW, ACTION_EDIT, ACTION_MAIN…
- Data: Các dữ liệu được sử dụng để hành động (Action) thao tác trên nó.
Ví du:-
- ACTION_VIEW content://contacts/people/1: hiển thị thông tin liên lạc của người có mã là “1”.
- ACTION_DIAL content://contacts/people/1 – gọi điện cho người có mã là “1”.
Ngoài ra Intent còn phụ thuộc vào các thuộc tính: Category (thông tin chi tiết về hành động được thực thi); Type(chỉ định kiểu dữ liệu chính xác được mang bởi intent); Component(chỉ rõ tên của lớp thành phần sử dụng intent); Extracts (một đối tượng Bundle chứa thông tin kèm theo để cung cấp thông tin cần thiết cho component).
Intent có hai dạng chính:
Explicit Intents: Xác định rõ một component thông qua phương thức setComponent(ComponentName) hoặc setClass(Context, Class) cung cấp lớp sẽ thực thi các hành động được đặc tả trong Intent.
Implicit Intents: Không chỉ định một component nào cả, thay vào đó, chúng sẽ chứa đủ thông tin để hệ thống có thể xác định component có sẵn nào là tốt nhất để thực thi hiệu quả cho Intent đó.
Bất cứ thành phần nào (Activity, BroadcastReceiver, Service) khi muốn sử dụng trong ứng dụng đều phải được đăng kí trong file AndroidManifest.xml. Trong đó cầnđịnh nghĩa một thẻ <intent-fillter> cung cấp các thông tin để hệ thống có thể xác định được cái mà các component này (Activity, BroadcastReceiver, Service) có thể xử lý được.
Intent Fillter là bản đặc tả có cấu trúc của các giá trị của Intent dùng để xác định component phù hợp để thực hiệncác hành động được đặc tả trong Intent. Một Intent Fillter có các thành phần chính sau:Action (tên hành động mà component có thể thực thi); Type (kiểu hành động mà component có thể thực thi); Catogory(phân nhóm hành động).

3. Service:
Service là các tác vụ chạy ngầm dưới hệ thống nhằm thực hiện một nhiệm vụ nào đó. Mỗi class Service phải chứa thẻ <service> được khai báo trong file AndroidManifext.xml. Services có thể được bắt đầu.
Service không phải là một luồng (trừ trường hợp có một yêu cầu đặc biệt) nó chạy trên luồng chính của tiến trình chính. Khi chạy các hành vi có cường đọ lớn, nó sẽ tự sinh ra luồng của chính nó để thực hiện các tác vụ được đặc tả trong Service. Nó có hai đặc trưng chính:
Là một chức năng cho phép ứng dụng cung cấp các chức năng của nó cho các ứng dụng khác. tương ứng với việc gọi Context.bindService()
Là một chức năng để ứng dụng thông báo với hệ thống việc mà nó muốn thực hiện ở phía dưới nền. tương ứng với việc gọi phương thức Context.startservice.
Vòng đời của 1 Service được thể hiện qua hình sau:

thành phần của ứng dụng android-khóa học lập trình android cơ bản


Theo hình trên thì 1 service được bắt đầu bởi phương thức startService() có nghĩa service sẽ thực hiện các tác vụ ngầm dưới nền và cung cấp chức năng cho các chương trình khác.

4. BroadcastReceiver
Đây là thành phần phổ biến, nó luôn chạy ngầm trong hệ thống android với mục đích thu thập các Intent thông báo từ hệ điều hành. Có thể tạo instance cho lớp này bằng 2 cách: hoặcvới Context.registerReceiver() hay thông qua tag <receiver> trong file AndroidManifest.xml.
Có hai lớp broadcast quan trọng:
- Broadcast bính thường: Được gửi bởi context.sendBroadcast tới các receivcers hoàn toàn không theo 1 trật tự nào, có đôi khi tồn tại cùng 1 lúc nhiều receivers khác nhau=> nhanh những không thể trao đổi kết quả nhận về giữa các receiver với nhau.
- Broadcast có thư tự: Được gửi bởi Context.sendOrderedBroadcast() tới từng receiver, kết quả nhận về của 1 receiver có thể là input của 1 receiver khác hay có thể dừng ngay lập tức việc broadcast tới các receiver khác.

5. Content provider
Là một kho dữ liệu chia sẻ nó cung cấp cách truy cập dữ liệu và giúp chia sẻ dữ liệu giữa các ứng dụng.
Cách thức hoạt động của Content Provider: Mọi content provider, tuy có thể khác nhau về cách thức lưu trữ dữ liệu, đều sử dụng chung 1 interface để tìm và trả về dữ liệu, bao gồm việc thêm, bớt và sửa dữ liệu. Việc này được thực hiện thông qua các đối tượng ContentResolver khi gọi getContentResolver().
Để tìm kiếm 1 Content Provider người lập trình cần có các yếu tố sau: URI xác định Provider, tên các trường dữ liệu sẽ lấy về; các kiểu dữ liệu của những trường trên; ID – khi cần tìm một dòng xác định;
Người lập trình có thể dùng 1 trong 2 phương thức: ContentResolver.query() hoặc Activity.managedQuery(). Cả 2 phương thức trên đều có chung arguments và đều trả về 1 đối tượng con trỏ (Cursor).
Ví dụ:
- public final Cursor query (Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder)
- public final Cursor managedQuery (Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder)
Với cả 2 phương pháp ta đều cần cung cấp URI của bên cung cấp, tức CONTENT_URI. Chú ý nếu muốn giới hạn chỉ tìm kiếm 1 URI duy nhất, ta thêm ID vào cuốiURI như sau: “content://…/23”, với 23 là ID ta cần tím kiếm.
Để tạo một Content Provider chúng ta cần khai báo 1 content provider trong file AndroidManifest.xml. Để định nghĩa một lớp con Content Provider, ta thực hiện 6 phương thức trừu tượng được khai báo trong lớp ContenProvider: query() -> insert() -> update() -> delete() -> getType() -> onCreate()

6. View
View là thành phần cơ bản để xây dựng giao diện người dùng cho 1 ứng dụng android. View là 1 lớp căn bản của widgets. Lớp con viewGruop là lớp căn bản của layout, có thể coi như 1 cái hộp vô hình chứa nhiều Views hay ViewGroups khác và xác định các thuộc tính layout.
Sử dụng View như thê nào? Mọi view đều được sắp xếp theo thứ tự trên 1 cây trong 1 hay nhiều file XML nằm trong layout. Để tạo dựng cây, chúng ta cần xác định cá giá trị: các thuộc tính, mức độ tập trung, Listeners, nhìn thấy hay không nhìn thấy.
Một số views thường dùng: TextView, ImageView, Button, checkbox, keyboardview, webview, …
Các viewgroup thường dùng: linearLayout (sắp xếp 1 hàng hay 1 cột duy nhất), AbsoluteLayout (xác định vị trí), TableLayout (sắp xếp view theo cột, hàng), RelativeLayout(xác định vị trí theo mối quan hệ), FrameLayout (là 1 placeholder cho phép đặt lên đó 1 view duy nhất), …

7. Lưu trữ cơ sở dữliệu
Android có 2 phương pháp phổ biến để lưu trữ CSDL:
Sử dụng hệ thống Preferences, cho phép các ứng dụng và activity lưu trữ preferences theo dạng cặp khóa và giá trị, nằm giữa các lần gọi một activity. Bạn có thể lưu trữ bất kì thông tin nào bằng từ khóa theo kiểu String và kiểu dữ liệu nguyên thủy.
Thực hiện công việc lưu trữ dữ liệu bằng cách sử dụng tập tin. Có hai mô hình truy cập tập tin: các tập tin được đóng gói sẵn cho ứng dụng; các tập tin được tạo trên thiết bị thực thi ứng dụng đó.
Ngoài hai phương pháp trên, android còn hỗ trợ hệ quản trị CSDL SQLite để quản lý dữ liệu lớn và phức tạp. Đây là hệ quản trị CSDL nhúng được thực hiện từ chuẩn SQL-92, nó chiếm dung lượng nhỏ nên việc truy xuất dữ liệu nhanh chóng không chiếm dụng quá nhiều tài nguyên hệ thống, không bị giới hạn tác quyền vì là phần mềm mã nguồn mở. SQLite không khác biệt nhiều so với nhiều ngôn ngữ truy vấn khác, thích hợp sử dụng cho các ứng dụng trên điện thoại, đặc biệt là android.
Chúng ta đã khái quát xong những thành phần cơ bản của một ứng dụng Android, đây là những khái niệm cơ bản các bạn cần phải nắm rõ và hiểu thật sâu khi bắt đầu học lập trình android. 

0 nhận xét:

Copyright © 2013 ĐÀO TẠO LẬP TRÌNH TẠI HÀ NỘI and Blogger Templates - Anime OST.