161
1 Lập trình Android Nguyen Ha Giang FIT – Hutech [email protected] 1

Lập trình android

Embed Size (px)

Citation preview

Page 1: Lập trình android

1

Lập trình Android

Nguyen Ha GiangFIT – [email protected]

1

Page 2: Lập trình android

2

Tổng quan hệ điều hành Android

Đặc điểm

Kiến trúc

Phiên bản

Lập trình trên môi trường Android

Môi trường lập trình

AVD

Quy trình phát triển ứng dụng Android.

Ứng dụng cơ bản Android

Tìm hiểu Android project

Các cách tiếp cận trong lập trình Android.

Nội dung

Page 3: Lập trình android

3

Android là hệ điều được thiết kế cho họ hệ thiết bị di động màn hình cảm ứng (touchscreen mobile devives) bao gồm

Smartphone

Tablet PCs

Phablet

Hệ điều hành mã nguồn mở

Google Android ?

Page 4: Lập trình android

4

Tập phần mềm dành cho thiết bị di động bao gồm

Một hệ điều hành

Midleware

Các ứng dụng cơ sở

Sử dụng Linux để cung cấp dịch vụ hệ thống lõi

Security

Memory management

Process management

Power management

Hardware drivers

Google Android ?

Page 5: Lập trình android

5

Application framework enabling reuse and replacement of components.

Optimized Java virtual machine (Dalvik virtual machine)

Optimized Graphics Processing, supporting 2D, 3D graphics (OpenGL ES 1.0)

Integrated open source web browser: Webkit

SQLite for structured data storage

Android Features #1

Page 6: Lập trình android

6

Multimedia capability, supporting varieties of audio, video and still image format.

GSM Telephony

Bluetooth, EDGE, 3G, and WiFi support

Camera, GPS, compass, accelerometer and other sensors support.

Rich development environment, including an enmulator, debugging tools, memory probe tools, log tools and powerful eclipse plugins.

Android Features #2

Page 7: Lập trình android

7

Android architechture

http://developer.android.com/guide/basics/what-is-android.html

Page 8: Lập trình android

8

Note that Android based on a Linux kernel not a Linux OS.

Supplies Security, memory management, process management, Network stack, and driver model.

Acts as an abstraction layer between the hardware and the rest of the software stack.

Linux Kernel

Page 9: Lập trình android

9

Run in system background

Using C/C++ Language

Four types of libraries

Bionic Libc, system C libraries

Function Libraries, supporting multimedia, web browser, SQLite…

Native servers

Hardware abstraction libraries

Libraries

Page 10: Lập trình android

10

System C library, the standard C system library, tuned for embedded Linux-based devices.

Media Libraries, support playback and recording of many popular audio/video formats, as well as image files, including MPEG4, H.264, MP3, AAC, AMR, JPG, and PNG

Surface Manager, manages access to the display subsystem and seamlessly composites 2D and 3D graphic layers from multiple apps.

WebKit, a morden web browser engine which powers both the Android browser and an embedded web view.

SGL, the underlying 2D graphics engine.

3D Libraries, an implementation based on OpenGL ES 1.0 APIs

FreeType, bitmap and vector font rendering

SQLite, a powerful and lightweight relational database engine.

Core Libraries

Page 11: Lập trình android

11

The core of Android platform

Dalvik Virtual Machine

Register-based

Exectutes files in the Dalvik format

Java core Libraries

Provides most of the functionality of the Java programming language.

Android Runtime

Page 12: Lập trình android

12

The functions of Java core libraries reply on the Dalvik VM and the underlying Linux kernel.

Multiple Dalvik VMs may run at the same time

Every Android application runs in its own process, with its own instance of the Dalvik virtual machine.

The “dx” tool in Android SDK can transform compiled JAVA class into the .dex format.

Android Runtime (cont.)

Page 13: Lập trình android

13

Android custom implementation virtual machine

Provides app portability and runtime consistency

Runs optimized file format (.dex) and Dalvik bytecode

Java .class/ jar files converted to .dex at build time

Designed for embedded environment

Supports multiple virtual machine processes per device

Highly CPU-optimized bytecode interpreter

Efficiently using runtime memory

Core libraries

Core APIs for Java language provide a powerful, yet simple and familiar development platform.

Dalvik Virtual Machine

Page 14: Lập trình android

14

DVM

Google

Dalvik executable

Only supports a subset of standard Java library

JVM

Sun

Java bytecode

Some worries that Java world may be divided into different communities, each has its own Java standard.

DVM vs. JVM

Page 15: Lập trình android

15

Vesion code và version name không giống nhau.

Mỗi version name (platform level) thì có duy nhất một version code (API level) đi kèm.

Android vesioning

Platform Codename API Level

Android 1.5 Cupcake 3

Android 1.6 Donut 4

Android 2.0

Eclair

5

Android 2.0.1 6

Android 2.1 7

Android 2.2 Froyo 8

Android 2.3 , Android 2.3.2Gingerbread

9

Android 2.3.3, Android 2.3.7 10

Android 3.0, 3.1,3.2 Honeycomb 11, 12, 13

Android 4.0.x Ice Cream Sandwich (Oct - 2011) 14,15

Android 4.1.x, 4.2.x, 4.3 Jelly Bean (July – 2012, July-2013) 16, 17, ???

Android 4.4 KitKat (Sep -2013) ???

Page 16: Lập trình android

16

Nguồn: Android developer, Sept 4, 2013

Version distribution

http://developer.android.com/resources/dashboard/platform-versions.html

2.4%

30.7%

0.1%

21.7%

36.6% (4.1.x)

8.5% (4.2.x)

Page 17: Lập trình android

17

Chuẩn bị môi trường trên PC

Cài đặt JDK http://www.oracle.com/technetwork/java/javase/downloads/index.html

Nếu dùng Eclipse để phát triển ứng dụng thì download một phiên bản Eclipsehttp://www.eclipse.org/downloads/

Download Android SDK Start package

http://developer.android.com/sdk/index.html

Cài đặt Android SDK và nhớ note lại thư mục để tham chiếu trong bước cài đặt Eclipse.

Installling Android SDK

Page 18: Lập trình android

18

Cài đặt ADT plugin cho Eclipse

Plugin này gọi là Android Development Tool, hỗ trợ công cụ để phát triển ứng dụng Android

Mở rộng Eclipse với chức năngTạo mới Android project

