các kiến thức cơ bản về lập trình android.docx

52
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

Upload: ba-vuvan

Post on 26-Dec-2015

108 views

Category:

Documents


7 download

TRANSCRIPT

Page 1: Các kiến thức cơ bản về lập trình android.docx

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

X. Networking...........................................................................................................................................................30

XI. Multimedia.......................................................................................................................................................31

Page 2: Các kiến thức cơ bản về lập trình android.docx

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

Page 3: Các kiến thức cơ bản về lập trình android.docx

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

Page 4: Các kiến thức cơ bản về lập trình android.docx

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

Page 5: Các kiến thức cơ bản về lập trình android.docx

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

Page 6: Các kiến thức cơ bản về lập trình android.docx

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

Page 7: Các kiến thức cơ bản về lập trình android.docx

- 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

ta thiết lập transparent cho control sau)

- Bạn xem đoạn cấu trúc XML dưới này:

<?xml version=”1.0″ encoding=”utf-8″?>

<FrameLayout 

android:id=”@+id/mainlayout”

android:layout_height=”fill_parent”

android:layout_width=”fill_parent”

android:orientation=”vertical”

xmlns:android=”http://schemas.android.com/apk/res/android”&gt;

<ImageView 

android:layout_height=”wrap_content”

android:layout_width=”wrap_content”

android:padding=”5px”

android:src=”@drawable/blue“/>

<ImageView 

android:layout_height=”wrap_content”

android:layout_width=”wrap_content”

android:padding=”5px”

android:src=”@drawable/red“/>

</FrameLayout>

- Bạn thấy đó, hình màu đỏ và

màu xanh luôn được “neo” ở

góc trái màn hình. Hình màu đỏ

đưa vào sau sẽ đè lên trên hình

màu xanh.

7

Page 8: Các kiến thức cơ bản về lập trình android.docx

III. Intent

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

activity trong cùng 1 ứng dụng.

Ví dụ:

Intent i = new Intent(this, ActivityTwo.class);

i.putExtra("so1", "Đây là số một ");

i.putExtra("so2", "Đây là số hai");

startActivity(i);

8

Page 9: Các kiến thức cơ bản về lập trình android.docx

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.

VD:Mã:<activity android:name=”.ExampleActivity”

android:label=”@string/activity_name”>

<intent-filter>

<action

android:name=”android.intent.action.SENDTO” />

9

Page 10: Các kiến thức cơ bản về lập trình android.docx

<category

android:name=”android.intent.category.DEFAULT” />

<data android:scheme=”sms” />

</intent-filter>

</activity>

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

Page 11: Các kiến thức cơ bản về lập trình android.docx

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

Page 12: Các kiến thức cơ bản về lập trình android.docx

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.

12

Page 13: Các kiến thức cơ bản về lập trình android.docx

- 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

<service android:name=".MyService"></service>- Start service:

Intent mIntent = new Intent(MainActivity.this, MyService.class);startService(mIntent);

- Stop service:Intent mIntent = new Intent(MainActivity.this, MyService.class);stopService(mIntent);

13

Page 14: Các kiến thức cơ bản về lập trình android.docx

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

Page 15: Các kiến thức cơ bản về lập trình android.docx

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

ACTION_TIME_TICK                    ACTION_TIME_CHANGED ACTION_TIMEZONE_CHANGED ACTION_BOOT_COMPLETED        ACTION_PACKAGE_ADDED           ACTION_PACKAGE_CHANGED    ACTION_PACKAGE_REMOVED ACTION_PACKAGE_RESTARTED ACTION_PACKAGE_DATA_CLEARED ACTION_UID_REMOVED ACTION_BATTERY_CHANGED ACTION_POWER_CONNECTED ACTION_POWER_DISCONNECTED ACTION_SHUTDOWN

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.

15

