LẬP TRÌNH DI ĐỘNG Bài 1 Nhập Môn Nội dung 1 Giới thiệu môn học 2 Công cụ học tập 3 Giới thiêu về ngôn ngữ java Ngôn ngữ lập trình Java Lập trình hướng đối tượng Công cụ phát triển Java Các loạ[.]
Trang 1LẬP TRÌNH DI ĐỘNG
Bài 1: Nhập Môn
Trang 2 Lập trình hướng đối tượng
Công cụ phát triển Java
Các loại chương trình Java
“Hello, World!” – phiên bản Java
Quá trình thực thi ứng dụng Java
Trang 3Giới thiệu môn học
Phần 1
Trang 5Tài liệu học tập
Raymond Gallardo, Scott Hommel, Sowmya Kannan,
Joni Gordon, Sharon Biocca Zakhour The Java
Tutorial: A Short Course on the Basics, 6th edition
Online version: https://docs.oracle.com/javase/tutorial/
Dave MacLean, Satya Komatineni, Grant Allen Pro
Android 5 Apress, 2015
Online: bài giảng, tài liệu đọc thêm, điểm số, thông báo,… sẽ được đưa lên website http://txnam.net,
mục BÀI GIẢNG
Trang 6Kiến thức yêu cầu / nên biết
Trang 8Học môn này có lợi gì?
Có kiến thức về lập trình cho thiết bị di động
Có hiểu biết sâu sắc hơn về hoạt động của các thiết
bị di động và phần mềm trên các thiết bị đó, khai thác tốt hơn các thiết bị đó
thiết bị di động
Trang 9Nội dung môn học (1/2)
Cơ bản về ngôn ngữ lập trình Java
Trang 10Nội dung môn học (2/2)
Intent, Notification và Menu
Lưu trữ, SQLite và content provider
Trang 11Công cụ học tập
Phần 2
Trang 12Công cụ học tập
Miễn phí, mạnh mẽ, tương thích tốt
Dùng được cho cả 2 phần nội dung lập trình (java và
android) trong môn học
Netbeans (dùng cho lập trình java)
Android Studio (dùng cho lập trình android)
Tất cả các công cụ trên đều cần bộ phát triển ứng dụng java: JDK (java development kit)
Đề xuất sử dụng phiên bản 8
Trang 13Giới thiệu về ngôn ngữ java
Phần 3
Trang 14Ngôn ngữ lập trình Java
Được phát triển liên tục:
Trang 15Ngôn ngữ lập trình Java
phức tạp: Đơn giản, dễ học và dễ dùng hơn
Trang 16Lập trình hướng đối tượng
Tiếng Anh: Object-Oriented Programming (OOP)
phần mềm thành các module tương tác với nhau
class), mô phỏng tương tự các đối tượng thực ngoài đời
Trang 17Lập trình hướng đối tượng
Data abstraction (sự trừu tượng hóa dữ liệu)
Data encapsulation (sự đóng gói dữ liệu)
Inheritance (sự kế thừa)
Polymorphism (sự đa hình)
Khả năng tái sử dụng cao
Giảm chi phí phát triển và bảo trì sản phẩm
Gần gũi giữa lập trình và bài toán thực tế
Trang 18Lập trình hướng đối tượng
Trang 19Công cụ phát triển Java (1/3)
Thường thì mỗi phiên bản lớn của JDK ứng với một
phiên bản của ngôn ngữ Java Ví dụ: JDK 1.7 ứng với phiên bản Java 7
JDK là bộ công cụ bắt buộc phải có đối với việc phát
triển ứng dụng Java
JDK bao gồm:
• Máy ảo Java (JVM)
• Các thư viện lập trình
• Một số công cụ cơ bản cho nhà phát triển
JRE (Java Runtime Environment): Để chạy Java Apps
Trang 20Công cụ phát triển Java (2/3)
Trang 21Công cụ phát triển Java (3/3)
triển, thực thi, gỡ lỗi, bảo trì,… các ứng dụng Java
Trang 22Các loại chương trình Java
Command line application: ứng dụng đơn giản nhất, chạy trực tiếp từ dòng lệnh
GUI application: ứng dụng dùng giao diện đồ họa tương tác người sử dụng
Applet: ứng dụng java nhúng trong các trang web, tương tác như một thành phần của trang
Servlet: ứng dụng phía server, chạy trên các web
server, xử lý các yêu cầu người dùng web
Add-on app (plug-in app): các thành phần mở rộng chức năng của những phần mềm có hỗ trợ java
Trang 23“Hello, World!” – phiên bản Java
Viết bằng bất kì trình soạn thảo nào
Trang 24Quá trình thực thi ứng dụng Java
Bước 1: Mã Java được dịch thành mã trung gian
(mã bytecode) Mã này được xây dựng bởi SUN,
độc lập với mã máy Các đoạn mã được lưu trong các file “.class”
Bước 2: Máy ảo Java nạp các file “.class” và kiểm tra tính toàn vẹn của các file này Thực hiện một số bước chuẩn bị như khởi tạo bộ nhớ, nạp các thư
viện mặc định
Bước 3: Máy ảo Java đọc và thực hiện từng lệnh
một trong mã bytecode cho đến khi kết thúc ứng
dụng
Trang 25LẬP TRÌNH DI ĐỘNG
Bài 2: Cơ Bản Về Ngôn Ngữ Java
Trang 26Nội dung
Trang 27Cấu trúc chương trình java đơn giản
Phần 1
Trang 28Nhập a, b từ bàn phím và tính a b
import java.io.*;
public class vidu {
public static void main ( String [] args) {
Console console = System console();
if ( console == null) System exit(0);
System out print("Nhap so A: ");
int a = Integer parseInt( console readLine());
System out print("Nhap so B: ");
int b = Integer parseInt( console readLine());
System out println("a^b = " + Math pow(a, b));
}
}
Trang 29Vào ra dữ liệu trong ứng dụng
console
Phần 2
Trang 31Nhập dữ liệu từ bàn phím
Scanner scanner = new Scanner(System.in);
System.out.print("Enter your name: ");
String name = scanner.nextLine();
BufferedReader reader = new BufferedReader(
new InputStreamReader(System.in) );
System.out.print("Enter your name: ");
String name = reader.readLine();
Trang 32Kiểu dữ liệu
Phần 3
Trang 33Kiểu dữ liệu
Kiểu dữ liệu trong java chia làm 2 loại:
Kiểu Primitive (cơ sở)
Kiểu Reference (tham chiếu)
Ngoài ra còn một loại đặc biệt: immutable (là kiểu tham chiếu nhưng hoạt động như kiểu cơ sở), ví dụ như kiểu chuỗi (String)
Số nguyên: byte, short, int (*), long
Số thực: float, double (*)
Kí tự: char (16-bit unicode)
Logic: boolean (false/true)
Trang 34 Kiểu nhỏ hơn có thể chuyển về kiểu lớn hơn
Trường hợp ngược lại cần ép kiểu tường minh
int abc = 100;
long xyz = abc;
abc = ( int ) xyz
Trang 36Phần 4
Trang 37 Biến: ô nhớ được đặt tên để dễ dàng thao tác trong các phép toán, biểu thức, câu lệnh,…
Quy tắc đặt tên trong java:
Phân biệt chữ hoa và chữ thường (case-sensitive)
Bao gồm các chữ cái, chữ số, dấu $ và dấu _
Chữ số không được đứng đầu tên
Không được trùng với từ khóa hoặc từ dành riêng
Đặt tên có nghĩa, gợi nhớ
Không quá dài
Trang 38 Từ khóa của java, tên package: luôn viết chữ thường
Tên biến và hàm: Viết hoa các chữ đầu của từ, trừ từ đầu tiên
Tên class và interface: Viết hoa các chữ đầu của từ
Tên hằng số: Viết hoa hoàn toàn
Trang 39 Biến có thể khai báo hoặc khai báo và khởi trị luôn cho nó
khởi trị trước khi sử dụng, nếu không sẽ gây lỗi
biên dịch
tự động gán giá trị mặc định (bằng dãy các bit 0)
Ví dụ:
float PI = 3.14f; // khai báo + khởi trị double pi; // khai báo
pi = PI; // gán giá trị
Trang 40 Mảng: dãy các biến có cùng kiểu dữ liệu, cùng tên
và phân biệt bởi chỉ số
Trang 41Phép toán
Phần 5
Trang 42Phép toán
5 phép cơ bản: cộng (+), trừ (-), nhân (*), chia (/), chia lấy dư (%)
Thứ tự ưu tiên như trong toán học
Phép % chỉ thực hiện với kiểu nguyên
Phép / trả về thương nếu cả hai phía đều nguyên
Phép tăng (++) và giảm ( ) chỉ làm việc với kiểu nguyên (chú ý kết quả trả về)
Trang 43 Phép hai ngôi đoản-mạch: Và (&&), Hoặc (||)
Phép hai ngôi toàn-mạch: Và (&), Hoặc (|)
Trang 44Phép toán
Phép kiểm tra kiểu: x instanceof y - trả về đúng
(true) nếu biến x có kiểu y
Phép toán bit: coi các số như là dãy bit và thao tác theo từng bit
Phép môt ngôi: phép Đảo (~) - đảo giá trị của các bit
Phép hai ngôi: phép Và (&), phép Hoăc (|), phép hoặc nghịch đảo (^)
Trang 45Phép toán
Dịch bit: dịch trái (<<), dịch phải (>>), dịch phải
dương (>>>)
(điều kiện) ? giá trị A : giá trị B
a = a + b a += b;
Trang 46Câu lệnh lựa chọn
Phần 6
Trang 48default: monthString = "Invalid month"; }
Chú ý: từ Java 7, switch có thể sử dụng với kiểu dữ liệu String
Trang 49Phần 7
Trang 51for (initialization; termination; increment) {
statement(s) }
for (int i: number) {
statement(s) }
Trang 52Điều khiển lặp
kỳ mới
chấm dứt vòng lặp)
và continue có thể có tham số vị trị nhảy đến (tương
tự goto – không nên sử dụng)
Trang 53Thử và ngoại lệ
Phần 8
Trang 54Thử và Ngoại lệ
Java cung cấp cơ chế cho phép lập trình viên kiểm soát các đoạn mã có thể sinh lỗi, cơ chế này khá thông dụng trong nhiều ngôn ngữ lập trình hiện đại
Trang 55Thử và Ngoại lệ
Cần theo đúng thứ tự try-catch-finally
Có thể không có hoặc có nhiều khối catch
Có thể không có khối finally
Khối finally luôn được thực thi
Lập trình viên có thể sinh lỗi bằng câu lệnh
throw X; // X là một biến chứa lỗi, bị bắt bởi catch
Lạm dụng khối TCF có thể làm chậm ứng dụng một cách không cần thiết
Trang 56Thử và Ngoại lệ
Kết nối CSDL
Kết nối mạng
Làm việc với file, vào/ra/chuyển đổi dữ liệu
Không có phân biệt rõ ràng, tùy vào lập trình viên
TCF: lỗi không mong muốn, có thể khắc phục và tiếp tục công việc
Lỗi: công việc không thể tiếp tục thực hiện bình thường, cần hủy bỏ
Trang 57LẬP TRÌNH DI ĐỘNG
Bài 3: Java OOP & Collections
Trang 58 Giao diện (interface)
Kiểm soát truy cập
Trang 59Java OOP
Phần 1
Trang 60Lớp (class)
ngôn ngữ lập trình hướng đối tượng
hợp với bài toán thực tế
Trong java, tất cả các class đều kế thừa từ class Object hoặc con cháu của Object
Java cung cấp thư viện rất lớn các class có sẵn
Lập trình viên: sử dụng, thay đổi, kết hợp các class
đó để phù hợp với mục đích của mình
Trang 61Lớp (class)
Ví dụ: cần làm việc với kiểu dữ liệu phân số
Tử số lưu ở biến a
Mẫu số lưu ở biến b
Viết các hàm toán học làm việc với a và b
Tạo một kiểu dữ liệu mới: PhanSo , bên trong có 2 thành phần tử số và mẫu số
Viết các hàm đính kèm với kiểu PhanSo để thực hiện các phép toán
Trang 62Lớp (class)
// khai báo
class PhanSo {
int tuso, mauso;
public PhanSo() { tuso = 0; mauso = 1; }
public PhanSo ( int tu, int mau) {
tuso = tu; mauso = mau;
}
}
// sử dụng
PhanSo x = new PhanSo (); // phân số x = 0/1
PhanSo y = new PhanSo (1, 3); // phân số y = 1/3
Trang 63Đối tượng (object)
Ví dụ: class PhanSo => biến x có kiểu PhanSo => x
là một đối tượng
1 Khai báo (chưa dùng được)
2 Khai sinh (cấp phát bộ nhớ + constructor)
3 Sử dụng
4 Khai tử (destructor + thu hồi bộ nhớ đã cấp)
hiện việc hủy đối tượng và thu hồi bộ nhớ (bước 4)
Trang 64Đối tượng (object)
// định nghĩa lớp PhanSo
class PhanSo {
…
}
// sử dụng các object có kiểu PhanSo
PhanSo x, y; // khai báo
x = new PhanSo(1, 3); // khai sinh
Trang 65 Nếu có thì phải đặt ở đầu file
Tên gói quy ước như tên biến trong java
Sau khi dịch thành file class, các file này phải được đặt trong thư mục khớp với tên của gói, nếu không sẽ không nạp được
Trang 66Gói (package)
mới có thể sử dụng ngoài package đó
Giải quyết vấn đề có quá nhiều class trong ứng dụng
Nhóm các class thuộc cùng một mục đích, giúp việc
nghiên cứu/sử dụng/bảo trì mã tốt hơn
Giải quyết việc trùng tên của class
Tăng hiệu suất làm việc của máy ảo Java
Trang 67Các thành phần trong class
Biến
Biến của class
Biến của object
Trang 68Sự kế thừa
tất cả những đặc điểm của kiểu dữ liệu cũ và thêm một số đặc điểm mới
class MyApp extends MyDefaultApp {
}
class kế thừa từ class Object (lớp gốc của mọi class trong java)
Trang 69Sự kế thừa
“phù hợp với tình hình mới”
MyDefaultApp x = new MyApp();
tương hợp với biến, không phụ thuộc vào kiểu biến (polymorphism)
super
this
Trang 70Giao diện (interface)
Mô tả các đặc trưng mà đối tượng sẽ có
Các hàm bên trong không có phần thân và luôn là public
Một class có thể kế thừa nhiều interface thông qua từ khóa
implements
Một interface có thể kế thừa nhiều interface khác thông qua
từ khóa extends
Trang 71Giao diện (interface)
dữ liệu mới
Một class kế thừa interface thì phải viết lại
(override) tất cả các hàm bên trong nó hoặc phải
khai báo là abstract
không thể khởi tạo biến đó
Có thể sử dụng kĩ thuật anonymous class để viết lại trực tiếp một interface
Trang 72Kiểm soát truy cập
Java có 4 kiểu kiểm soát truy cập:
con cháu
nếu cùng package
private (riêng tư): chỉ có thể truy cập bởi chính class
đảm bảo tính logic của chương trình không bị phá
vỡ một cách vô ý
Trang 73Java Collections
Phần 2
Trang 74 Kiểu dữ liệu cơ bản, dùng thường xuyên nhất
Là kiểu reference : chú ý khi làm tham số của hàm
Đặc biệt chú ý việc khởi tạo trước khi dùng
// Tạo mảng 100 String, sau đó phải khởi tạo String String[] a = new String [100];
// Tạo mảng 2 chiều 20 dòng 30 cột
int[][] b = new int [20][30];
// Tạo mảng 2 chiều 20 dòng, sau đó phải khởi tạo // từng cột, mỗi cột có thể có kích thước riêng
int[][] c = new int [20][];
for (int i = 0; i < c.length; i++)
c[i] = new int [10];
Trang 75mỗi phần tử là một mảng N-1 chiều
Phải khởi tạo các phần tử khi sử dụng
Không ràng buộc kích thước các phần tử phải như nhau
static tiện ích khi làm việc với mảng
Hàm sort : sắp xếp các phần tử của mảng
Hàm equals : so sánh hai mảng
Hàm binarySearch : tìm kiếm nhị phân trong mảng
Hàm fill : điền giá trị vào mảng
Chú ý: Arrays chỉ làm việc với mảng object
Trang 76 String có thể được tạo ra từ:
Trang 79đối tượng khác (ví dụ như mảng)
có tính chất tương tự:
Danh sách sinh viên
Danh bạ điện thoại
Kết quả thi đại học
Tập hợp các hình trong một trò chơi
Danh sách các bộ phim cần xem
Trang 80Iterator itr = myList.iterator();
while(itr.hasNext())
System.out.println(itr.next());
Trang 81số (tức là tương tự như mảng):
elementAt(index)
bằng ArrayList
Trang 82 Lưu trữ các cặp <khóa> - <giá trị>
Các <khóa> không được trùng nhau
Có nhiều kĩ thuật để giải quyết bài toán trên,
Trang 84tuy nhiên không tự động đồng bộ (như vậy chạy
nhanh hơn khi không bị truy cập bởi nhiều thread)
HashMap<key,value> chứa các cặp key-value
tương ứng (giống như từ điển), trong đó các key
không được trùng nhau
thông qua giá trị các key với tốc độ nhanh
Trang 85 Hàm clear(): Xóa nội dung HashMap
Hàm containsKey(key): Trả về true nếu chứa key
Hàm containsKey(value): Trả về true nếu chứa ít nhất 1 value
Hàm get(key): Trả về value ứng với key
Hàm put(key, value): Chèn cặp (key, value) vào
HashMap
Hàm size(): Trả về số cặp trong HashMap
Hàm remove(key): Xóa cặp (key,value) khỏi HashMap
Hàm keySet(): Trả về tập các key
Trang 86LẬP TRÌNH DI ĐỘNG
Bài 4: Bắt Đầu Lập Trình Cho Android OS
Trang 88Thiết bị di động vs thiết bị cố
định
Phần 1
Trang 89Di động vs Cố định
Thiết bị di động (với ý nghĩa là giao tiếp không
dây) đã xuất hiện từ rất lâu
Tăng trưởng về số lượng khi xuất hiện thiết bị dành cho cá nhân (nhỏ, gọn, nhiều khách hàng)
Bùng nổ khi giá thiết bị giảm (nhiều khách hàng có khả năng mua)
Xu hướng: thiết bị di động dần thay thế cho thiết bị
cố định do việc mua để thay thế thiết bị cũ
Xuất hiện những chức năng mới, dịch vụ mới và
cuối cùng là những loại thiết bị mới
Trang 90Chức năng mới
Giao tiếp kiểu chạm-vuốt (bàn phím hạn chế)
Tích hợp chụp ảnh, máy chơi nhạc, máy điện thoại
và thêm nhiều thiết bị nữa trong tương lai
Tích hợp các cảm biến, thiết bị có khả năng tương tác tốt hơn do “nhận ra” môi trường xung quanh
Ghi nhận được độ nghiêng của thiết bị
Ghi nhận được gia tốc và hướng di chuyển của thiết bị Ghi nhận được âm thanh, nhiệt độ, ánh sáng xung quanh
Nhiều giao tiếp không dây: bluetooth, wifi, nfc,…Tích năng các dịch vụ online (GPS, OTT,…)
Trang 92Loại thiết bị mới
Trang 93Thị trường ứng dụng cho di
động
Phần 2
Trang 94Bối cảnh
Sự phát triển của các thiết bị di động thông minh
Nhu cầu giải trí qua thiết bị di động tăng cao
Các tương tác kiểu mới xuất hiện
Sự phát triển của kênh phân phối
Sự phát triển của kênh thanh toán
Trang 95Cơ hội cho lập trình viên
Thị trường ứng dụng cho di động tăng trưởng nóng
Chuyển đổi các ứng dụng đã có lên di động
Chuyển đổi các ứng dụng di động sang loại thiết bị mới Phát triển những ứng dụng mới hoàn toàn, khai thác khả năng đặc biệt của di động
Nhu cầu nhân lực viết phần mềm cho di động cao
Tăng trưởng về lương cho người làm di động
Đỡ nhàm chán vì xuất hiện những công nghệ mới
Cơ hội thực hiện các ý tưởng mới
Tự viết và bán ứng dụng: không còn quá khó như trước
Trang 96(2012) Firefox OS (2013) Ubuntu Touch (2013) Sailfish OS (2013) Tizen
Trang 97Thị phần các nền tảng toàn cầu
Trang 98Thị phần các nền tảng toàn cầu
Nền tảng android thống trị về số lượng
Nền tảng iOS giảm nhưng chậm
Không có nhiều cơ hội cho các tay chơi khác ngoại trừ xuất hiện một loại thiết bị có tính đột phá (như iPhone trước kia)
Trang 99Thị phần các nền tảng tại Mỹ
Trang 100Thu nhập trên mỗi app/month
Trang 101So sánh 3 chợ ứng dụng