Tạo ứng dụng UI Android

Test ứng dụng trên emulator Android SDK

Debug ứng dụng dùng Android SDK Tool.

Nếu dùng IDE khác thì không cần cài Eclipse + ADT plugin!

Installling Android SDK

Page 19: Lập trình android

19

Cài đặt ADT plugin cho Eclipse: Install New Software

Installling Android SDK

Page 20: Lập trình android

20

Bước Install

Installling Android SDK

Page 21: Lập trình android

21

Add Site, có 2 lựa chọn

Nếu download file zip chứa ADT rồi thì chọn Archive browse đến file zip (vd: ADT-20.0.3.zip)

Nếu chưa download và muốn cài trực tiếp thì nhập URL sau vào location

https://dl-ssl.google.com/android/eclipse/

Cuối cùng chọn OK, để thực hiện install ADT

Sau khi cài xong ADT thì restart lại Eclipse!

Installling Android SDK

Page 22: Lập trình android

22

Configuring the ADT PluginBước này cài đặt ADT tham chiếu đến Android SDK mà ở bước trước đã download và install vào thư mục trên đĩa.

Chọn Window > Preferences trong Eclipse, trong SDK location, browse đến thư mục Android SDK

Installling Android SDK

Sau bước này hoàn tất việc

tạo môi trường để xây dựng Android

app

Page 23: Lập trình android

23

ADT bundle là bộ cài đặt nhanh, chứa tất cả môi trường cần thiết để phát triển UD Android. Bao gồm

Eclipse + ADT Plugin

Android SDK Tools

Android Platform-công cụ

Nền tảng Android mới nhất

Hệ thống hình ảnh giả lập cua nền tảng Android mới nhất

Installing Android dev by bundle

Page 24: Lập trình android

24

Installing Android dev by bundle

http://developer.android.com/sdk/index.html

Page 25: Lập trình android

25

Emulator là thành phần quan trọng để test ứng dụng nhưng không thể thay thế hoàn toàn thiết bị thật!

Emulator trên Android được gọi là Android Virtual Devices (AVDs)

Android SDK và AVD manager cho phép tạo các AVDs hướng tới bất kỳ phiên bản Android API.

AVD cho phép cấu hình:

Resolution

RAM

SD card

Skin

Hardware khác

Android Emulator & AVD

Page 26: Lập trình android

26

Android Emulator: 1.6 Device

Device 1.6

Page 27: Lập trình android

27

Android Emulator: 2.2 Device

Device 2.2

Page 28: Lập trình android

28

Android Emulator: 2.3.3 Device

Device 2.3.3

Page 29: Lập trình android

29

Android Emulator: 3.0 Device

Device 3.0

Page 30: Lập trình android

30

Android Emulator: 4.1 Device

Device 4.1

Page 31: Lập trình android

31

Sử dụng bàn phím của máy tính

Sử dụng pointer máy tính như "finger"

Sử dụng kết nối internet của máy tính

Các button: Home, Menu, Back, Search…

Ctrl + F11: landscape portrait

Alt + Enter: full screen mode

Emulator basic

Hãy bỏ ra ít thời gian để làm quen với Android Emulator!!!

Page 32: Lập trình android

32

Không hỗ trợ việc gọi và nhận thật sự cuộc gọi

Giả lập cuộc gọi và tin nhắn qua emulator console

Không hỗ trợ

USB connection

Camera/video (input)

Headphone

Battery charge level & AC charging state

Bluetooth

Emulation limitations

Test your app on an actual

device!

Page 33: Lập trình android

33

Mở chức năng Android SDK và AVD manager trong Eclipse

Setting up an Emulator

SDK/AVD Manager

Page 34: Lập trình android

34

Mở chức năng Android SDK và AVD manager trong Eclipse

Setting up an Emulator

Page 35: Lập trình android

35

Chọn New virtual device

Setting up an Emulator

Đặt tên

Chọn platform

Chọn SD card nếu cần

Chọn skin HVGA

Page 36: Lập trình android

36

Với project Android đang làm việc, chọn Run (Ctrl +F11), lúc này emulator đã thiết lập sẽ khởi động.

Lần đầu tiên thời gian khởi động emulator khá lâu (vài phút ) do phải tạo môi trường virtual Linux system.

Running the app in the emulator

Port number

AVD name

Page 37: Lập trình android

37

Để thuận tiện cho việc coding, build & run thì emulator khởi động một lần trong suốt quá trình làm việc.

Ta cứ việc code, build và run, khi đó emulator tự động cập nhật mã lệnh mới, không cần phải restart lại emulator!

Running the app: emulator

Run Emulator 1 lần cho suốt

phiên làm việc!

Page 38: Lập trình android

38

Always with the user

Typically have Internet access

Typically GPS enabled

Typically have accelerometer & compass

Many have cameras & microphones

Many apps are free or low-cost

Mobile Devices: Advantages

Page 39: Lập trình android

39

Mobile Devices: Disadv

Limited screen size

Limited battery life

Limited processor speed

Limited and sometimes slow network access

Limited or awkward input: soft keyboard, phone keypad, touch

screen, or stylus

Limited web browser functionality

Range of platforms & configurations across devices

Page 40: Lập trình android

40

Được xây dựng trên Java và SDK mới

Không support một số thư viện Java như Swing & AWT

Oracle đang kiện Google vi phạm bản quyền!

Java code được biên dịch vào Dalvik byte code (.dex)

Được tối ưu cho thiết bị di động (memory, battery…)

Dalvik VM chạy những file .dex

Android Apps

Mã Java được biên dịch

sang Dalvik byte code!

Page 41: Lập trình android

41

Producing an Android App

Dalvik exe

Byte code <xml>

<str>

.java .class

Other .class files

javac

dx

classes.dex

AndroidManifest.xml

Resources

.apk

aapt

Java code

Byte code

Page 42: Lập trình android

42

Trong Eclipse chọn Alt +Shift + N.

First Android Application

Page 43: Lập trình android

43

New Android Project

Chọn tên project, build target (platform) và package name

First Android Application

Package name: ký tự đầu tiên phải chữ thường, phải có dấu chấm (2 định danh)

Tên project

platform

Scroll down để thấy phần package name

Page 44: Lập trình android

44

Toàn bộ Adroid project được khởi tạo từ Eclipse

First Android Application

Chọn Package Explorer để xem cấu trúc của ứng dụng

Code Java

Chứa resource