Page 16: Các kiến thức cơ bản về lập trình android.docx

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() {

@Overridepublic void onReceive(Context context, Intent intent) {

if (intent.getAction().equalsIgnoreCase(“intent_key”) {//DO SOMETHING

}}

}; Đăng ký bằng code java (Sử dụng với các intent tự định nghĩa):

IntentFilter intentFilter = new IntentFilter();intentFilter.addAction(“intent_key”);

mContext.registerReceiver(mReceiver, intentFilter);

Đăng ký qua Android Manifest (Sử dụng với các intent android gốc hỗ trợ):

<receiver android:name=".BootReceiver"> <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED" /> </intent-filter>

</receiver> Sử dụng:

Intent intent = new Intent(“intent_key”); mContext.sendBroadcast(intent);

16

Page 17: Các kiến thức cơ bản về lập trình android.docx

VI. MultiThreading & Background work

Với java ta biết tới đa tiến trình với Thread, nhưng sử dụng thread trong android thì

chúng ta chỉ có thể chạy các tiến trình ngầm và không thao tác được với giao diện. Vì

thế android đã hỗ trợ sử dụng đa tiến trình với Handler class và AsyncTask class. Vì

khả năng sử dụng của AsyncTask mạnh mẽ hơn, và được sử dụng phổ biến hơn nên ở

đây ta chỉ đề cập đến cách sử dụng AsyncTask. Handler có thể tự tìm hiểu trên mạng.

Cách sử dụng AsyncTask

- Trong AsyncTask<Params, Progress, Result>  có 3 đối số là các Generic Type:

o Params: Là giá trị (biến) được truyền vào khi gọi thực thi tiến trình và nó sẽ

được truyền vào doInBackground.

o Progress: Là  giá trị (biến) dùng để update giao diện diện lúc tiến trình thực thi,

biến này sẽ được truyền vào hàm onProgressUpdate.

o Result: Là biến dùng để lưu trữ kết quả trả về sau khi tiến trình thực hiện xong

và được truyền vào hàm onPostExecute.

- Những đối số nào không sử dụng trong quá trình thực thi tiến trình thì ta thay

bằng Void.

- Kết quả trong khi xử lý ở hàm doInBackground có thể truyền qua hàm

onProgressUpdate để cập nhật lên giao diện bằng hàm publishProgress(Progress)

Thông thường trong 1 AsyncTask sẽ chứa 4 hàm, đó là :

- onPreExecute() : Tự động được gọi đầu tiên khi tiến trình được kích hoạt.

- doInBackground(): Được thực thi trong quá trình tiến trình chạy nền, thông qua

hàm này để ta gọi hàm onProgressUpdate để cập nhật giao diện (gọi

lệnh publishProgress). Ta không thể cập nhật giao diện trong

hàm doInBackground().

- onProgressUpdate (): Dùng để cập nhật giao diện lúc runtime

- onPostExecute(): Sau khi tiến trình kết thúc thì hàm này sẽ tự động sảy ra. Ta có

thể lấy được kết quả trả về sau khi thực hiện tiến trình kết thúc ở đây.

Trong 4 hàm trên thì hàm doInBackground() bắt buộc phải tồn tại, còn các hàm khác

có thể khuyết, nhưng nên sử dụng đầy đủ 4 hàm đã nêu.

17

Page 18: Các kiến thức cơ bản về lập trình android.docx

VD: Hãy để ý các mũi tên.

18

Page 19: Các kiến thức cơ bản về lập trình android.docx

Cách chạy: Tiến trình sẽ được khởi chạy khi ta gọi phương thức execute()

MyAsyncTask mTask = new MyAsyncTask(); Để chạy AsyncTask cho Android level 10- thì ta gọi

mTask.execute(params_if_need); Để chạy AsyncTask cho Android level 10+ thì ta gọi

mTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, params_if_need);

19

Page 20: Các kiến thức cơ bản về lập trình android.docx

VII. Content Providers

Định nghĩa: Một Content Provider cung cấp một tập chi tiết dữ liệu ứng dụng đến

các ứng dụng khác. Thường được sử dụng khi chúng ta muốn tạo cơ sở dữ liệu

dưới dạng public (các ứng dụng khác có thể truy xuất ). Dữ liệu thường được lưu

