Mục lục I. Các thành phần cơ bản của một ứng dụng android.............................3 II. Giao diện người dùng trong android.......................................6 III. Intent...................................................................9 IV. Service.................................................................12 V. Broadcast Receiver........................................................15 VI. MultiThreading & Background work........................................17 VII. Content Providers.......................................................20 VIII. SQLite................................................................22 IX. Storages................................................................26 X. Networking................................................................30 XI. Multimedia..............................................................31
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Mục lụcI. Các thành phần cơ bản của một ứng dụng android............................................................................................3
II. Giao diện người dùng trong android................................................................................................................6
III. Intent...................................................................................................................................................................9
IV. Service...............................................................................................................................................................12
V. Broadcast Receiver..............................................................................................................................................15
VI. MultiThreading & Background work............................................................................................................17
VII. Content Providers............................................................................................................................................20
VIII. SQLite...........................................................................................................................................................22
IX. Storages............................................................................................................................................................26
XI. Multimedia.......................................................................................................................................................31
CÁC KIẾN THỨC CƠ BẢN VỀ LẬP TRÌNH ANDROID
I. Các thành phần cơ bản của một ứng dụng android
1. Các thành phần cơ bản để tạo nên một ứng dụng android
Việc hiểu được các thành phần (component) tạo nên một ứng dụng Android là rất cần
thiết cho việc lập trình. Các thành phần này được chia làm 6 loại bao gồm:
- Activity: hiểu một cách đơn giản thì Activity là nền của 1 ứng dụng. Khi khởi động 1
ứng dụng Android nào đó thì bao giờ cũng có 1 main Activity được gọi, hiển thị màn
hình giao diện của ứng dụng cho phép người dùng tương tác.
- Service: thành phần chạy ẩn trong Android. Service sử dụng để update dữ liệu, đưa ra
các cảnh báo (Notification) và không bao giờ hiển thị cho người dùng thấy.
- Content Provider: kho dữ liệu chia sẻ. Content Provider được sử dụng để quản lý và
chia sẻ dữ liệu giữa các ứng dụng.
- Intent: nền tảng để truyền tải các thông báo. Intent được sử dụng để gửi các thông báo
đi nhằm khởi tạo 1 Activity hay Service để thực hiện công việc bạn mong muốn. VD:
khi mở 1 trang web, bạn gửi 1 intent đi để tạo 1 activity mới hiển thị trang web đó.
- Broadcast Receiver: thành phần thu nhận các Intent bên ngoài gửi tới. VD: bạn viết 1
chương trình thay thế cho phần gọi điện mặc định của Android, khi đó bạn cần 1
BroadcastReceiver để nhận biết các Intent là các cuộc gọi tới.
- Notification: đưa ra các thông báo mà không làm cho các Activity phải ngừng hoạt
động.
2
2. Vòng đời của một Activity
o Active hoặc running: Khi Activity là được hiển thị, chạy trên màn hình. Trạng thái
này tập trung vào những thao tác của người dùng trên ứng dụng.
o Paused: Activity là được tạm dừng (paused) khi mất focus nhưng người dùng vẫn
trông thấy. Có nghĩa là một Activity mới ở trên nó nhưng không hiển thị đầy màn
hình. Một Activity tạm dừng là còn sống nhưng có thể bị kết thúc bởi hệ thống trong
trường hợp thiếu vùng nhớ.
3
o Stopped: Nếu nó hoàn toàn bao phủ bởi Activity khác. Nó vẫn còn trạng thái và thông
tin thành viên trong nó. Người dùng không thấy nó và thường bị loại bỏ trong trường
hợp hệ thống cần vùng nhớ cho tác vụ khác.
Các phương thức cần chú ý khi thao tác với Activity
Phương thức: onCreate():
o Được gọi khi activity lần đầu tiên được tạo.
o Ở đây bạn làm tất cả các cài đặt tĩnh - tạo các view, kết nối dữ liệu...
o Phương thức này có thể nhận một đối tượng Bundle chứa đựng từ trạng thái trước
của Activity.
o Luôn theo sau bởi onStart()
Phương thức: onRestart()
o Được gọi sau khi activity đã onStop(), người dùng mở lại activity. Ngay sau khi
onRestart(), activity chuyển ngay sang onStart().
o Luôn theo sau bởi onStart()
Phương thức: onStart()
o Được gọi trước khi một activity hiển thị với người dùng.
o Theo sau bởi onResume() nếu activity ở trạng thái foreground hoặc onStop() để ẩn
Phương thức: onResume()
o Được gọi trước khi activity bắt đầu tương tác với người dùng
o Tại thời điểm này activity ở trên đỉnh của stack activity.
o Luôn theo sau bởi onPause()
Phương thức: onPause()
o Được gọi khi hệ thống đang resuming activity khác.
o Phương thức này được gọi, ứng dụng bị foreground nhưng dữ liệu không mất.
Phương thức: onStop()
o Được gọi khi activity không còn kiểm soát bởi người dùng
o Được theo sau bởi onRestart() nếu activity đang để tương tác với người dùng,
hoặc onDestroy() nếu activity đang hủy.
4
Phương thức: onDestroy()
o Được gọi trước khi activity bị hủy.
o Đó là lần gọi cuối cùng mà activity này được nhận.
Các trạng thái có thể bị kill bởi người dùng.
II. Giao diện người dùng trong android
1. Các layout thường dùngCác layout được dùng để quản lý các thành phần giao diện khác theo một trật tự
nhất định.o FrameLayout: Layout đơn giản nhất, các thành phần giao diện được neo cố
định trên góc trái phía trên màn hình, không thay đổi được.o LinearLayout: Layout được sử dụng phổ biến nhất. Các thành phần giao diện
được sắp xếp theo một chiều nhất định (ngang hoặc dọc).o RelativeLayout: Layout được sử dụng linh hoạt nhất. Các thành phần giao diện
được sắp xếp dựa vào vị trí của các thành phần giao diện khác hoặc chính giao diện layout gốc.
o TableLayout: Layout phân bố các thành phần giao diện theo dạng hàng hoặc cột như một bảng.
Khi thiết kế giao diện, người ta thường kết hợp nhiều layout với nhau để tạo ra giao diện như ý.
2. Phân biệt LinearLayout và RelativeLayouto LinearLayout:
Các thành phần giao diện (Control) được sắp xếp tuyến tính theo hàng dọc (Horizontal) hoặc hàng ngang (Vertical) với thuộc tính Orientation.
5
Các control được định nghĩa chiều rộng (width) hay chiều cao (height) bằng thiết lập:
android:layout_width=””android:layout_height=””
Trong dấu “”- Có thể là kích thước cứng nhập vào. VD: 125dp, 80dip…- Hoặc sử dụng các định nghĩa: fill_parent, match_parent, wrap_content.
Thuộc tính android:Gravity= “” có thể nhận giá trị: left, right, center để quy định vị trí của control trong layout cha.
Thuộc tính android:layout_weight= “” quy định không gian mà đối tượng chiếm giữ trong layout dựa vào “độ nặng” của nó.
o RelativeLayout: Các thành phần giao diện không sắp xếp theo hàng hay cột giống như
LinearLayout mà sẽ sắp xếp chồng lên nhau, đối tượng khai báo sau chồng lên đối tượng khai báo trước. RelativeLayout cho phép chúng ta thiết lập sắp xếp các đối tượng theo vị trí trong layout chứa chúng:
o android:layout_alignParentTop: các đối tượng con sẽ nằm ở Top của layout cha.
o android:layout_alignParentBottom: các đối tượng con sẽ nằm ở Bottom của layout cha.
o android:layout_alignParentLeft: các đối tượng con sẽ nằm ở Left của layout cha.
o android:layout_alignParentRight: các đối tượng con sẽ nằm ở Right của layout cha.
o android:layout_centerHorizontal: các đối tượng con sẽ nằm ở giữa theo chiều ngang của layout cha.
o android:layout_centerVertival: các đối tượng con sẽ nằm ở giữa theo chiều dọc của layout cha.
o android:layout_centerInParent: các đối tượng con sẽ nằm ở giữa theo cả chiều dọc và chiều ngang của layout cha.
Thiết lập sắp xếp trong RelativeLayout theo vị trí của các control con khác:o android:layout_below=”@id/”: xếp control phía dưới control có id
trong “”.o android:layout_toRightOf=”@id/”: xếp control bên phải control có id
trong “”.o android:layout_toLeftOf=”@id/”: xếp control bên trái control có id
trong “”.
3. Sử dụng FrameLayout
6
- Là loại Layout cơ bản nhất, đặc điểm của nó là khi gắn các control lên giao
diện thì các control này sẽ luôn được “Neo” ở góc trái trên cùng màn hình, nó
không cho phép chúng ta thay đổi vị trí của các control theo một Location nào
đó.
- Các control đưa vào sau nó sẽ đè lên trên và che khuất control trước đó (trừ khi
1. Khái niệm: Ứng dụng Android có thể bao gồm nhiều Activities hoạt động độc lập. Tuy nhiên để gắn kết các thành phần này thành 1 hệ thống có trao đổi dữ liệu và tương tác lẫn nhau, Android đưa ra khái niệm quan trọng, mấu chốt trong lập trình Android đó chính là Intent.
Android sử dụng Intents như là những thông điệp bất đồng bộ để cho phép các thành phần ứng dụng “nói chuyện” được với nhau: yêu cầu chức năng từ thành phần khác, cho phép tương tác với các thành phần riêng và các ứng dụng khác.
2. Các loại Intent trong lập trình android:
Explicit Intent: là loại Intent được khai báo 1 cách tường minh thành phần sẽ nhận và
xử lý Intent bằng cách thiết lập giá trị phù hợp qua setComponent (Componentname)
hoặc setClass (Context, Class). Explicit Intent thường được sử dụng để khởi chạy các
Implicit Intent: là loại Intent không cần chỉ rõ component xử lý mà chỉ cần cung cấp đủ các thông tin cần thiết để hệ thống có thể tự xác định xem nên dùng các thành phần (component) có sẵn nào để chạy là tốt nhất.Ví dụ :
Ví dụ: Khi các ứng dụng Android mở một trang web. Tất cả các trình duyệt web được cài đặt phải được đăng ký với các dữ liệu tương ứng với mục đính thông qua bộ lọc nhất định
Intent intent = new Intent(Intent.ACTION_VIEW,Uri.parse("http://itstudent.net"));
startActivity(intent);
Khi Android nhận được một Implicit Intent, nó sẽ tìm tất cả các thành phần đăng ký và dữ liệu phù hợp. Nếu hệ thống chỉ tìm thấy một component phù hợp thì Android sẽ bắt đầu chạy trực tiếp. Trong tình huống có nhiều component phù hợp, Android sẽ hiện thông báo để quyết định chọn thành phần sẽ chạy.
3. Intent Filter:
Activity, Service và BroadCast Receiver sử dụng Intent Filter để thông báo cho
hệ thống biết các dạng Implicit Intent mà nó có thể xử lý. Nói cách khác, Intent Filter là
bộ lọc Intent, chỉ cho những Intent được phép đi qua nó. Intent Filter mô tả khả năng của
component định nghĩa nó. Khi hệ thống bắt được 1 Implicit Intent (chỉ chứa 1 số thông tin
chung chung về action, data và category…), nó sẽ sử dụng những thông tin trong Intent
này, kiểm tra đối chiếu với Intent Filter của các component các ứng dụng, sau đó quyết
định khởi chạy ứng dụng nào thích hợp nhất để xử lý Intent bắt được. Nếu có 2 hay nhiều
hơn ứng dụng thích hợp, người dùng sẽ được lựa chọn ứng dụng mình muốn.
Trên là 1 Activity với bộ lọc Intent cho phép bắt và xử lý các Intent gửi SMS. Hãy lưu ý từ khóa: andoid:scheme.
Từ khóa này cho biết protocol (luật) để xử lý dữ liệu trong URI. Nói 1 cách đơn giản thì nó là kiểu của dữ liệu. 1 số kiểu khác như http, https, fpt, content…
10
Một số action thường sử dụng trong Intent:o ACTION_ANSWER - mở Activity để xử lý cuộc gọi tới, thường là Phone
Dialer của Android.o ACTION_CALL - mở 1 Phone Dialer (mặc định là PD của Android) và ngay
lập tức thực hiện cuộc gọi dựa vào thông tin trong data URI.o ACTION_DELETE - mở Activity cho phép xóa dữ liệu mà địa chỉ của nó
chứa trong data URI.o ACTION_DIAL - mở 1 Phone Dialer (mặc định là PD của Android) và điền
thông tin lấy từ địa chỉ chứa trong data URI.o ACTION_EDIT - mở 1 Activity cho phép chỉnh sửa dữ liệu mà địa chỉ lấy từ
data URI.o ACTION_SEND - mở 1 Activity cho phép gửi dữ liệu lấy từ data URI, kiểu
của dữ liệu xác định trong thuộc tính type.o ACTION_SENDTO - mở 1 Activity cho phép gửi thông điệp tới địa chỉ lấy từ
data URI.o ACTION_VIEW - action thông dụng nhất, khởi chạy activity thích hợp để
hiển thị dữ liệu trong data URI.o ACTION_MAIN - sử dụng để khởi chạy 1 Activity
11
IV. Service
1. Khái niệm:Service là một trong 4 thành phần chính của android. Service không có giao diện
chuyên dùng để thực hiện một nhiệm vụ nào đó được thực hiện ngầm dưới background mà không cần tương tác đến giao diện ví dụ như: chơi nhạc nền, download file, xử lý tính toán…
2. Vòng đời của service:
Note:
- Khi có một context nào đó gọi startService() để start service mong muốn. Nếu service đó chưa được tạo thì sẽ gọi onCreate() rồi gọi tiếp onStart() và khi đó service chạy nền bên dưới.
- Nếu sau đó lại có một context muốn start service này mà service đã đang chạy, chỉ có phương thức onStart() của service được gọi.
- Dù service có được gọi start bao nhiêu lần thì cũng chỉ có 1 instance của service và chỉ cần gọi stopService() một lần để kết thúc service.
3. Phân biệt Started Service và Bound Service:- Started Service: Sử dụng phương thức startService(), thường được xử dụng để thực
thi một hành động đơn và có thể không return lại kết quả (ví dụ như chơi nhạc)- Bound Service: Sử dụng phương thức bindService(): cung cấp một interface dạng
client-server cho phép apps có thể “conversation” (nói chuyện, tương tác) với service.
Bound Services đóng vai trò như một server trong mô hình client-server. Bound Services cho phép các thành phần của app (như activity) có thể liên kết với service để “send requests”, “receive responses” hoặc “Inter-Process Communication(IPC)”.
Bound Services chỉ tồn tại khi nó đang phục vụ một thành phần khác của app gọi đến nó mà không tồn tại dưới vô hạn dưới background
Có 3 cách để BindService từ các thành phần của app
- Sử dụng Ibinder class- Sử dụng Messenger class- Sử dụng AIDL
4. Cách implement một service- Đăng ký service trong Android manifest
Intent mIntent = new Intent(MainActivity.this, MyService.class);startService(mIntent);
- Stop service:Intent mIntent = new Intent(MainActivity.this, MyService.class);stopService(mIntent);
13
VD: Service chạy nhạc
public class MyService extends Service { // khai bao bien kieu MediaPlayer de quan ly file nhac MediaPlayer player; @Override public IBinder onBind(Intent intent) { Log.d("MyService", "onBind");
return null; } @Override public void onCreate() { Log.d("MyService", "onCreate");
// khoi tao bien player tu resplayer = MediaPlayer.create(this, R.raw.hoabanglang);player.setLooping(false);super.onCreate();
} @Override public void onStart(Intent intent, int startId) { Log.d("MyService", "onStart"); // chay file nhac
player.start();super.onStart(intent, startId);
}
@Override public void onDestroy() { Log.d("MyService", "onDestroy");
if (player.isPlaying()) {// neu dang choi nhac thi stop file nhacplayer.stop();
}super.onDestroy();
}}
14
V. Broadcast Receiver
1. Khái niệm:
Broadcast receiver là một thành phần android cơ bản nó cho phép ứng dụng của bạn đăng kí lắng nghe các sự kiện của hệ thống hoặc của các ứng dụng khác.
Các sự kiện (events) ở đây có thể là các sự kiện của hệ thống như Incoming Call, New SMS, Low Battery, Wifi ON/OFF, Screen lock/unlock, Time zone change… hoặc sự kiện do các ứng dụng thông thường tạo ra. Như vậy ngay ứng dụng của các bạn cũng có thể phát ra các sự kiện và broadcaster sẽ gửi nó đến các ứng dụng có trên thiết bị.
Các Action tiêu chuẩn mà Intent định nghĩa cho chương trình
2. LifecycleThực ra Broadcast Receiver chỉ có một phương thức duy nhất là onReceive().
Sau khi phương thức này được gọi thì vòng đời của Broadcast Receiver kết thúc tại đây. Ngay sau khi kết thúc phương thức onReceive() hệ thống coi như là Broadcast Receiver đã kết thúc và có thể killprocess của bạn đi bất cứ lúc nào.
3. Cách sử dụng BroadcastReceiver: Để ứng dụng của bạn nhận được các sự kiện từ broadcaster như trên thì bạn phải
biến ứng dụng của bạn thành một receiver. Có 2 cách để đăng kí một ứng dụng trở thành receiver:
- Đăng ký Broadcast Receiver qua code java: registerReceiver(BroadcastReceiver, IntentFilter)
- Đăng ký Broadcast Receiver qua android manifest, sử dụng tag <receiver>- Hủy đăng ký Broadcast Receiver: unregisterReceiver(BroadcastReceiver)
Lưu ý: Không thể gọi hàm bất đồng bộ bên trong onReceive vì hàm này sẽ không có điểm
quay về khi receiver không còn tồn tại. Không nên show dialog mà nên dùng Notification bên trong onReceive. Không nên bind service mà nên dùng startService bên trong onReceive. BroadcastReciver phải kết thúc việc thực thi trong 10 giây nếu không thì nó sẽ trigger
ANR exception.
VD: Đăng ký Broadcast Receiver:
Khai báo:
BroadcastReceiver mReceiver = new BroadcastReceiver() {
listReport.add(report);} while (cursor.moveToNext());
}}
} finally {if (cursor != null)
cursor.close();}return listReport;
25
IX. Storages
Các cách lưu trữ tập tin trong androidVề thuần túy, lưu trữ tập tin trong android cũng giống như trong java, tuy nhiên có một số khác biệt:
Lưu trữ trong Internal Storage: tập tin có dung lượng nhỏ. Các tập tin icon, ảnh, nhạc… được gọi là resource file.VD: tạo 1 file (myfile.txt) và để trong thư mục drawable (tên file phải không có khoảng trắng, không sử dụng chữ viết hoa, không đặt chữ số đằng trước). o Cách đọc file:
InputStream in = getResources().openRawResource(R.drawable.myfile);Khi có InputStream thì cách xử lý sẽ giống với java.
o Cách ghi file:FileOutputStream out = openFileOutput(“myfile.txt”,0);
Lưu trữ trong External Storage: thường là lưu trữ tập tin lớn như hình ảnh, video được tạo ra từ ứng dụng.
o Để thao tác được trên External Storage (bộ nhớ ngoài, SDCard) thì phải sử dụng 2 Permission trong Android Manifest:
Lưu trữ bằng Cache Files: Bộ nhớ tạm dùng để tăng tốc xử lý của ứng dụng. Ví dụ như ứng dụng duyệt web hay load bản đồ…
o Khi sử dụng, cache file được lưu trong thư mục: /data/data/app/cacheo Khi lưu cache, android thường chỉ cho tối đa file cache là 1MB, khi xóa
bỏ ứng dụng thì nó cũng tự động xóa.o Lấy đường dẫn thư mục Cache của ứng dụng, dùng lệnh: getCacheDir() .o Thao tác với Cache như thao tác với file trong java thuẩn túy.
Lưu trữ bằng SharedPreferences: thường được sử dụng để lưu trữ setting, cài đặt của ứng dụng.
26
Ví dụ cách làm việc với SharedPreferenceso Cách ghi dữ liệu:
- Bước 1:
Gọi hàm getSharedPreferences, hàm này trả về SharedPreferences và
nó có 2 đối. Đối số 1 là tên tập tin để lưu trạng thái, đối số 2 là kiểu lưu. Chú ý
là đối số 1 ta chỉ ghi tên tập tin (không cần ghi phần mở rộng, vì phần mở rộng
mặc nhiên của nó là .xml khi ta lưu thành công), đối số 2 thường ta để là
Intent shareIntent = new Intent();shareIntent.setAction(Intent.ACTION_SEND);shareIntent.putExtra(Intent.EXTRA_STREAM, uriToImage);shareIntent.setType("image/jpeg");startActivity(Intent.createChooser(shareIntent, "This is my image to send."));
33
Videoo Để play video trên android, ta sẽ dùng VideoView.