File cấu hình app

Page 45: Lập trình android

45

First Android Application

Page 46: Lập trình android

46

src/NguyenhagiangActivity.java

Activity của ứng dụng, hiển thị khi ứng dụng chạy

res/layout/main.xml

Định nghĩa layout & widgets cho activity

res/values/strings.xml

Khai báo hằng chuỗi dùng trong chương trình

gen/R.java (Don’t touch!)

File được tạo tự động các ID từ các file *.xml

AndroidManifest.xml

Khai báo tất cả thành phần của app (tất cả các activity).

Tên thư viện cần thiết được dùng trong ứng dụng

Xác định những permission mà ứng dụng được cấp.

Phiên bản, cấu hình…

Important Files

Page 47: Lập trình android

47

Activity là thành phần sẽ hiển thị khi chạy ứng dụng.

Do ứng dụng này đơn giản chỉ có 1 activity nên là activity chính của ứng dụng!

src/NguyenhagiangActivity.java

Page 48: Lập trình android

48

Khai báo layouts & widgets cho activity

res/layout/main.xml

Page 49: Lập trình android

49

Khai báo hằng chuỗi dùng trong app

Hỗ trợ Localization

res/values-es/values/strings.xml (Spanish)

res/values-fr/values/strings.xml (French)

res/values/string.xml

Nội dung chuỗiTên truy cập chuỗi

Page 50: Lập trình android

50

File được tự động khởi tạo với các định danh từ main.xml, string.xml và các phần khác.

gen/R.java

Không được chỉnh

sửa!

Page 51: Lập trình android

51

Khai báo tất cả các thành phần của app với system

Phiên bản: version code, version name

Application: icon, name, label…

Tham chiếu đến tên các thư viện mà app có sử dụng

Quy định các permission mà ứng dụng được phép.

AndroidManifest.xml

Page 52: Lập trình android

52

Thiết lập UI cho một activity

Create UI

public class HelloWorldActivity extends Activity {

/** Called when the activity is first created. */

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

// load nội dung cua layout từ file XML

setContentView(R.layout.main);

}

}

main.xml chứa trong thư mục res/layout

Page 53: Lập trình android

53

Tạo một nội dung trực tiếp từ code không dùng XML

Create UI

public class HelloWorldActivity extends Activity {

/** Called when the activity is first created. */

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

TextView tv = new TextView(this);

tv.setText("Hello, Android");

setContentView(tv);

}

}

Page 54: Lập trình android

54

Tạo button đáp ứng sự kiện click

Basic Event handler

public class HelloWorldActivity extends Activity {

/** Called when the activity is first created. */

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

Button btn = new Button(this);

btn.setText("Click me!");

setContentView(btn);

}

}

Page 55: Lập trình android

55

Khai báo listener để xử lý sự kiện click

Basic Event handler (2)

// thiết lập event click handlerbtn.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Toast.makeText( getApplicationContext(), "Hello World", Toast.LENGTH_LONG).show(); }});

Page 56: Lập trình android

56

Three Main Approaches forAndroid programming

Page 57: Lập trình android

57

Java-based

Sử dụng Java để định nghĩa String, layout window, tạo các GUI, gán event handler, giống như lập trình Swing

XML-based

Sử dụng file XML để định nghĩa String, layout window, tạo các GUI, gán event handler. Phương thức Java chỉ đọc layout từ file XML và truyền vào setContentView.

Hybrid

Sử dụng file XML định nghĩa String, layout window, và tạo GUI control. Sử dụng Java để gán event handler.

Three Main Approaches

Page 58: Lập trình android

58

Java-based approach

public class NguyenHaGiangActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); String message="Message 1"; LinearLayout window = new LinearLayout(this); TextView txt = new TextView(this); txt.setText(message); Button btn = new Button(this); btn.setText("Button Label"); btn.setOnClickListener(new SomeHandler()); window.addView(txt); window.addView(btn); setContentView(window); }// end onCreate … //(next page)

Code Java

Page 59: Lập trình android

59

Java-based approach

... //(previous page) private class SomeHandler implements OnClickListener{ @Override public void onClick(View clickedButton) { // doSomething();... Toast.makeText(getApplicationContext(), "Hello World",

Toast.LENGTH_LONG).show(); } // end onClick } // end class SomeHandler

} // end class NguyenHaGiangActivity

Code Java

Page 60: Lập trình android

60

XML-based approach

Java

XML

public class SomeClass extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); } public void handlerMethod(View clickedButton) { String someName = getResources().getString(R.string.name); doSomethingWith(someName); } }

res/values/strings.xml res/layout/main.xml

<?xml version="1.0" encoding="utf-8"?><resources> <string name="name">…</string> …</resource>

<?xml version="1.0" encoding="utf-8"?><LinearLayout …> <TextView …/> <Button …android:onClick="handlerMethod" /> …</LinearLayout>

Page 61: Lập trình android

61

Java

XML

Lấy control thông qua IDs

Không sử dụng android:onClick để gán handler

Hybrid approach

public class SomeClass extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); Button b = (Button)findViewById(R.id.button_id); b.setOnClickListener(new SomeHandler()); } private class SomeHandler implements OnClickListener { @Override public void onClick(View clickedButton) { doSomething(...); } } }

Page 62: Lập trình android

62

Java-based Layout

Page 63: Lập trình android

63

Approach

Sử dụng Java để định nghĩa chuỗi, layout window, tạo GUI control, gán trình xử lý sự kiện.

Avantages

Thân thiện với giới Java desktop developer. Giống cách tiếp cận để xây dựng Swing, SWT, và AWT.

Thuận tiện cho việc xây dựng layout động, tuỳ biến vào logic lập trình.

Disadvantages

Phần code và phần UI xen lẫn với nhau.

Chỉ thấy được giao diện khi chạy ứng dụng.

Main idea

Page 64: Lập trình android

64

Phần code trong onCreate

Code (Main Method)

String appName = "Demo Java-baed Application";String windowText = "Press the button";String buttonLabel = "Show Greeting";

LinearLayout mainWindow = new LinearLayout(this); mainWindow.setOrientation(LinearLayout.VERTICAL);

setTitle(appName);TextView label = new TextView(this);label.setText(windowText); mainWindow.addView(label);Button greetingButton = new Button(this);greetingButton.setText(buttonLabel);

greetingButton.setOnClickListener(new Toaster());mainWindow.addView(greetingButton);