trữ ở file hệ thống, hoặc trong một SQLite database.

o Đơn giản để các bạn có thể hình dung như : Danh bạ, Call log, cấu hình cài

đặt...trên điện thoại là dữ liệu dưới dạng Content Provider.

Cách sử dụng:

- Ta có cú pháp tổng quát:

 <standard_prefix>://<authority>/<data_path>/<id>

- Ví dụ để lấy tất cả các bookmark trong trình duyệt ta dùng cú pháp:

content://browser/bookmarks

- Để lấy toàn bộ danh bạ trong điện thoại ta dùng cú pháp:

content://contacts/people

- Để lấy 1 contact theo 1 định danh nào đó:

content://contacts/people/3

- Để lấy các kết quả trả về ta cũng dùng Cursor để quản lý.

Có 2 cách sử dụng hàm lấy kết quả ở đây:

Cách 1:

CursorLoader  loader=new  CursorLoader(context, uri, null, null, null, null);

Cursor c=loader.loadInBackground();

Cách 2:

Cursor c = getContentResolver()  .query(uri, null, null, null, null);

20

Page 21: Các kiến thức cơ bản về lập trình android.docx

VD:

- Lấy call log: Trả về cursor chứa dữ liệu call log .

String[] projection = new String[] { Calls.DATE, Calls.NUMBER,Calls.DURATION };

Cursor c = getContentResolver().query(CallLog.Calls.CONTENT_URI,projection, Calls.DURATION + "<?", new String[] { "30" },Calls.DATE + " Asc");

- Lấy message: Sử dụng CursorLoader

Uri uri = Uri.parse("content://sms");CursorLoader loader = new CursorLoader(this, uri, null, null,

null,null);Cursor c = loader.loadInBackground();

- Lấy contact: Sử dụng getContentResolver

Uri uri = Uri.parse("content://contacts/people");Cursor c = getContentResolver().query(uri, null, null, null, null);

- Lấy thông tin cấu hình thiết bị: Sử dụng CursorLoader

Uri uri = Settings.System.CONTENT_URI;CursorLoader loader = new CursorLoader(this, uri, null, null, null,

null);Cursor c = loader.loadInBackground();

Chú ý: Ngoài ra, ta có thể tự tạo và sử dụng 1 Content Provider riêng do mình định nghĩa (Không trình bày ở đây). Có thể tham khảo tại đây.

21

Page 22: Các kiến thức cơ bản về lập trình android.docx

VIII. SQLite

Định nghĩa:

Mỗi ứng dụng đều sử dụng dữ liệu, dữ liệu có thể rất đơn giản hay đôi khi là cả

1 cấu trúc. Trong Android thì hệ cơ sở dữ liệu được sử dụng là SQLite Database, đây

là hệ thống mã nguồn mở được sử dụng rộng rãi trong các ứng dụng...

Trong Android, cơ sở dữ liệu mà bạn tạo cho 1 ứng dụng thì chỉ ứng dụng đó

có quyền truy cập và sử dụng, còn các ứng dụng khác thì không được phép.

Cách sử dụng:

- Chúng ta tạo một class extends từ SQLiteOpenHelper để tạo db, tạo bảng. VD

ở đây ta có database tên là “report.db” có 1 bảng là bảng “reports”. Bảng

reports có các trường: report_id (integer), report_name (text), date (long),

content (text).

- Cách tạo bảng:

public class DatabaseHelper extends SQLiteOpenHelper {

private static final String DATABASE_NAME = "report.db";private static final int DATABASE_VERSION = 1;

public DatabaseHelper(Context context) {super(context, DATABASE_NAME, null, DATABASE_VERSION);

}

@Overridepublic void onCreate(SQLiteDatabase db) {

//Create tabledb.execSQL("CREATE TABLE reports (report_id INTEGER PRIMARY KEY AUTOINCREMENT, report_name TEXT, date LONG, content TEXT)");

}

@Overridepublic void onUpgrade(SQLiteDatabase db, int oldVersion, int

newVersion) {db.execSQL("DROP TABLE IF EXISTS reports");onCreate(db);

}

}

