# Ôn tập chuyên môn
## 1. Java
- Java Platfrom là JVM + APIs
- Trong Java, kiểu char biểu diễn bộ mã code: UTF-16
- Mọi lớp đều kế thừa trực tiếp hoặc gián tiếp từ lớp Object
- Trong Java, có 8 kiểu dữ liệu cơ sở:
* byte
* short
* int
* long
* float
* double
* boolean
* char
- Frame trong Java:
- Hiển thị: setVisible()
- Đối tượng trong phần mềm là: các đối tượng được biểu diễn trong phần mềm gồm có 2 thuộc tính trường dữ liệu và các phương thức xử lý dữ liệu
- Trong Java, có 3 loại biến chính:
* Biến cục bộ (Local Variables): Biến được khai báo bên trong phương thức. Bạn chỉ có thể sử dụng biến này trong phương thức đó.
* Biến thực thể (Instance Variables): Biến được khai báo bên trong lớp nhưng ngoài phương thức. Biến này không được khai báo là static. Giá trị của nó là cụ thể cho mỗi thực thể và không được chia sẻ giữa các thực thể.
* Biến tĩnh (Static Variables): Biến được khai báo là static. Nó không thể là biến cục bộ. Bạn có thể tạo một bản sao duy nhất của biến tĩnh và chia sẻ nó giữa tất cả các thực thể của lớp.
- Khi biên dịch gặp lỗi Exception in thread main java.lang.NoClassDefFoundError: myprogram. Lỗi này có nghĩa: Đường dẫn chương trình sai
- Có 4 dạng truy cập:
- Private: Chỉ có thể truy cập trong lớp chứa nó.
- Default: Chỉ có thể truy cập trong cùng một package. Nếu không khai báo Access Modifier, nó sẽ mặc định là Default.
- Protected: Có thể truy cập trong cùng một package và trong các lớp con ở các package khác.
- Public: Có thể truy cập ở mọi nơi, bao gồm trong lớp, ngoài lớp, trong package và ngoài package.
- Trong Java, có 4 kiểu số nguyên:
* byte
* short
* int
* long
## 2. Android:
- Thư mục java trong Android Studio:
- Lưu tất cả các lớp Activity xử lý nghiệp vụ người dùng
- Cấu trúc của một dự án Android:
- java: Đây chính là nơi chứa mã nguồn Java và các package của dự án, ta có thể tạo các package ở đây và bên trong là các class
- res: thư mục chứa tất cả các tài nguyên được sử dụng trong ứng dụng như: hình ảnh (drawable), bố cục giao diện (layout), các chuỗi, màu sắc, kích thước… , trình đơn (menu), (values).
- manifests: chứa file AndroidManifest.xml và một số file dạng xml khác là file đặc tả ứng dụng.
- Là tệp tin dạng xml để kê khai, đặc tả những thông tin thiết yếu về ứng dụng của bạn với hệ thống Android.
- Mọi ứng dụng Android đều cần có file này. Hệ thống sẽ đọc file này lúc cài đặt để xác định các quyền cần cấp cho ứng dụng, các activity có trong ứng dụng, và nhiều tính năng khác.
- Các thành phần ứng dụng Android:
- Activity
- View
- Service
- Broatcast Receiver
- Content Provider
- Notification
- Intent
- Có 4 định hướng trên một thiết bị Android:
* Portrait: Màn hình được hiển thị theo chiều dọc.
* Landscape: Màn hình được hiển thị theo chiều ngang.
* Reverse Portrait: Màn hình được hiển thị theo chiều dọc nhưng ngược lại so với Portrait.
* Reverse Landscape: Màn hình được hiển thị theo chiều ngang nhưng ngược lại so với Landscape.
- AndroidManifest có chức năng: Là tập tin, thiết lập các quyền, Activity, Service,...
- Thuộc tính android:editable trong EditText có chức năng:
- Cho phép/ không cho phép điều chỉnh text
- Theo mặc định trong android studio trong quá trình phát triển ứng dụng, thư mục được tạo cho các tệp xml là: res/values
### a. Activity:
- Là một cửa sổ (hay màn hình, form) nơi người dùng có thể tương tác với ứng dụng
- Một ứng dụng thường có một hoặc nhiều Activity, Activity được khởi chạy đầu tiên khi ứng dụng hoạt động là MainActivity
- Activity có thể hiển thị ở chế độ toàn màn hình hoặc ở dạng cửa số với kích thước nhất định
- Các Activity có thể gọi đến Activity khác, các Activity được gọi sẽ nhận được tương tác ở thời điểm đó
- Các trạng thái:
- Resumed: Đang trong trạng thái nhận tương tác
- Paused: Không thể tương tác nhưng người dùng vẫn nhìn thấy (một phần hoặc toàn phần)
- Stopped: Thực hiện ở chế độ ngầm
- Các hàm sự kiện trạng thái của Activity:
- onCreate() – được gọi khi Activity được khởi tạo
- onStart() – được gọi khi Activity bắt đầu hiện ra (chúng ta bắt đầu nhìn thấy giao diện)
- onResume() – bắt đầu nhận các tương tác với người dùng
- onPause()– được gọi khi activity bi dừng lại để chuyển qua activity khác
- onStop()–được gọi khi activity biến mất khỏi màn hình
- onDestroy() – được gọi khi activity bị hủy (hủy chủ động hoặc bị hủy bởi hệ thống trong trường hợp hệ điều hành xác nhận thiếu RAM)
- onRestart()– được gọi khi activity được khởi động lại sau khi đã bị dừng
- Tạo Activity cho ứng dụng
* Tạo lớp mới kế thừa (extend) từ những lớp cha như AppCompatActivity, Activity, FragmentActivity
* Xây dựng giao diện trong tài nguyên res/layout
* Khai báo Activity trong tập tin AndroidManifest.xml
* Tạo các hàm thực thi theo trạng thái Activity
### b. View:
* View là các thành phần giao diện được sử dụng để tạo ra các điều khiển trên màn hình cho phép tương tác với người dung hay hiển thị các thông tin cần thiết
* View bao gồm 2 dạng:
* View: Các thành phần giao diện đơn lẻ
* ViewGroup: Tập hợp nhiều thành phần đơn lẻ
* ViewGroup: 
* Một số đơn vị đo lường:
* dp/dip (Density-independent pixel): được khuyến nghị dùng trong hầu hết các trường hợp đặt kích thước của view trong layout.
* sp (Scale-independent pixel): đơn vị này tương tự dp, được dùng khi mô tả kích thước font chữ (font size)
* pt (Point)
* px (Pixel): đơn vị này không được khuyên dùng trong thiết kế giao diện ứng dụng vì giao diện sẽ hiển thị không đồng nhất trên các màn hình có độ phân giải khác nhau
#### b.1. View & Layout:
- LinerLayout:
- Orientation
- Horizontal (dạng hàng)
- Vertical (dạng cột)
- Có thể thiết lập thuộc tính: android:orientation=“…” trong file layout xml hoặc có thể thay đổi setOrientation() bằng mã khi chương trình đang chạy
- Fill Model:
- Cần thiết lập: android:layout_width và android:layout_height
- Giá trị có thể: Một số cụ thể, wrap-content, fill-parent, match-parent (độ lớn của đối tượng cha)
- Weight:
- android:layout_weight– trọng số để xác định tỉ lệ tương ứng phần không gian còn trống dành cho đối tượng (view)
- Giá trị có thể là 1,2,3,.. Mặc định là 0
- Magin & Padding
- android:layout_margin=“..“ : Cách lề bên ngoài
- android:padding=“…“ : Cách lề bên trong
- Gravity được dùng để xác định cách căn lề của các đối tượng trên màn hình.
* Mặc định thì các đối tượng sẽ căn lề phía trên, bên trái
* Khi cần căn lề, ta dung thuộc tính XML:
* android:layout_gravity=“…” (left, top, right, center)
* android:gravity=“…”
- Relative Layout:
- 
- Absolute Layout:
- 
- Table Layout:
- Để cho phép một thành phần nào đó chiếm từ 2 ô trở lên ta sử dụng thuộc tính android:layout_span=”số ô”
- Để cho phép một thành phần nằm cụ thể ở một ô nào đó ta sử dụng thuộc tính android:layout_column=”x”, trong đó x là chỉ số cột được tính từ 0
- Để cho phép một cột được giãn rộng ra hết khoảng trống có thể, ta sử dụng thuộc tính android:stretchColumns =“x”, trong đó x là chỉ số cột được tính từ 0
- 
- ScrollView Layout
- Khi nội dung cần hiển thị lớn hơn khuôn khổ của một màn hình ta có thể sử dụng giao diện cuộn ScrollView để cuộn và xem thông tin.
- Trong trường hợp dung thanh cuộn ngang, ta thay ScrollView bằng HorizontalScrollView.
#### b.2. Selection View/Widget
- Các Radio Button và Check Button được dung để chọn lựa trong một tập nhỏ các lựa chọn
- Khi tập lựa chọn lớn hơn, người ta thường dùng các view/widget như Listbox, ComboBox, DropDown List, Picture Gallery …
- Android cung cấp một số dạng Data Adapter - là cầu nối giữa các thành phần View/Widget và nguồn dữ liệu. Các danh mục lựa chọn của View/Widget được tự động chèn vào thông qua Adapter, nội dung lấy từ một nguồn bên ngoài như một mảng hoặc cơ sở dữ liệu.
- Các View/Widget thể hiện một danh sách các lựa chọn, có thể được kết nối và điều khiển bởi một Adapter gọi là Selection View/Widget
- Các Selection View/Widget chính là: List View, Grid View, Spinner…
- Các dạng Data Adapter phổ biến:
* ArrayAdapter
* SpinnerAdapter: tương đương với DropDown
* GridView
* GridView là một ViewGroup hiển thị thông tin theo 2 chiều dưới dạng lưới có thể cuộn được
* Các mục trong danh mục dạng lưới có thể tự động chèn vào bằng cách sử dụng ListAdapter
* AutoCompleteTextView: hỗ trợ cho người dùng những gợi ý liên quan khi nhập vào trường EditText. Những gợi ý đó sẽ được hiển thị trong một menu thả xuống từ đó người dùng có thể chọn một mục để thay thế cho nội dung của mình vừa nhập vào.
#### b.3. Date, time, tab
- Date:
- Android cung cấp các đối tượng như (DatePicker, TimePicker) và các hộp thoại dialog (DatePickerDialog, TimePickerDialog) giúp người sử dụng nhập/chọn ngày và giờ. DatePicker và DatePickerDialog cho phép ta đặt giá trị mặc định ban đầu theo năm, tháng, ngày.
- Giá trị của tháng chạy từ 0 (tháng 1) tới 11 (tháng 12).
- Các view này đều có một đối tượng trả về (OnDateChangedListener hoặc OnDateSetListener) khi người dùng chọn một ngày khác với ngày mặc định.
- Time:
- TimePicker, TimePickerDialog
- OnTimeChangedListener hoặc OnTimeSetListener
- Clock: Android cung cấp 2 loại đồng hồ là Digital Clock và Analog Clock
- Tab:
- Thường được sử dụng để tạo ra một giao diện người dùng có thể chuyển đổi giữa các trang khác nhau một cách nhanh chóng.
- TabHost là vùng chứa chính cho các nút tab và nội dung tab
- TabWidget là hàng các nút tab, có thể chứa nhãn văn bản, biểu tượng
- FrameLayout là vùng chứa cho nội dung tab
#### b.4. Menu:
- Menu Context:
- Menu Context là một menu xuất hiện khi người dùng thực hiện nhấp giữ trên một phần tử.
- Nó cung cấp các hành động ảnh hưởng tới nội dung hoặc khung ngữ cảnh được chọn.
- Menu Popup:
- Menu Popup sẽ hiển thị danh sách các mục trong một danh sách thẳng đứng được neo vào dạng xem đã gọi ra menu.
- Nên cung cấp một phần tràn gồm các hành động liên quan tới nội dung cụ thể hoặc nhằm cung cấp các tùy chọn cho phần thứ hai của một lệnh.
- Các hành động trong một menu popup không nên trực tiếp ảnh hưởng tới nội dung tương ứng.
- Tạo nhóm Menu:
- Nhóm menu là một tập hợp các mục menu chia sẻ những đặc điểm nhất định. Với một nhóm, ta có thể:
- Hiển thị hoặc ẩn tất cả các mục bằng setGroupVisible()
- Kích hoạt hoặc vô hiệu hóa tất cả các mục bằng setGroupEnabled()
- Quy định xem tất cả các mục có thể chọn hay không bằng setGroupCheckable()
- Ta cũng có thể tạo một nhóm bằng cách lồng các phần tử `<item>` bên trong một phần tử `<group>` vào tài nguyên menu hoặc bằng cách quy định một ID nhóm bằng phương pháp add()
### c. Service:
* Service được sử dụng để thực hiện các tác vụ cần nhiều thời gian, chạy ở chế độ ngầm và thường không cần giao diện hiển thị
* Service có thể khởi chạy và hoạt động xuyên suốt ngay cả khi ứng dụng không hoạt động
* Android cung cấp lớp Service nhằm tạo ra các thành phần của ứng dụng xử lý các hành động có thời gian sống lâu hoặc không cần tới giao diện người dùng
* Yêu cầu thực thi ngầm
* Có thể gắn một thành phần với một Service để giao tiếp và trao đổi giữa các tiến trình
* VD: chạy nhạc, I/O, ...
* Không ảnh hưởng bởi vòng đời của Activity
* Foreground Services:
* Thực hiện một số hành động người dùng có thể thấy
* Phải hiển thị notification
* Tiếp tục chạy ngay cả khi người dùng không tương tác
* VD: phát một bài hát, ...
* Background Services
* Thực hiện một số hành động người dùng không trực tiếp nhìn thấy
* VD: một ứng dụng sử dụng background service để nén dữ liệu lưu trữ
* Bound Services
* Một service được bound khi có một thành phần của ứng dụng bind tới service đó
* Cung cấp giao diện tương tác client - server
* Không tồn tại khi không có thành phần nào bind tới
* 
* 
* Gửi Notification
* Khi một service chạy, có thể gửi notification tới người dùng sử dụng
* **Toast Notifications**: xuất hiện trong một thời gian ngắn rồi biến mất
* **Status Bar Notifications**: người dùng có thể thực hiện hành động, phù hợp với background service
* Vòng đời của service phụ thuộc loại service:
* Started Service: được tạo khi gọi phương thức startService() cho tới khi gọi stopSelf() bởi chính service hoặc gọi stopService() bởi thành phần khác. Khi dừng, hệ thống hủy service
* Bound Service: được tạo khi một thành phần khác gọi bindService(), client sau đó giao tiếp thông qua IBinder, đóng kết nối bằng phương thức unbindService(). Khi toàn bộ client unbind một service, hệ thống sẽ tự động hủy service
### d. Broadcast Receiver:
* Thành phần ứng dụng cho phép truyền tải các thông báo trong phạm vi toàn hệ thống, không có giao diện nhưng có thể thực hiện thông báo thông qua thanh trạng thái
* Broadcast Receiver truyền thông báo ở 2 dạng:
* Hệ thống: các thông báo được truyền trực tiếp từ hệ thống như tắt màn hình, pin yếu, thay đổi kết nối mạng…
* Ứng dụng: truyền thông báo đến các thành phần trong ứng dụng, khởi động Service, tải nội dung đến ứng dụng
* 
* Lắng nghe Broadcast Intents
* Phải được đăng ký
* Sử dụng Intent filter để chỉ rõ Intent nào receiver đang lắng nghe
* Kế thừa lớp BroadcastReceiver và ghi đè phương thức onReceive()
### e. Content Provider:
* Content Provider cung cấp cách thức truy cập tập hợp các dữ liệu ứng dụng. Dữ liệu có thể lưu trữ ở nhiều dạng: tệp tin, SQLite, tài nguyên Web và rất nhiều mục lưu trữ khác
* Trong Android, một số Content Provider được xây dựng sẵn như: Danh bạ, tài nguyên đa phương tiện, lịch v.v
* 
* Content provider cung cấp dữ liệu cho các ứng dụng bên ngoài dưới dạng bảng tương tự như bảng trong cơ sở dữ liệu quan hệ.
* Content provider cung cấp giao diện cho việc công bố và tiêu thụ dữ liệu thông qua mô hình đánh địa chỉ URI sử dụng content://
* Content provider có thể được chia sẻ giữa các ứng dụng, cho phép xem và sửa đổi các bản ghi từ các ứng dụng có đủ quyền.
* Ứng dụng có thể tự định nghĩa content provider để tích hợp và mở rộng dữ liệu trong các ứng dụng mới.
* 
* Tạo content provider
* Xác định nhu cầu tạo content provider:
* Để cung cấp dữ liệu phức tạp hoặc tập tin cho các ứng dụng khác
* Cho phép người dùng sao chép dữ liệu phức tạp sang ứng dụng khác
* Cung cấp gợi ý tìm kiếm
* Cung cấp dữ liệu cho widget
* Không cần content provider nếu chỉ sử dụng cơ sở dữ liệu hay các dạng lưu trữ lâu dài khác trong chính ứng dụng
* Các bước chính xây dựng content provider
* Thiết kế dữ liệu thô. Content provider cung cấp dữ liệu theo hai cách:
* Dữ liệu tệp tin: như ảnh, phim
* Dữ liệu có cấu trúc: thường ở dạng bảng, hay mảng.
* Cài đặt cụ thể lớp ContentProvider và các phương thức cần thiết
* Xác định xâu authority, content URI và tên các cột của provider.
### f. Notification:
* Notification là chức năng gửi thông báo tới người dùng thông qua khu vực thông báo trên thanh trạng thái
* Giao diện của thông báo không thuộc giao diện của ứng dụng mà thuộc về HĐH nhưng ứng dụng có thể tùy biến được thông qua một số phương thức mà Android cung cấp sẵn
### g. Intent:
* Intent là đối tượng mang thông điệp cho phép tạo ra các yêu cầu, hành động giữa các thành phần trong ứng dụng hay giữa các ứng dụng khác nhau
* Intent thường được sử dụng trong 3 trường hợp sau:
* Khởi động Activity
* Khởi động Service
* Chuyển phát thông tin cho Broadscast Receive
* Các tham số chính của Intent là:
- Action: Các action dựng sẵn như ACTION_VIEW, ACTION_EDIT, ACTION_MAIN, … hoặc các activity do người dùng xây dựng
- Data: Dữ liệu chính để hoạt động, chẳng hạn như số điện thoại được gọi (được biểu thị bằng Uri).
- Sử dụng Intents để chạy service:
- Khởi động loại service chỉ chạy một lần bằng cách truyền một Intent vào phương thức startService()
- Hoặc có thể bind tới service bằng cách truyền một Intent vào phương thức bindService()
- Sử dụng Intents để gửi thông điệp broadcast
- Hệ thống gửi vô số thông điệp broadcasts cho những sự kiện hệ thống
- Gửi broadcasts tới ứng dụng bằng cách truyền Intent tới phương thức sendBroadcast() hoặc sendOrderedBroadcast()
- 2 kiểu Intents:
- Explicit intents:
- Chỉ định ứng dụng sẽ thỏa mãn intents
- Cung cấp tên package của ứng dụng hoặc tên lớp của thành phần đích
- Thông thường để mở các thành phần trong chính ứng dụng
- VD: khởi động một service để download file trên background, ...
- Implicit intents:
- Không chỉ đích danh thành phần nào trong ứng dụng
- Định nghĩa một hành động tổng quát, cho phép thành phần của ứng dụng khác xử lý
- VD: gửi intent yêu cầu một ứng dụng khác hiển thị một vị trí cụ thể trên bản đồ, ...
- 
### h. Lưu trữ dữ liệu:
- Các tiêu chí lựa chọn giải pháp lưu trữ dữ liệu:
* Khả năng truy cập dữ liệu
* Từ:
* Chính ứng dụng đó
* Ứng dụng khác/Người dùng
* Khi ứng dụng:
* Đã gỡ cài đặt hoặc chưa
* Đã kết nối mạng hoặc chưa
* Dung lượng lưu trữ
* Shared Preferences:
* Shared preferences không chỉ để lưu trữ thiết lập của người dùng
* PreferenceActivity được sử dụng để tạo thiết lập người dùng
* Được lưu trữ trong tệp XML trên thiết bị có đường dẫn như sau: /data/data/<application’s package name>/shared_prefs
* Sẽ bị xóa bỏ khi gỡ cài đặt ứng dụng
* Android File System:
* 
* 
* Bộ nhớ trong:
* Có thể lưu trực tiếp các tệp tin vào bộ nhớ trong của thiết bị.
* Thông thường, các tệp tin lưu vào bộ nhớ trong sẽ là private đối với ứng dụng của bạn, các ứng dụng khác không thể truy cập.
* Các tệp tin này được liên kết tới ứng dụng của bạn và bị xóa khi ứng dụng bị gỡ bỏ cài đặt.
* Bộ nhớ ngoài:
* Các thiết bị Android cung cấp "bộ nhớ ngoài" được chia sẻ để lưu trữ các tệp tin.
* Có thể là các thiết bị lưu trữ có thể tháo bỏ (ví dụ SD card) hoặc bộ nhớ trong (không thể tháo bỏ).
* Tệp tin được lưu trữ trong bộ nhớ ngoài là world-readable, có thể bị sử đổi khi người dùng bật USB mass storage để chuyển tệp tin trên máy tính.
* SQLite:
* Android có sẵn hỗ trợ cho cơ sở dữ liệu SQLite, có trong gói android.database.sqlite
* Phù hợp với các dữ liệu lặp hay có cấu trúc, ví dụ dữ liệu liên lạc.
* Android không áp dụng bất kì giới hạn nào ngoài các khái niệm chuẩn của SQLite
* Khuyến khích có sử dụng một giá trị khóa tăng dần như một ID duy nhất hỗ trợ cho việc tăng tốc tìm kiếm.
* Android lưu dữ liệu trên một vùng đĩa private được liên kết với ứng dụng.
- Realm database cho Android:
- Giải pháp thay thế SQlite
- Realm nhanh hơn khoảng 2-10 lần trong các tác vụ đọc, ghi so với SQLitethuần và một số thư viện ORM phổ biến hiện nay.
- Network:
- Lưu dữ liệu trên máy tính khác/đám mây, truy cập qua mạng
- Để thực hiện các thao tác liên quan tới mạng, sử dụng các gói sau:
- java.net.*
- android.net.*
### i. Thiết bị trong Android:
- Sensors:
- Motion sensors
- Cảm biến chuyển động
- Đo gia tốc, hướng chuyển động, ...
- Environmental sensors
- Đo các thông số môi trường: nhiệt độ, độ ẩm, ...
- Position sensors
- Đo vị trí vật lý của thiết bị
- Wifi:
- Nhiều phương thức kết nối Internet: Wi-fi, GPRS, 3G, LTE, …
- Android broadcasts Intents cung cấp APIs cho phép theo dõi và quản lý kết nối Internet
- Kết nối mạng chủ yếu được xử lý thông qua ConnectivityManager service
- Telephony services
- Cho phép truy cập phần cứng phục vụ việc đàm thoại
- Tạo bộ quay số riêng, xử lý cuộc gọi trong ứng dụng, …
- Kiểm soát cuộc gọi và các dịch vụ
- Camera
- Bluetooth
### k. Đa phương tiện:
- Âm thanh và hình ảnh:
- Android hỗ trợ rất nhiều định dạng âm thanh và hình ảnh khác nhau.
- Các loại hình phát lại (playback) có thể cài đặt:
- Từ tài nguyên thô: các tập tin âm thanh, hình ảnh
- Streaming từ mạng: từ tập tin hoặc ghi và phát lại trực tiếp (các ứng dụng trò chuyện)
- Lớp MediaPlayer được sử dụng để phát lại; lớp MediaRecorder được sử dụng để thu lại
- Lớp MediaPlayer là lớp chính cung cấp API cho phép chơi nhạc và video
- MediaPlayer hỗ trợ sử dụng các nguồn như sau:
- Tài nguyên cục bộ
- URI nội tại (internal URI)
- URI bên ngoài (streaming)
- Từ Android 8.0, MediaPlayer hỗ trợ phát các nguồn được bảo vệ bởi DRM (Digital Rights Management)
- Lớp AudioManager quản lý các nguồn âm thanh và đầu ra trên thiết bị
- Để hiển thị hình ảnh trong Android, bạn có thể sử dụng thành phần ImageView
- Lưu ý: Hình ảnh bạn muốn hiển thị phải được đặt trong thư mục res/drawable của dự án Android của bạn.
- Dịch vụ định vị:
- Gói android.location
- Google Location Services tốt hơn
- Google Play services được cài đặt sẵn
- Vị trí lấy được bao gồm các thông số kinh độ, vĩ độ và độ chính xác
- 
- Bản đồ:
- Sử dụng Google Maps Android API
- Không đi kèm theo Android mà đi kèm với Google Play services
- 
### l. Webview:
- WebView là phần mở rộng của Android
- WebView không đầy đủ chức năng của một trình duyệt thông thường như điều hướng hay thanh địa chỉ. WebView chỉ hiển thị một trang web.
- WebView thường được dùng khi:
- Hiển thị các thông tin cần được cập nhật như thỏa thuận người dùng hay hướng dẫn sử dụng.
- Các giao diện phức tạp có thể dễ dàng hơn khi hiển thị bằng web thay vì Android layout.
- WebView thường được thêm vào dưới dạng 1 thành phần layout của ứng dụng
## 3. Các lệnh linux cơ bản
- pwd: tìm đường dẫn của thư mục hiện tại (folder) mà bạn đang ở trong đó.
- cd: chuyển hướng trong hệ thống tập tin Linux
- ls: liệt kê các tập tin trong thư mục.
- cat: xem nội dung file
- cp: sao chép file
- mv: di chuyển file
- mkdir: tạo file mới
- rmdir: xoá thư mục(chỉ cho phép xoá thư mục rỗng)
- rm: xoá thư mục và nội dung bên trong
- locate: tìm kiếm file
- find: tìm kiếm file trong một thư mục nhất định (bao gồm cả trong thư mục con)
- sudo: cho phép thực hiện quyền quan trị
- tar: nén file
- chmod: thay đổi các quyền thực thi đối với file và thư mục
- kill: tắt tiến trình
- wget: tải file từ internet
- echo: chuyển dữ liệu vào một file
## 4. Các dạng tấn công mạng:
* Tấn công bằng phần mềm độc hại (Malware attack):
* Hacker sẽ tiến hành tấn công người dùng thông qua các lỗ hổng bảo mật hoặc lừa người dùng Click vào một đường Link hoặc Email để cài phần mềm độc hại tự động vào máy tính.
* Spyware (phần mềm gián điệp)
* Ransomware (mã độc tống tiền)
* Virus
* Worm (phần mềm độc hại lây lan với tốc độ nhanh)
* Tấn công giả mạo (Phishing attack):
* Hacker giả mạo thành một đơn vị/cá nhân uy tín để chiếm lòng tin của người dùng, thông thường qua email.
* Giả mạo Email
* Giả mạo Website
* Tấn công trung gian (Man-in-the-middle attack):
* Hacker đặt mình vào giữa người dùng và máy chủ để ngắt kết nối hoặc thay đổi thông tin.
* Sniffing: Sniffing hoặc Packet Sniffing là kỹ thuật được sử dụng để nắm bắt các gói dữ liệu vào và ra của hệ thống. Packet Sniffing cũng tương tự với việc nghe trộm trong điện thoại. Sniffing được xem là hợp pháp nếu được sử dụng đúng cách. Doanh nghiệp có thể thực hiện để tăng cường bảo mật.
* Packet Injection: Kẻ tấn công sẽ đưa các gói dữ liệu độc hại vào với dữ liệu thông thường. Bằng cách này, người dùng thậm chí không nhận thấy tệp/phần mềm độc hại bởi chúng đến như một phần của luồng truyền thông hợp pháp. Những tập tin này rất phổ biến trong các cuộc tấn công trung gian cũng như các cuộc tấn công từ chối dịch vụ.
* Gỡ rối phiên: Bạn đã từng gặp thông báo “Phiên hoạt động đã hết hạn” chưa? Nếu đã từng thực hiện thanh toán trực tuyến hoặc điền vào biểu mẫu, hẳn bạn sẽ biết thuật ngữ này. Khoản thời gian từ lúc bạn đăng nhập vào tài khoản ngân hàng của bạn đến khi đăng xuất khỏi tài khoản đó được gọi là một phiên. Các phiên này là mục tiêu của tin tặc. Bởi chúng có khả năng chứa thông tin kín đáo. Trong hầu hết các trường hợp, một Hacker thiết lập sự hiện diện của mình trong phiên. Và cuối cùng nắm quyền kiểm soát nó. Các cuộc tấn công này có thể được thực thi theo nhiều cách khác nhau.
* Loại bỏ SSL: SSL Stripping hoặc SSL Downgrade Attack là một loài hiếm khi nói đến các cuộc tấn công MiTM, nhưng cũng là một trong những nguy hiểm nhất. Chứng chỉ SSL/TLS giữ liên lạc của chúng tôi an toàn trực tuyến thông qua mã hóa. Trong các cuộc tấn công SSL, kẻ tấn công loại bỏ kết nối SSL/TLS và chuyển giao thức từ HTTPS an toàn sang HTTP không an toàn.
* Tấn công từ chối dịch vụ (DoS và DDoS):
* Hacker sẽ gửi một lượng lớn yêu cầu đến máy chủ, khiến máy chủ không thể xử lý và dẫn đến việc người dùng không thể truy cập.
* Tấn công gây nghẽn mạng (UDP Flood và Ping Flood)
* Mục tiêu: Gây quá tải hệ thống mạng bằng lượng truy cập lớn đến từ nhiều nguồn để chặn các truy cập thực của người dùng.
* Phương thức: Gây nghẽn đối tượng bằng các gói UDP và ICMP.
* Tấn công SYN flood (TCP)
* Mục tiêu: Gây cạn tài nguyên máy chủ, ngăn chặn việc nhận các yêu cầu kết nối mới.
* Phương thức: Lợi dụng quá trình “bắt tay” 3 chặng TCP, gửi đi yêu cầu SYN đến máy chủ và được phản hồi bằng một gói SYN-ACK. Nhưng không gửi lại gói ACK, điều này khiến cho tài nguyên máy chủ bị sử dụng hết vào việc đợi gói ACK gửi về.
* Tấn công khuếch đại DNS
* Mục tiêu: Làm quá tải hệ thống bằng phản hồi từ các bộ giải mã DNS.
* Phương thức: Mạo danh địa chỉ IP của máy bị tấn công để gửi yêu cầu nhiều bộ giải mã DNS. Các bộ giải mã hồi đáp về IP của máy có kích thước gói dữ liệu có thể lớn hơn kích thước của yêu cầu tới 50 lần.
* Tấn công cơ sở dữ liệu (SQL injection):
* Hacker sẽ chèn các câu lệnh SQL độc hại vào các truy vấn SQL để lấy thông tin từ cơ sở dữ liệu.
* Khai thác lỗ hổng Zero-day (Zero day attack):
* Hacker sẽ khai thác các lỗ hổng chưa được biết đến trong phần mềm để tấn công.
* Tấn công mật khẩu:
* Có 3 dạng tấn công mật khẩu phổ biến:
* Brute Force Attack (tấn công dò mật khẩu): kẻ tấn công sử dụng một công cụ mạnh mẽ, có khả năng thử nhiều username và password cùng lúc (từ dễ đến khó) cho tới khi đăng nhập thành công.
* Dictionary Attack (tấn công từ điển): là một biến thể của Brute Force Attack, tuy nhiên kẻ tấn công nhắm vào các từ có nghĩa thay vì thử tất cả mọi khả năng
* Key Logger Attack (tấn công Key Logger): đúng như cái tên của nó, tin tặc lưu lại lịch sử các phím mà nạn nhân gõ, bao gồm cả ID, password hay nhiều nội dung khác.
* Tấn công vào chuỗi cung ứng phần mềm:
* Hacker sẽ tấn công vào quá trình phân phối phần mềm để thay đổi phần mềm.
* Tấn công vào cloud:
* Hacker sẽ tấn công vào dịch vụ lưu trữ đám mây để lấy thông tin.
* Tấn công thiết bị di động:
* Hacker sẽ tấn công vào thiết bị di động để lấy thông tin hoặc kiểm soát thiết bị.
## 5. MySQL:
### a. Câu lệnh truy vấn:
* Câu lệnh truy vấn:
```
SELECT <Danh sách các cột>
FROM <Danh sách Bảng>
WHERE <Các điều kiện>
GROUP BY <Tên cột>
HAVING <Điều kiện dựa trên GROUP BY>
ORDER BY <Danh sách cột>
LIMIT start, limit
```
* Trong đó:
* SELECT field1, field2, field3, ... là danh sách các fields cần lấy
* FROM table_name tên table cần lấy
* WHERE <dieu_kien_loc> là các điều kiện để lấy các dòng dữ liệu
* ORDER BY field_name, ASC|DESC: là cách sắp xếp cho field_name theo kiểu ASC (tăng dần) hoặc DESC (giảm dần)
* LIMIT start, limit là lấy limit records kể từ record thứ start trong kết quả.
### b. Join:
* Cú pháp:
```
SELECT column_list
FROM t1
INNER JOIN t2 ON join_condition1
INNER JOIN t3 ON join_condition2
```
* Join: lấy hai phần giao nhau
* Left join: lấy phần bên trái, nếu ko tìm đc tương ứng ở bên phải, sẽ trả ra null
* Right join
### c. Trigger:
* Triggers là quá trình tự động thi hành các lệnhSQL hoặc SP sau hoặc trước các lệnh INSERT, UPDATE, hoặc DELETE.
* Các ứng dụng có thể bao gồm: lưu lại thay đổi hoặc cập nhật dữ liệu các bảng khác.
* Trigger chạy sau mỗi câu lệnh cập nhật bảng do đó có thể thêm tải với CSDL
* Cú pháp: 
* Ví dụ: 
### d. View (Khung nhìn):
* Khung nhìn là các truy vấn SELECT được lưu. Có thể thực hiện truy vấn trên chính khung nhìn
* 
* Ví dụ:
* 
* Ưu điểm:
* An ninh– Cho phép người quản trị CSDL (DBA) cung cấp cho người sử dụng chỉ những dữ liệu cần thiết
* Đơn giản hóa – Các khung nhìn cũng có thể sử dụng để ẩn và sử dụng lại các truy vấn phức tạp