setContentView(mainWindow);

Page 65: Lập trình android

65

Lớp thực thi interface onClickListener

Code (Main Method)

private class Toaster implements OnClickListener { @Override public void onClick(View clickedButton) { String greetingText = "Hello from Android!"; Toast t = Toast.makeText(getApplicationContext(), greetingText, Toast.LENGTH_LONG); t.show(); }}

Page 66: Lập trình android

66

Results on Emulator

Page 67: Lập trình android

67

XML-based Layout

Page 68: Lập trình android

68

Approach

Sử dụng file XML để định nghĩa chuỗi, layout window, tạo UI control và gán event handler

Định nghĩa layout và control in res/layout/main.xml

Định nghĩa các chuỗi trong res/values/strings.xml

Advantages

Dễ quản lý

Dùng visual layout editor của eclipse

Đây là cách tiếp cận được khuyến khích

Disaventages

Việc tạo layout động.

Main Idea

Page 69: Lập trình android

69

res/layout/main.xml

Định nghĩa layout và widget với mô tả XML<LinearLayout …> define widget </LinearLayout>

Tham chiếu đến chuỗi (strings.xml) với @string/string_name

Gán event handler với android:onClick

res/value/strings.xml

Định nghĩa chuỗi dùng trong GUI

Java code

Tham chiếu đến layout với R.layout.main

Tham chiếu đến chuỗi với getString(R.string.string_name)

Tham chiếu đến widget với findViewById(R.id.xyz_id)

More details

res/layout/main.xml

Page 70: Lập trình android

70

Project layout

Tham chiếu đến layout được định nghĩa trong res/layout/main.xml với R.layout.main

Định nghĩa giao diện và widget. Đôi khi có phần khai báo event handler.Tham chiếu đến string định nghĩa trong res/values/strings.xml với cú pháp @string/string_name

Định nghĩa chuỗi được dùng trong UI

Page 71: Lập trình android

71

Code (res/layout/main.xml)

Các thuộc tính orientation, layout_width… được định nghĩa trong JavaDoc API cho LinearLayout

Chuỗi được định nghĩa trong res/values/strings.xml

Phương thức này là public khai báo trong main class, giá trị trả về là void, có một tham số là View

Page 72: Lập trình android

72

Code (res/values/strings.xml)

Tên của ứng dụng

Các chuỗi được định nghĩa trong strings.xml được tham chiếu trong main.xml và java codemain.xml: @string/string_nameJava code: getString(R.string.string_name)

Page 73: Lập trình android

73

Java code

Tham chiếu đến main.xml

Tham chiếu đến chuỗi tên greeting_text được định nghĩa trong strings.xml

Page 74: Lập trình android

74

Hybrid Layout

Page 75: Lập trình android

75

Approach

Sử dụng XML để định nghĩa string, layout window, và UI widget

Sử dụng Java để gán event handler

Advantages

Tương tự như cách tiếp cận XML-based

Ngoài ra việc gán event handler từ code có thể dễ hiểu hơn, do event handler cũng là phần java code.

Disadvantages

Khó tạo layout động.

Main idea

Page 76: Lập trình android

76

Code (res/layout/main.xml)

Định nghĩa id cho button để button có thể được tham chiếu trong Java code với findViewById(R.id.greetind_button)

Không gán event handler ở đây, do ta sẽ làm trong java code!

Page 77: Lập trình android

77

Code (res/values/strings.xml)

File strings.xml tương tự như phần trước!

Page 78: Lập trình android

78

Code (java)

Phải thiết lập setContentView trước khi gọi findViewById, nếu

không sẽ nhận được null

Page 79: Lập trình android

79

Viết ứng dụng basic calculator cho phép tính các phép toán cơ bản {cộng,trừ, nhân, chia} theo các cách tiếp cận như sau:

Java based

XML based

Hybrid

Bài tập

Page 80: Lập trình android

80

Basic Layout

Organizing the Screen

Page 81: Lập trình android

81

LinearLayout

Cách thức tổ chức layout nhiều cấp

Sử dụng màu sắc

RelativeLayout

TableLayout

Contents

Page 82: Lập trình android

82

XML-based

Khai báo layout trong res/layouts/some_layout.xmlThiết lập thuộc tính XML

Sử dụng visual editor trong Eclipse

Load layout với setContentView(R.layout.some_layout)

Java-based

Tạo thể hiện layout, thiết lập thuộc tính, chèn sub-layoutLinearLayout window = new LinearLayout(this)

// thiết lập các thuộc tính cho window

window.addView(widgetOrLayout)

Load với phương thức setContentView(window)

Layout Strategies

Page 83: Lập trình android

83

Mỗi lớp Layout đều có lớp inner là LayoutParams định nghĩa tham số XML cho layout sử dụng.

Các tham số này có tên android:layout_xyz, thường dùng để định kích thước và canh lề.

VD:

<LinearLayoutandroid:layout_width = "match_parent"

android:layout_height= "wrap_content"

android:gravity = "center_horizontal"

android:background = "@color/color_1">

</LinearLayout>

XML Layout Attributes

Page 84: Lập trình android

84

Size

android:layout_width, android:layout_heightmatch_parent: fill the parent space (minus padding)

Phiên bản cũ là fill_parent

wrap_content: kích thước bao nội dung

android:layout_weight:Giá trị số cho biết tỷ lệ phân chia kích thước

Alignment

android:layout_gravityCho biết cách thức canh lề của view ở trong containing view

android:gravityCho biết cách thức text và thành phần bên trong view được canh lề.

Commonly Used Attributes

Page 85: Lập trình android

85

Alignment (tt)

Giá trị thường dùngTop, bottom, left, right, center_vertical, center_horizontal, center, fill_vertical, fill_horizontal, fill, clip_vertical, clip_horizontal.

Margin (blank space outside)

Android:layout_marginBottom, android:layout_marginTop, android:layout_marginLeft, android:layout_marginRight

Unitsdp: density-independent pixels (scaled by device resol.)

sp: scaled pixel (font size)

px: pixels, in: inches, mm: milimeters.

Commonly Used Attributes

Page 86: Lập trình android

86

Padding (blank space inside)

android:paddingBottom/Top/Left/Right

Giá trị là con số theo đơn vị unit bên trên

ID

android:idSử dụng khi java code cần tham chiếu đến view

Sử dụng trong RelativeLayout khi cần tham chiếu đến view nào đó để làm mốc.