22

Page 23: Các kiến thức cơ bản về lập trình android.docx

- Cách mở csdl: //sửL dụng đểL đọc dữ liệu từ dbprivate SQLiteDatabase rdb = dbHelper.getReadableDatabase();//sửL dụng đểL ghi dữ liệu vào dbprivate SQLiteDatabase wdb = dbHelper.getWritableDatabase();

- Cách đóng csdl, sau khi sử dụng xong phải close db lại.

rdb.close();wdb.close();

- Insert dữ liệu vào bảng:public long insert (String table, String nullColumnHack, ContentValues

values);

o table: Tên bảng cần insert

o nullColumnHack: sqlite không cho phép insert một values có trường là

rỗng vào. Nếu ta set nullColumnHack là null thì mặc định nếu có một

trường là rỗng thì sẽ insert vào database với giá trị bằng “null”.

o values: ContentValues chứa giá trị của row cần insert vào. Chúng ta

thực hiện put giá trị vào values như ví dụ dưới.

o Hàm insert return giá trị là long: ID của row vừa insert vào. Trả về -1

nếu lỗi không insert được.

VD:

ContentValues values = new ContentValues();values.put(“report_id”, id);values.put(“report_name”, name);values.put(“date”, date);values.put(“content”, content);wdb.insert(“reports”, null, values);

23

Page 24: Các kiến thức cơ bản về lập trình android.docx

- Update dữ liệu vào bảng:

public int update (String table, ContentValues values, String whereClause,

String[] whereArgs)

o table: Tên bảng cần insert.

o values: ContentValues chứa giá trị của row cần update, put giá trị giống

insert.

o whereClause: Điều kiện WHERE để insert vào db. Nếu set là null thì sẽ

update vào tất cả các rows

o whereArgs: Nếu trong whereClause chúng ta sử dụng “?s” thì ở

whereArgs này sẽ chứa giá trị dạng String được truyền vào.

o Hàm update return giá trị là int: số rows “bị ảnh hưởng” (có trường

được cập nhật vào).

VD:

ContentValues values = new ContentValues();values.put(“report_name”, name);values.put(“date”, date);values.put(“content”, content);wdb.update(“reports”, values “report_id” + "=" + id, null);

- Delete 1 trường dữ liệu:

public int delete (String table, String whereClause, String[] whereArgs)

o table: Tên bảng có dữ liệu cần xóa.

o whereClause: Điều kiện WHERE để delete row. Nếu set là null thì sẽ

xóa hết tất cả các row.

o whereArgs: Nếu trong whereClause chúng ta sử dụng “?s” thì ở

whereArgs này sẽ chứa giá trị dạng String được truyền vào.

VD:

Delete row có report_id bằng id:

wdb.delete(“reports”, “report_id” + "=" + id, null);

Delete tất cả dữ liệu của bảng:

24

Page 25: Các kiến thức cơ bản về lập trình android.docx

wdb.delete(“reports”, null, null);

- Lấy dữ liệu từ bảng ra (Phần này phức tạp nhất):

public Cursor rawQuery (String sql, String[] selectionArgs)

o sql: Câu lệnh sql cần để select.

o selectionArgs: nếu trong câu lệnh sql có sử dụng “?s” thì giá trị sẽ được

truyền vào qua mảng String này.

o Hàm rawQuery return lại một Cursor: kiểu mảng con trỏ này chứa

dữ liệu đã query. Ta sẽ lấy dữ liệu qua cursor này.

VD:

ArrayList<Report> listReport = new ArrayList<Report>();String sql = "SELECT * FROM " + TABLE_NAME";Cursor cursor = null;try {

cursor = rdb.rawQuery(sql, null);if (cursor != null && cursor.getCount() > 0) {

if (cursor.moveToFirst()) {do {

Report report = new Report();report.setReport_id(cursor.getInt(cursor

.getColumnIndex(REPORT_ID)));report.setName(cursor.getString(cursor

.getColumnIndex(REPORT_NAME)));report.setDate(cursor.getLong(cursor

.getColumnIndex(DATE)));report.setContent(cursor.getString(cursor

.getColumnIndex(CONTENT)));

listReport.add(report);} while (cursor.moveToNext());

}}

} finally {if (cursor != null)

cursor.close();}return listReport;

25

Page 26: Các kiến thức cơ bản về lập trình android.docx

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:

<uses-permission android:name=”android.permission.WRITE_EXTERNAL_STORAGE” />

<uses-permission android:name=”android.permission.READ_EXTERNAL_STORAGE” />

o Lấy đường dẫn của SDCard:

String sdcard=Environment.getExternalStorageDirectory().getAbsolutePath();

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

Page 27: Các kiến thức cơ bản về lập trình android.docx

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à

MODE_PRIVATE:

SharedPreferences pre=getSharedPreferences(“my_data“,

MODE_PRIVATE);

- Bước 2:

Tạo đổi tượng Editor để cho phép chỉnh sửa dữ liệu:

SharedPreferences.Editor edit=pre.edit();

- Bước 3:

Đưa dữ liệu muốn lưu trữ vào edit bằng các phương thức

edit.putXXX(“key”,”value”);

Tùy vào kiểu dữ liệu ta muốn lưu trữ mà XXX được thay thế bởi các

kiểu dữ liệu phù hợp:

editor.putString(“user”, “write somthing”);

editor.putBoolean(“checked”, true);

editor.putInt(“id”, 12);

editor.putObject(“object”, new Object());

- Bước 4:

Lưu trạng thái bằng cách gọi dòng lệnh: editor.commit();

27

Page 28: Các kiến thức cơ bản về lập trình android.docx

o Cách đọc dữ liệu đã lưu:

- Bước 1:

Gọi hàm getSharedPreferences để trả về đối tượng SharedPreferences

SharedPreferences pre=getSharedPreferences (“my_data“,MODE_PRIVATE);

- Bước 2:

Gọi các phương thức getXXX(“key”,giá trị mặc định) để lấy các giá trị

lúc trước được lưu

boolean isChecked=pre.getBoolean(“checked”, false);

// Đối số 2 là giá trị mặc định khi nó không tìm thấy key = “checked”

trả về false.

String user=pre.getString(“user”, “”);

// Đối số 2 là giá trị mặc định khi nó không tìm thấy key = “user” trả

về “”.

Các kiểu dữ liệu khác tương tự.

Cách truy xuất file trong Resource

o Ngoài việc viết mã code cho ứng dụng, chúng ta cũng cần phải quan tâm đến

các resource giống như là nội dung tĩnh mà code sử dụng. Chẳng hạn

bitmaps, colors, layout, strings… Các resource được lưu trong các thư mục

con khác nhau và thuộc thư mục res/

o Chi tiết các thư mục resource được hỗ trợ bên trong thư mục res/

anim/: Chứa các file xml định nghĩa hiệu ứng, được truy xuất từ class

R.anim.

color/: Chứa các file xml định nghĩa màu sắc, được truy xuất từ class

R.color.

drawable/: Chứa các file hình ảnh .jpg, .png, .gif hoặc các file xml

được phiên dịch thành bitmap. Được truy xuất từ class R.drawable.

28

Page 29: Các kiến thức cơ bản về lập trình android.docx

layout/: Chứa các file xml định nghĩa giao diện người dùng. Được truy

xuất từ class R.layout.

menu/: Chứa các file xml định nghĩa menu của ứng dụng, có thể là

Options Menu, Context Menu… Được truy xuất từ class R.menu.

raw/: Chứa các file bất kỳ. Để mở file này, phải gọi

Resource.openRawResource() với resourceID là R.raw.fileName để

mở file raw.

values/: Chứa các file xml để lưu các giá trị đơn giản như string,

integers, colors…

arrays.xml: Định nghĩa các mảng dữ liệu, truy xuất từ R.array.

integers.xml: Định nghĩa các số integer, truy xuất từ R.integer.