Colors

android:background (color, image)

android:textColor

Giá trị thường dùng"#rrggbb", "#aarrggbb", "@color/color_name"

Commonly Used Attributes

Page 87: Lập trình android

87

Ý nghĩa

Cho phép đặt những thành phần theo 1 dòng hay 1 cột

Có thể lồng ghép để tạo thành những dòng với các cột.

Các thuộc tính XML quan trọng.

android:orientation"horizontal" (row) or "vertical" (column)

Horizontal là mặc định

android:gravityCách các view bên trong được canh lề

Basic LinearLayout

Page 88: Lập trình android

88

General Approach

Example (nested layout)

Page 89: Lập trình android

89

Example (nested layout)

Horizontal Linearlayout với gravity là left

Horizontal linearlayout với gravity là center_horizontal

Page 90: Lập trình android

90

Example (nested layout)

Horizontal LinearLayout

Chứa 2 layout Horizontal LinearLayoutLayout đầu tiên màu vàng có layout_width ="wrap_content" và gravity ="left" Layout thứ hai màu xanh có layout_width="match_parent"và gravity là "right"

Page 91: Lập trình android

91

Example (nested layout)

Horizontal LinearLayout

Chứa 3 vertical bên trong1. LinearLayout với orientation là

vertical và 4 button bên trong2. Chứa RadioGroup với orientation

là vertical và 4 RadioButton bên trong.

3. LinearLayout với orientation là vertical và 4 LinearLayout bên trong.

2 cột đầu có layout_width là wrap_content và cột thứ 3 là match_parent.

Page 92: Lập trình android

92

Example (nested layout)

Vertical LinearLayout

Layout này chứa 4 horizontal bên trong.1. Gravity là center_horizontal2. Gravity là left3. Gravity là right4. Chứa 2 horizontal LinearLayout

bên trong1. Layout_width là wrap_content

và gravity là left2. Layout_width là match_parent

và gravity là right

Page 93: Lập trình android

93

Example (nested layout)

Buttonandroid:layout_width="wrap_content"android:layout_gravity="center_horizontal"android:layout_marginTop= "20dp"

ButtonAndroid:layout_width="match_parent"

Page 94: Lập trình android

94

Mặc dù màu có thể định nghĩa cụ thể trong file layout (background="#ff0000"), tuy nhiên có thể định nghĩa tên màu trong file riêng biệt, khi đó tham chiếu thông qua tên màu.

Nếu cần thì chỉ thay đổi giá trị của màu, lúc đó sẽ tác động lên toàn bộ nơi tham chiếu đến tên màu.

Syntax

Convention

Sử dụng file res/values/colors.xmlCó thể đặt với bất cứ tên nào miễn hợp lệ!

Setting Colors

<resources> <color name="color_name_1">#rrggbb</color> … <!-- Other colors --></resources>

Page 95: Lập trình android

95

Color File

<resources> <color name="red">#f00</color> <color name="orange">#ffa500</color> <color name="yellow">#ffff00</color> <color name="green">#0f0</color> <color name="blue">#00f</color> <color name="indigo">#4b0082</color> <color name="violet">#ee82ee</color> <color name="back">#000</color> <color name="white">#fff</color></resources>

colors.xml

Page 96: Lập trình android

96

Tham chiếu màu trong file layout.

Tham chiếu trong code

getResources().getColor(R.color.red)

Layout file

<TextView android:layout_height="wrap_content" android:layout_width="wrap_content" android:id="@+id/textView1" android:text="@string/red" android:layout_marginTop="20px" android:layout_centerHorizontal="true" android:padding="25dp“

android:background="@color/red">

</TextView>

Page 97: Lập trình android

97

Ý nghĩa

Gán những con số cho android:layout_weight, kích thước sẽ được phân chia theo tỷ số này.

Cách dùng (cho height)

Thiết lập android:layout_height = 0dp

Sử dụng những giá trị tương ứng cho layout_weight

Vd: nếu có 3 thành phần với layout_weight tương ứng là 1, 1 và 2 thì tỷ lệ tương ứng là 25%, 25% và 50% của 3 thành phần so với chiều cao của cha.

Tương tự cho thiết lập width!

Có thể xem giá trị weight là 100, sử dụng những giá trị 25, 25, và 50 cũng tương ứng như 1, 1 và 2!

Layout Weight

Page 98: Lập trình android

98

Layout File

Page 99: Lập trình android

99

Result

Page 100: Lập trình android

100

Ý tưởng

Mỗi view có id xác định

Cho phép xác định vị trí tương đối của view với những view khác thông qua id.

Thuộc tính XML quan trọng

Align với containerlayout_alignParentBottom (Top,Right,Left)

layout_centerInParent (centerHorizontal, centerVertical)

Tất cả giá trị là true hay false

Align với viewlayout_alignBottom (Top, Right, Left)

layout_toLeftOf ( toRightOf, above, below)

Tất cả giá trị là id của view nào đó

RelativeLayout

Page 101: Lập trình android

101

Button thứ 1

<Button id = "@+id/button_1"

android:layout_alignParentRight="true"… />

Button thứ 2

<Button android:layout_toLeftOf="@id/button_1"… />

Referring to Existing IDs

@+id: để gán id mới

@id: (không có dấu cộng) tham chiếu đến button đã có

Page 102: Lập trình android

102

Example

Page 103: Lập trình android

103

Example

<TextView android:id = "@+id/behind" android:layout_width="match_parent" android:layout_height="100dp" android:background="#ff0000" android:textColor="#ffff00" android:textSize="42dp" android:text="Behind" android:gravity="center"/> <TextView android:layout_alignTop="@id/behind" android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="#0000ff" android:textColor="#000000" android:textSize="18dp" android:text="On Top" android:layout_marginTop="25dp" android:layout_centerHorizontal="true" />

Page 104: Lập trình android

104

Example

<Button android:id="@+id/image_button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Search Images" android:layout_alignParentBottom="true" android:layout_alignParentRight="true"/>

<Button android:layout_alignBottom="@id/image_button" android:layout_toLeftOf="@id/image_button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text = "Search Web" /> <EditText android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_above="@id/image_button" android:layout_alignRight="@id/image_button"/>

Page 105: Lập trình android

105

A layout that lets you specify exact location (x/y coordinates) of its children.

Abs layouts are less flexible and harder to maintain than other types of layouts without abs pos.

=> So not recommended for most UI development!

AbsoluteLayout

(0,0)

(20,30)

Viewandroid:layout_x="20px"android:layout_y=“30px"

screen

Page 106: Lập trình android

106

Example

AbsoluteLayout - example

<AbsoluteLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" >

<Button android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_x="20dp" android:layout_y="15dp" android:width="220px" android:height=“50px" android:text="Back" /></AbsoluteLayout>

Tọa độ của view

kích thước của view

Page 107: Lập trình android

107

FL is designed to display a single item at a time.

You can have multiple elements within a FrameLayout but each element will be positioned based on the top left of the screen.

Elements that overlap will be displayed overlapping.

FL can become more useful when elements are hidden and displayed programmatically.

You can use the attribute android:visibility in the XML to hide specific elements. After that can setVisibility from code to show.

FrameLayout

Page 108: Lập trình android

108

Example

FrameLayout - Example

ImageView

TextView

Page 109: Lập trình android

109

Idea

Cho phép widget và layout khác chứa bên trong grid (không có đường biên)

Tương tự như HTML table, số dòng và cột xác định tự động, không cần phải khai báo.

Các view được đặt bên trong TableRow

XML attributes

android:stretchColumnsChứa chỉ số cột sẽ được stretch khi table nhỏ hơn parent

android:shrinkColumnsLiệt kê các cột sẽ co lại khi table lớn hơn parent

android:collapseColumnsNhững cột sẽ bị thu lại, có thể lập trình để hiện ra sau.

TableLayout

Page 110: Lập trình android

110

Dùng để định nghĩa một dòng trong TableLayout

Thuộc tính XML quan trọng sử dụng bên trong TableRow

android:layout_columnCó thể xác định chính xác cột của thành phần, cột bỏ qua đó sẽ rỗng.

android:layout_spanSố cột mà thành phần sẽ chiếm giữ, giống colspan trong HTML table

Không có thuộc tính tương ứng với rowspan trong HTML, dùng nested table để thực hiện.

TableRow

Page 111: Lập trình android

111

Example

Page 112: Lập trình android

112

Example

Page 113: Lập trình android

113

Example

Page 114: Lập trình android

114

Example

Page 115: Lập trình android

115

Tạo activity có layout như sau: (chỉ dùng TableLayout)

VD

Page 116: Lập trình android

116

Button Widgets

Page 117: Lập trình android

117

Buttons

ImageButtons với 1 ảnh

ImageButtons với 3 ảnh (normal/focused/pressed)

RadioButtons – OnClickListener

RadioButtons – OnCheckedChangeListener

CheckBoxes

ToggleButtons

Topics in this section

Page 118: Lập trình android

118

Button layout

Horizontal LinearLayout (3 button)

Horizontal LinearLayout (3 Imagebutton)

Horizontal LinearLayout (3 Imagebutton)

Horizontal RadioGroup (3 RadioButton)

Horizontal RadioGroup (3 RadioButton)

Horizontal LinearLayout (3 CheckBox)

Horizontal RadioGroup (3 ToggleButton)

Vertical LinearLayout

Page 119: Lập trình android

119

Là nút nhấn có nhãn bên trên

Listener: View.OnClickListener

Nếu sử dụng phương pháp XML based thì có thể không cần phải khai báo lớp Listener này.

Thuộc tính XML thường dùng

android:textNhãn của button, có thể truy xuất bằng code java thông qua phương thức setText và getText

android:onClick

Basic Button

Page 120: Lập trình android

120

Là nút nhấn có ảnh hiển thị bên trên

Listener: View.OnClickListener

Thuộc tính XML

android:srcảnh hiển thị trên button, tham chiếu đến tên (không có phần mở rộng) của ảnh trong thư mục res/drawable

Hỗ trợ các kiểu ảnh png, jpeg, gif và bmp.

Có thể dùng Java code để thiết lập với setImageDrawable

android:onClick

ImageButton

Page 121: Lập trình android

121

ImageButton

Page 122: Lập trình android

122

Là nút chọn, cho phép chọn một trong số mục chọn cùng nhóm.

Listener

View.OnClickListenerGán cho mỗi nút nếu quan tâm đến sự kiện chọn trên từng item.

Có thể dùng cách khác là bắt sự kiện trên RadioGroup.

Thuộc tính XML

android:text, android:onClick

RadioButton

Page 123: Lập trình android

123

Tương tự như LinearLayout, cho phép chứa các RadioButton bên trong.

Quản lý trạng thái RadioButton là exclusive.

Listener: OnCheckedChangeListener

Thuộc tính XML

Tương tự như LinearLayout

Sử dụng android:id để tham chiếu trong chương trình (khi thiết lập OnCheckedChangeListener)

Không có thuộc tính andoird:onXYZ để thiết lập RadioGroup listener trong XML.

RadioGroup

Page 124: Lập trình android

124

Minh hoạ

Đáp ứng với mỗi click trên từng radio button bằng cách hiện thông điệp message nào đó

Cách thực hiện

Đặt các radiobutton vào trong radiogroup

Gán event handler, sử dụng onClick cho mỗi RadioButton.

Không cần id cho RadioGroup, không cần listener cho RadioGroup.

Event handler cho RadioButton

Page 125: Lập trình android

125

Event handler cho RadioButton

Page 126: Lập trình android

126

Minh hoạ

Mỗi khi nút nào được nhấn thì hiển thị message báo tên nút được nhấn

Cách thực hiện

Đặt RadioButton bên trong RadioGroup

Trong XML, tạo id cho RadioGroup

Trong Java, xác định RadioGroup và thiết lập Listener

Event handler cho RadioGroup

Page 127: Lập trình android

127

Xử lý trong hàm onCreate

Event handler cho RadioGroup

Page 128: Lập trình android

128

Minh hoạ cách dùng

CheckBox

Page 129: Lập trình android

129

Là dạng tương tự như combo box

Listener

AdapterView.OnItemSelectedListener

AdapterView.OnItemClickedListener

Thuộc tính XML

android:id, android:prompt

android:entryĐịnh nghĩa mục chọn, có thể định nghĩa trong strings.xml hoặc arrays.xml

Spinner

Page 130: Lập trình android

130

Khai báo Spinner

Spinner

Strings.xml hay arrays.xml

Page 131: Lập trình android

131

Tham chiếu đến Spinner

Lớp thực thi Listener

Spinner