bools.xml: Định nghĩa kiểu dữ liệu bool, truy xuất từ R.bool.

colors.xml: Định nghĩa các giá trị color, truy xuất từ R.color.

dimens.xml: Định nghĩa các giá trị về kích thước, chiều. Truy

xuất từ R.dimen.

strings.xml: Định nghĩa các string, truy xuất từ R.string.

styles.xml: Định nghĩa các style, truy xuất từ R.style.

xml/: Chứa các file xml bất kỳ, để đọc file này, ta gọi hàm

Resources.getXML(). Có thể lưu cấu hình ứng dụng ở đây là sẽ được

dùng khi ứng dụng chạy.

o Các resource thay thế: Ứng dụng nên hỗ trợ các resource thay thế để có thể hỗ

trợ tốt hơn trên các thiết bị khác nhau.

VD: Thư mục drawable có các đuôi cấu hình riêng biệt để nhận biết cho kích

cỡ, độ phân giải màn hình nào.

29

Page 30: Các kiến thức cơ bản về lập trình android.docx

X. Networking

Network trong android

- Để có thể truy cập mạng, ứng dụng cần có quyền sau trong AndroidManifest.

<uses-permission android:name="android.permission.INTERNET" />

- Để biết thông tin về mạng, ví dụ như có kết nối mạng không, đang sử dụng wifi

hay mobile data… cần phải có quyền

<uses-permission

android:name="android.permission.ACCESS_NETWORK_STATE" />

- Kiểm tra kết nối mạng:

ConnectivityManager connMgr = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);

NetworkInfo networkInfo = connMgr.getActiveNetworkInfo();if (networkInfo != null && networkInfo.isConnected()) {

// fetch data} else {

// display error}

Sử dụng HTTPClient trong android

- Tạo một đối tượng HTTP Client và HTTP Post, đây là 2 đối tượng dùng để kết nối

và tải dữ liệu về:

HttpClient httpClient = new DefaultHttpClient();HttpPost httpPost = new HttpPost(url);

- Ta lưu dữ liệu cần request vào 1 list:

List<NameValuePair> nameValuePair = new ArrayList<NameValuePair>();nameValuePair.add(new BasicNameValuePair("email",

"[email protected]"));nameValuePair.add(new BasicNameValuePair("message", "Hello world"));

- Trước khi gửi dữ liệu đi qua kết nối http, ta phải mã hóa và chuyển nó thành chuỗi

phù hợp với định dạng URL cần gửi lên server:

httpPost.setEntity(new UrlEncodedFormEntity(nameValuePair));

- Cuối cùng, ta thực thi httpPost sử dụng httpClient:

HttpResponse response = httpClient.execute(httpPost);

30

Page 31: Các kiến thức cơ bản về lập trình android.docx

Log.d("Http response: ", response.toString()); //In response ra log

XI. Multimedia

Camerao Gọi Intent

- Gọi Intent để mở camera chụp hình: MediaStore.ACTION_IMAGE_CAPTURE

Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, uri);startActivityForResult(cameraIntent, key);

Ảnh sau khi chụp được trả về kiểu uri.

- Gọi Intent để chọn ảnh có sẵn trong gallery: Intent.ACTION_GET_CONTENT

Intent intent = new Intent();intent.setType("image/*");intent.setAction(Intent.ACTION_GET_CONTENT);startActivityForResult(intent, key);

Ảnh được chọn sẽ trả về kiểu Uri trong intent.getData();- Gọi Intent để cho phép Crop ảnh com.android.camera.action.CROP

Intent cropIntent = new Intent("com.android.camera.action.CROP");//thiểZt lập uri aLnh cầ]n cropcropIntent.setDataAndType(mOutputFileUri, "image/*");

//thiểZt lập cho phép cropcropIntent.putExtra("crop", "true");

//thiểZt lập tỉL lệ khung crop, ởL đầy là tỉL lệ 3:4cropIntent.putExtra("aspectX", 3);cropIntent.putExtra("aspectY", 4);