Lấy item được chọn

Page 132: Lập trình android

132

Cách tiếp cận khác là tạo spinner thông qua code Java.

Sinh viên tìm hiểu thêm cách tiếp cận này!

Spinner

Page 133: Lập trình android

133

Intent

Page 134: Lập trình android

134

Có thể dùng Intent để gọi một activity từ một activity đang hiển thị.

Cú pháp

Dùng Intent để gọi Activity

Intent activityIntent = new Intent(this, NewActivity.class);startActivity(activityIntent);

// khai báo trong AndroidManifest.xml<activity android:name = "NewActivity" <intent-filter> <action android:name="android.intent.action.VIEW" /> <action android:name="android.intent.category.DEFAULT" /> </intent-filter>

</activity>

Page 135: Lập trình android

135

Cách thực hiện

Tạo đối tượng Bundle, chứa dữ liệu cần gởi cho activity mới, attach đối tượng Bundle này kèm theo Intent

Cú pháp

Java (original Activity)

Java (new Activity)

Gởi dữ liệu giữa Activity

Intent activityIntent = new Intent(this, NewActivity.class);Bundle newActivityInfo = new Bundle();newActivityInfo.putXYZ(…); //putDouble, putString…activityIntent.putExtras(newActivityInfo);startActivity(activityIntent);

Intent intent = getIntent();Bundle info = intent.getExtras();If (info != null) { // getXYZ()…}

Page 136: Lập trình android

136

VD: Truyền dữ liệu từ original activity sang new activity.

Gởi dữ liệu giữa Activity

Page 137: Lập trình android

137

Hàm xử lý submit

Gởi dữ liệu giữa Activity

public void submit(View v){ Intent newActivity = new Intent(this,NewActivity.class); Bundle info = new Bundle(); String sName, sEmail; EditText ed1 = (EditText)findViewById(R.id.editText1); EditText ed2 = (EditText)findViewById(R.id.editText2); info.putString("Name", ed1.getText().toString()); info.putString("Email", ed2.getText().toString() ); newActivity.putExtras(info); startActivity(newActivity);}

Page 138: Lập trình android

138

Xử lý trong new activity

Gởi dữ liệu giữa Activity

setContentView(R.layout.new_activity);

// tham chiếu đến intentString sName, sEmail;Intent intent = getIntent();Bundle info = intent.getExtras();if (info != null){

sName = info.getString("Name");sEmail = info.getString("Email");TextView tv1 = (TextView)findViewById(R.id.tvHoTen);tv1.setText(sName);

TextView tv2 = (TextView)findViewById(R.id.tvEmail);tv2.setText(sEmail);}

Page 139: Lập trình android

139

Tình huống:

Activity mới sau khi tương tác với user, thu thập được dữ liệu, kết thúc activity và gởi lại cho activity gọi nó (original activity).

Gởi dữ liệu giữa Activity

Activity A Activity B

Gọi activity B (có thể truyền dữ liệu cho B tuỳ ý)

Acvitity B kết thúc và gởi dữ liệu về cho A

Page 140: Lập trình android

140

Phần xử lý ở lớp activity A (Original Activity)

Phần xử lý trên thường đặt trong hàm xử lý sự kiện của button hay menu.

Gởi dữ liệu giữa Activity

Intent newActivity = new Intent(this, ActivityB.class);final int result = 1;// gọi activity B hiển thị và chờ lấy kết quả trả vềstartActivityForResult(newActivity, result);

Page 141: Lập trình android

141

Phần xử lý ở lớp activity A (Original Activity), khi nhận kết quả trả về từ activity B (new Activity).

Override phương thức onActivityResult trong ActivityA để nhận kết quả trả về (khi ActivityB đóng).

Gởi dữ liệu giữa Activity

protected void onActivityResult(int requestCode, int resultCode, Intent data) {super.onActivityResult(requestCode, resultCode,

data);// lấy Bundle chứa dữ liệuBundle bundle = data.getExtras();int data1 = bundle.getInt("<tên dữ liệu 1>");int data2 = bundle.getInt("<tên dữ liệu 2>");String data3 = bundle.getString("<tên dữ liệu 3>");…

}

Page 142: Lập trình android

142

Phần xử lý trong activity B (activity được gọi từ A)

Gởi dữ liệu giữa Activity

// gởi dữ liệu về activity trướcIntent intent = new Intent();Bundle bundle = new Bundle();// gởi dữ liệu vào bundlebundle.putInt("<tên dữ liệu 1>", data1); bundle.putInt("<tên dữ liệu 2>", data2);Bundle.putString("<tên dữ liệu 3>", data3);

intent.putExtras(bundle); // gởi kèm dữ liệusetResult(RESULT_OK, intent); // gởi kết quả về

finish(); // đóng activity

Page 143: Lập trình android

143

Cung cấp URI tham chiếu đến new activity

New Activity sẽ đăng ký trong androidmanifest có mô tả dùng URI

Cú pháp

Java (original Activity)

XML (phần khai báo cho activity được gọi)

Gọi Activity thông qua URI

Uri uri = Uri.parse("call://ex.intent.uri/ActivityC");Intent intent = new Intent(Intent.ACTION_VIEW, uri);startActivity(intent);

<intent-filter> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /> <data android:scheme="call" android:host="ex.intent.uri"/></intent-filter>

Page 144: Lập trình android

144

Ý tưởng

Nhúng tham số trong URI, tương tự như query string trong Web.

Cú pháp

Java (original Activity)

Java (new Activity)

Gởi dữ liệu qua tham số URI

Uri uri = Uri.parse("call://ex.intent.uri/ActivityC?str=hello class");Intent intent = new Intent(Intent.ACTION_VIEW, uri);startActivity(intent);

Uri uri = getIntent().getData();String str = uri.getQueryParameter("str");// xử lý với chuỗi, nếu truyền là chuỗi số thì chuyển sang số…

Page 145: Lập trình android

145

Extras

ProsCan send data of different types

No parsing required in Activity that receives the data

ConsMore complex for originating activity

Requires parsing in originating activity if values come from EditText

URI parameters

Pros:Simpler for originating Activity, especially if EditText used

More consistent with URI usage

ConsCan send Strings only

Requires parsing in receiving Activity

Extras vs. URI parameter

Page 146: Lập trình android

146

Ý tưởng

Tạo tab window, mỗi tab là một activityCó thể gọi activity thông qua class hay URI

Gởi dữ liệu thông qua extras Bundle hay URI

Tab Window Activity và các activity phải cùng project.

Cú pháp

JavaMở rộng từ lớp TabActivity, sử dụng TabHost, TabSpec

XML: (androidManifest.xml)Tương tự như phần trước.

Activity với Tabbed Window

Page 147: Lập trình android

147

Sử dụng TabActivity: outline

Page 148: Lập trình android

148

Tạo ứng dụng demo như sau:

Activity với Tabbed Window

Page 149: Lập trình android

149

Activity với Tabbed Window

Resources resource = getResources(); TabHost host = getTabHost(); Intent intent1 = new Intent(this, activity1.class); Drawable tabIcon1 = resource.getDrawable(R.drawable.b1); TabSpec tab1 = host.newTabSpec("Tab One").setIndicator("Activity 1",tabIcon1) .setContent(intent1); host.addTab(tab1); Intent intent2 = new Intent(this, activity2.class); Drawable tabIcon2 = resource.getDrawable(R.drawable.b2); TabSpec tab2 = host.newTabSpec("Tab Two").setIndicator("Activity 2",tabIcon2) .setContent(intent2); host.addTab(tab2); Intent intent3 = new Intent(this, activity3.class); Drawable tabIcon3 = resource.getDrawable(R.drawable.b3); TabSpec tab3 = host.newTabSpec("Tab Three").setIndicator("Activity 3",tabIcon3) .setContent(intent3); host.addTab(tab3);

Page 150: Lập trình android

150

Service là thành phần nền tảng của Android.

Đôi khi ứng dụng run process với khoảng thời gian lâu và không

có hoặc hiếm khi có sự can thiệp từ người dùng.

Tiến trình nền này có thể xử lý ngay cả khi phone được sử dụng

cho activity/task khác.

Các lớp thực thi service phải mở rộng từ lớp Service trong gói

android.app.Service

Các phương thức override là: onCreate, onDestroy, onStart

Service

Page 151: Lập trình android

151

Minh hoạ:

Tạo một service thực thi việc chạy file nhạc nền.

Service này được gọi thông qua UI trên Activity.

Service

Sử dụng ToggleButton để on/off service

Page 152: Lập trình android

152

Bước 1: Chuẩn bị file nhạc mp3.

Tạo thư mục raw trong res (nếu chưa có raw)

Import một file nhạc mp3 nào đó vào thư mục res/raw

Service

Ví dụ import file only_time.mp3 vào thư

mục raw

Page 153: Lập trình android

153

Bước 2: Tạo layout cho activity chính của ứng dụng

Service

<LinearLayout android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" android:gravity="center_horizontal" > <TextView android:text="Services Demo" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="35dp" > </TextView> <ToggleButton android:text="ToggleButton" android:id="@+id/toggleButton1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="doService" > </ToggleButton></LinearLayout>

Page 154: Lập trình android

154

Bước 3: Tạo một lớp mới extend từ Service

Service

Tên lớp service sẽ tạo

Extend từ lớp Service

Page 155: Lập trình android

155

Bước 4:

Override các phương thức onCreate, onDestroy, onStart của service.

Tạo đối tượng player là MediaPlayer

Service

public class MyService extends Service {

private static final String TAG ="HaGService"; private MediaPlayer player; @Override

public IBinder onBind(Intent intent) {// TODO Auto-generated method stubreturn null;}@Overridepublic void onCreate() {// TODO Auto-generated method stub}@Overridepublic void onDestroy() {// TODO Auto-generated method stub}@Overridepublic void onStart(Intent intent, int startId) {// TODO Auto-generated method stub}

}

Page 156: Lập trình android

156

Bước 5: viết các phần xử lý cho onCreate

Hiển thị một messge báo "Service created"

Hiển thị thông tin debug trong LogCat

Load file nhạc vào biến player

Thiết lập cờ looping.

Service

@Overridepublic void onCreate() { // TODO Auto-generated method stub Toast.makeText(this, "Service created", Toast.LENGTH_LONG).show(); Log.d(TAG,"onCreate"); player = MediaPlayer.create(this, R.raw.only_time); player.setLooping(false);}

Page 157: Lập trình android

157

Bước 6: thực thi hàm onStart và onDestroy

Service

@Overridepublic void onStart(Intent intent, int startId) { // TODO Auto-generated method stub Toast.makeText(this, "Service started", Toast.LENGTH_LONG).show(); Log.d(TAG, "onStart"); player.start(); // chạy file nhạc}@Overridepublic void onDestroy() { // TODO Auto-generated method stub Toast.makeText(this, "Service stopped", Toast.LENGTH_LONG).show(); Log.d(TAG,"onDestroy"); player.stop(); // dừng file nhạc}

Page 158: Lập trình android

158

Bước 7: viết phần xử lý cho sự kiện onClick của ToggleButton trong activity chính của ứng dụng

Service

public void doService(View view){ // tham chiếu đến ToggleButton ToggleButton btn = (ToggleButton)view; if (btn.isChecked()==true) { startService( new Intent(this,MyService.class) ); } else { stopService( new Intent(this,MyService.class) ); }}

Page 159: Lập trình android

159

Bước 8: khai báo service trong AndroidManifest.xml

Việc khai báo service trong file AndroidManifest là bắt buộc.

Nếu thiếu phần khai báo thì service sẽ không chạy được.

Service

<service android:name="MyService" android:enabled="true"></service>

Tên của service Thiết lập trạng thái của Service là anable

Page 160: Lập trình android

160

Broadcast Receivers

Thành phần có thể respond lại các thông báo của hệ thống.

VD:Thông báo màn hình bị tắt, pin yếu, ảnh được chụp

Thông báo cuộc gọi đến, tin nhắn đến…

Ngoài ra ứng dụng cũng có thể khởi tạo broadcast để báo cho ứng dụng khác hay hệ thống biết thông tin gì đó

Ứng dụng báo đã hoàn thành việc download về thiết bị và sẵn sàng cho việc sử dụng.

Có thể dùng để start một service chạy nền nào đó.

Phần tìm hiểu thêm

Page 161: Lập trình android

161

Content providers

Quản lý sự chia sẻ dữ liệu của ứng dụng. Bao gồm các dạngShared preferences

Internal storage

Local cache

External storage

SQLite database (Chapter 12: Android App Dev for Dummies)

Network connection

Phần tìm hiểu thêm