//thiểZt lập kích cỡ aLnh đầ]u ra, ởL đầy là 800x800 pxcropIntent.putExtra("outputX", "800");cropIntent.putExtra("outputY", "800");

//thiểZt lập cho phép traL vể] aLnh đã cropcropIntent.putExtra("return-data", true);startActivityForResult(cropIntent, key);

31

Page 32: Các kiến thức cơ bản về lập trình android.docx

“key” ở trên để nhận biết kết quả ở hàm onActivityResult sau khi intent chạy xong. Kết quả trả về uri của hình ảnh đã crop

@Overrideprotected void onActivityResult(int requestCode,

int resultCode, Intent data) {super.onActivityResult(requestCode, resultCode, data);if (resultCode == RESULT_OK) {

switch (requestCode) {case key:

uri = data.getData();break;

default:break;

}}

}

o Tự xây dựng ứng dụng CameraSử dụng surfaceView.

<SurfaceView android:id="@+id/surfaceViewCam" android:layout_width="match_parent"

android:layout_height="match_parent" />

Code java:- Ta phải implements: implements SurfaceHolder.Callback- Init trong onCreate() của Activity:

SurfaceView surfaceView = (SurfaceView) findViewById(R.id.surfaceViewCam);

SurfaceHolder holder = surfaceView.getHolder();holder.addCallback(this);holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

- Override phương thức:

@Overridepublic void surfaceCreated(SurfaceHolder arg0) {

try {camera = Camera.open();camera.setDisplayOrientation(90);camera.setPreviewDisplay(holder);camera.startPreview();camera.startFaceDetection();

} catch (IOException e) {Log.d("CAMERA", e.getMessage());

}}

32

Page 33: Các kiến thức cơ bản về lập trình android.docx

Image- Cách chia sẻ hình ảnh.

Sử dụng Intent.ACTION_SENDVD: share một đoạn text

Intent sendIntent = new Intent();sendIntent.setAction(Intent.ACTION_SEND);sendIntent.putExtra(Intent.EXTRA_TEXT, "This is my text to

send.");sendIntent.setType("text/plain");startActivity(sendIntent);

Hoặc share một file ảnh

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

Page 34: Các kiến thức cơ bản về lập trình android.docx

Videoo Để play video trên android, ta sẽ dùng VideoView.

<VideoView android:id="@+id/videoview"

android:layout_width="fill_parent"android:layout_height="wrap_content" />

Code java:

VideoView mVideoView = (VideoView)findViewById(R.id.videoview);

String uriPath = "/sdcard/video.avi";

//thiểZt lập kích cỡ video View dựa trển kích cỡ màn hìnhDisplayMetrics dm = new DisplayMetrics();this.getWindowManager().getDefaultDisplay().getMetrics(dm);int height = dm.heightPixels;int width = dm.widthPixels;

mVideoView.setMinimumWidth(width);mVideoView.setMinimumHeight(height);

//thiểZt lập định dạng cho màn hình hiểLn thị getWindow().setFormat(PixelFormat.TRANSLUCENT);

//ThiểZt lập media control cho videoView mVideoView.setMediaController(new MediaController(this));

//ThiểZt lập uri video mVideoView.setVideoURI(Uri.parse(uriPath));

//hiểLn thị video view lển trển cùng mVideoView.requestFocus();

//chạy video mVideoView.start();

34

Page 35: Các kiến thức cơ bản về lập trình android.docx

Audioo Play audio

//set up MediaPlayerMediaPlayer mp = new MediaPlayer();

//set source audiotry {

mp.setDataSource("pathAudio");} catch (IllegalArgumentException e) {} catch (SecurityException e) {} catch (IllegalStateException e) {} catch (IOException e) {}//prepare before playingtry {

mp.prepare();} catch (IllegalStateException e) {} catch (IOException e) {}//playing audiomp.start();

o Pause audio

mp.pause();

o Stop audio

mp.stop();

35

Page 36: Các kiến thức cơ bản về lập trình android.docx

Tài liệu tham khảo

https://www.google.com.vn/

36