I. Android COMPONENTS
1. Kể tên các callback của activity lifecycle
onCreate -> onStart -> onResume -> onPause -> onStop -> onDestroy
2. onSaveInstanceState và onRestoreInstanceState được gọi khi nào, tại sao nó quan trọng?
Khi target android P onSaveInstanceState được gọi sau onStop, trước đó từ Android 3.0 (HoneyComb) sẽ được gọi trước onStop nhưng không chắc chắn gọi trước hay sau onPause, onRestoreInstanceState được gọi sau onStart (chỉ gọi khi activity recreate).
Khi các activity rơi vào trạng thái Stoped, Android sẽ luôn luôn gọi onSaveInstanceState để lưu các thông tin cần thiết vào bundle. Lý do của việc làm này là 1 process hoàn toàn có thể bị Android Framework quyết định giải phóng memory để nhường cho những ứng dụng khác cần thiết. Sau khi người dùng quay trở lại ứng dụng Android sẽ recreate lại activity, onRestoreInstanceState sẽ được call sau onStart
onCreate -> onStart -> onResume -> onPause -> onStop -> onDestroy
2. onSaveInstanceState và onRestoreInstanceState được gọi khi nào, tại sao nó quan trọng?
Khi target android P onSaveInstanceState được gọi sau onStop, trước đó từ Android 3.0 (HoneyComb) sẽ được gọi trước onStop nhưng không chắc chắn gọi trước hay sau onPause, onRestoreInstanceState được gọi sau onStart (chỉ gọi khi activity recreate).
Khi các activity rơi vào trạng thái Stoped, Android sẽ luôn luôn gọi onSaveInstanceState để lưu các thông tin cần thiết vào bundle. Lý do của việc làm này là 1 process hoàn toàn có thể bị Android Framework quyết định giải phóng memory để nhường cho những ứng dụng khác cần thiết. Sau khi người dùng quay trở lại ứng dụng Android sẽ recreate lại activity, onRestoreInstanceState sẽ được call sau onStart
3. Khi show dialog từ activity thì callback lifecycle nào sẽ được gọi?
Không lifecycle callback nào được gọi cả
4. Khi activity request permission, dialog permission show thì Activity sẽ gọi callback nào?
Activity sẽ gọi onPause và không gọi onStop, có thể sẽ được hỏi thêm khi nào Activity chỉ gọi onPause mà không gọi onStop. Trường hợp này khá đặc biệt gồm 3 case chính:
5. Kể tên các launch mode của Activity
6. Những yếu tố nào quyết định đến việc process nào sẽ bị system kill khi low memory
Android System đánh giá dựa trên priority của process. được sắp xếp theo
Foreground Process -> Visible process -> Service process -> Cached Process
https://developer.android.com/guide/components/activities/process-lifecycle
7. Cách truyền/nhận dữ liệu khi start và kết thúc activity.
Để gửi/nhận dữ liệu trả về ta gửi thông qua Intent và Bundle. Activity mới sẽ nhận dữ liệu thông qua intent khởi tạo bằng method getIntent() bên trong sẽ chứa extras bundle. Khi yêu cầu result từ Activity mới, ta dùng phương thức startActivityForResult(), Activity mới trả dữ liệu về thông qua phương thức setResult(ResultCode, Intent).
8. Tại sao khi start activity gửi dữ liệu phải dùng Bundle
Về cơ bản Bundle là lớp đặc biệt trong Android dùng để lưu trữ primative type (byte, int, long, String ...) và các serialize object (các class implements từ Serializable hoặc Parcelable).
1 Activity mới được start thông qua ActivityManagerService (1 service của Android System) chứ không phải được start thông qua ứng dụng của chúng ta. Chính vì điều này dẫn tới process của App và process của ActivityManagerService là khác nhau, để process khác có thể hiểu được các object bên trong App thì nó phải support Serialize/Deserialize. Trong Android communication giữa các process chủ yếu dùng Bundle (IPC).
9. So sánh Serializable và Parcelable, cái nào nhanh hơn vì sao?
Parcelable cho performance tốt hơn đồng thời memory cũng consume ít hơn. Nguyên nhân chính là khi implement Parcelable chúng ta đã định nghĩa sẵn thứ tự đọc ghi cũng như mô tả kiểu dữ liệu, ngược lại Serializable dùng cơ chế Reflection dẫn tới memory nhiều hơn, Garbage Collection phải hoạt động nhiều hơn.
10. Fragment là gì? ưu điểm của Fragment? nó khác Custom View ở điểm nào?
Fragment là 1 thành phần thể hiện 1 phần hoặc toàn bộ UI bắt buộc phải liên kết với Activity. Lifecycle của Fragment gắn Host Activity
Ưu điểm của Fragment
11. Activity display Fragment bằng cách nào
Thông qua FragmentTransaction, FragmentManager và phương thức add, replace
12. Kể tên Fragment Lifecycle
onAttach -> onCreate -> onCreateView -> onActivityCreate -> onStart -> onResume
-> onPause -> onStop -> onDestroyView -> onDestroy
13. Sự khác biệt giữa Add và Replace Fragment
Add Fragment thì Lifecycle của Fragment hiện tại gần như không thay đổi
Replace Fragment thì FragmentManager sẽ remove UI của Fragment hiện tại thay nó bằng UI của Fragment mới được khởi tạo. Dựa trên việc nó có được addToBackStack không Fragment Manager sẽ quyết định việc hủy hoàn toàn Fragment cũ hoặc giữ Instance của nó tồn tại trong Fragment BackStack.
14. Điều gì sẽ xảy ra khi Activity chứa nhiều Fragment bị recreate?
Activity sẽ re init lại toàn bộ những Fragment trước đó đồng thời giữ nguyên BackStack, tức là Fragment nào nằm trên cùng vẫn sẽ được hiển thị. Để khắc phục tình trạng này thì vẫn cần handle onSaveInstanceState và onRestoreInstanceState giống như Activity cho từng Fragment để lưu lại các trạng thái quan trọng.
15. FragmentActivity và Fragment class chứa các loại fragment manager nào? chúng được sử dụng như thế nào?
FragmentActivity:
Không lifecycle callback nào được gọi cả
4. Khi activity request permission, dialog permission show thì Activity sẽ gọi callback nào?
Activity sẽ gọi onPause và không gọi onStop, có thể sẽ được hỏi thêm khi nào Activity chỉ gọi onPause mà không gọi onStop. Trường hợp này khá đặc biệt gồm 3 case chính:
- Multi window mode enable
- Một phần ứng dụng bị ứng dụng khác che lên (không che toàn bộ), a purchase dialog, a runtime permission dialog, a third-party login dialog
- Intent chooser, ví dụ share dialog
5. Kể tên các launch mode của Activity
- standard: Normal behavior, new activity sẽ luôn đc tạo mới và đẩy lên trên cùng backstack, và được pop khỏi backstack khi bị remove (khi người dùng nhấn back hoặc activity finnish)
- singleTop: Nếu một instance của Activity đang trên top của backstack thì Android system sẽ cập nhật thông tin qua onNewIntent thay vì tạo mới và push lên đầu backstack.
- singleTask: Nếu trong task chưa tồn tại instance của Activity thì nó sẽ được khởi tạo và trở thành root task, nếu đã tồn tại thì hệ thống sẽ cập nhật thông qua onNewIntent. khác với singleTop luôn chỉ có 1 instance của activity được xuất hiện trong task.
- singleInstance: giống với single task, ngoại trừ việc không có bất cứ activity nào khác được tạo và nằm trong cùng task với activity set launch mode là singleInstance
6. Những yếu tố nào quyết định đến việc process nào sẽ bị system kill khi low memory
Android System đánh giá dựa trên priority của process. được sắp xếp theo
Foreground Process -> Visible process -> Service process -> Cached Process
https://developer.android.com/guide/components/activities/process-lifecycle
7. Cách truyền/nhận dữ liệu khi start và kết thúc activity.
Để gửi/nhận dữ liệu trả về ta gửi thông qua Intent và Bundle. Activity mới sẽ nhận dữ liệu thông qua intent khởi tạo bằng method getIntent() bên trong sẽ chứa extras bundle. Khi yêu cầu result từ Activity mới, ta dùng phương thức startActivityForResult(), Activity mới trả dữ liệu về thông qua phương thức setResult(ResultCode, Intent).
8. Tại sao khi start activity gửi dữ liệu phải dùng Bundle
Về cơ bản Bundle là lớp đặc biệt trong Android dùng để lưu trữ primative type (byte, int, long, String ...) và các serialize object (các class implements từ Serializable hoặc Parcelable).
1 Activity mới được start thông qua ActivityManagerService (1 service của Android System) chứ không phải được start thông qua ứng dụng của chúng ta. Chính vì điều này dẫn tới process của App và process của ActivityManagerService là khác nhau, để process khác có thể hiểu được các object bên trong App thì nó phải support Serialize/Deserialize. Trong Android communication giữa các process chủ yếu dùng Bundle (IPC).
9. So sánh Serializable và Parcelable, cái nào nhanh hơn vì sao?
Parcelable cho performance tốt hơn đồng thời memory cũng consume ít hơn. Nguyên nhân chính là khi implement Parcelable chúng ta đã định nghĩa sẵn thứ tự đọc ghi cũng như mô tả kiểu dữ liệu, ngược lại Serializable dùng cơ chế Reflection dẫn tới memory nhiều hơn, Garbage Collection phải hoạt động nhiều hơn.
10. Fragment là gì? ưu điểm của Fragment? nó khác Custom View ở điểm nào?
Fragment là 1 thành phần thể hiện 1 phần hoặc toàn bộ UI bắt buộc phải liên kết với Activity. Lifecycle của Fragment gắn Host Activity
Ưu điểm của Fragment
- Chia nhỏ logic trong Activity, tránh Activity hell
- Reused UI giữa các Activity
- Hỗ trợ việc thực hiện giao diện trên tablet dễ dàng hơn. tránh duplicated code.
11. Activity display Fragment bằng cách nào
Thông qua FragmentTransaction, FragmentManager và phương thức add, replace
12. Kể tên Fragment Lifecycle
onAttach -> onCreate -> onCreateView -> onActivityCreate -> onStart -> onResume
-> onPause -> onStop -> onDestroyView -> onDestroy
13. Sự khác biệt giữa Add và Replace Fragment
Add Fragment thì Lifecycle của Fragment hiện tại gần như không thay đổi
Replace Fragment thì FragmentManager sẽ remove UI của Fragment hiện tại thay nó bằng UI của Fragment mới được khởi tạo. Dựa trên việc nó có được addToBackStack không Fragment Manager sẽ quyết định việc hủy hoàn toàn Fragment cũ hoặc giữ Instance của nó tồn tại trong Fragment BackStack.
14. Điều gì sẽ xảy ra khi Activity chứa nhiều Fragment bị recreate?
Activity sẽ re init lại toàn bộ những Fragment trước đó đồng thời giữ nguyên BackStack, tức là Fragment nào nằm trên cùng vẫn sẽ được hiển thị. Để khắc phục tình trạng này thì vẫn cần handle onSaveInstanceState và onRestoreInstanceState giống như Activity cho từng Fragment để lưu lại các trạng thái quan trọng.
15. FragmentActivity và Fragment class chứa các loại fragment manager nào? chúng được sử dụng như thế nào?
FragmentActivity:
- supportFragmentManger dùng để quản lý việc hiển thị, back stack tương tác với các Fragment từ package library v4 và hiện tại là từ library androidX
- fragmentManager dùng quản lý việc hiển thị, back stack tương ứng với các Fragment từ package android.app.Fragment (deprecated)
- childFragmentManager để quản lý việc hiển thị, back stack với các child Fragment (inner Fragment)
- fragmentManager chính là fragment manager của Activity create Fragment đó
16. Làm sao để mở được activity của ứng dụng khác? phải config những gì?
- Set export Activity Manifest lên true, start activity thông qua component name và class name
- Config deeplink, intent filter + ACTION_VIEW
17. Service là gì? có mấy loại Service?
Service là 1 trong những component chính trong Android thường được dùng với những tác vụ kéo dài ví dụ chơi nhạc, network transaction, xử lý IO
Có 3 loại Service:
Foreground Service là service khi running sẽ notice user thông qua 1 Notification, Service sẽ tiếp tục chạy khi người dùng không tương tác với ứng dụng.
Background Service là service chạy mà không thông báo user
Bound Service là service cung cấp 1 giao diện client - server cho phép các components khác tương tác với service.
Câu trả lời cũ và được chấp nhận:
Start Service là service được init thông qua phương thức startService()
Bound Service
Service là 1 trong những component chính trong Android thường được dùng với những tác vụ kéo dài ví dụ chơi nhạc, network transaction, xử lý IO
Có 3 loại Service:
Foreground Service là service khi running sẽ notice user thông qua 1 Notification, Service sẽ tiếp tục chạy khi người dùng không tương tác với ứng dụng.
Background Service là service chạy mà không thông báo user
Bound Service là service cung cấp 1 giao diện client - server cho phép các components khác tương tác với service.
Câu trả lời cũ và được chấp nhận:
Start Service là service được init thông qua phương thức startService()
Bound Service
18. Những lưu ý gì khi start service?
Bắt đầu từ android O, Android sẽ throw exception khi bất cứ service nào được start khi App dưới background.
Một vài trường hợp ứng dụng có thể chạy service mà không có bất cứ limitation nào, những trường hợp dưới đây app sẽ được whitelist xem chi tiết tại đây
Khi app trên foreground nó sẽ có khả năng start foreground và background service, ngay khi app xuống background system sẽ tiếp tục cho phép background service trong khoảng vài phút, đến khi kết thúc giai đoạn này tất cả background service sẽ stop tương đương khi Service call stopSelf()
Một app trên foreground khi
Ngoài ra còn 1 số limitation liên quan tới việc get location dưới background service
Bắt đầu từ android O, Android sẽ throw exception khi bất cứ service nào được start khi App dưới background.
Một vài trường hợp ứng dụng có thể chạy service mà không có bất cứ limitation nào, những trường hợp dưới đây app sẽ được whitelist xem chi tiết tại đây
Khi app trên foreground nó sẽ có khả năng start foreground và background service, ngay khi app xuống background system sẽ tiếp tục cho phép background service trong khoảng vài phút, đến khi kết thúc giai đoạn này tất cả background service sẽ stop tương đương khi Service call stopSelf()
Một app trên foreground khi
- Chứa Activity đang visible (Stated or Paused State refer Lifecyle.State)
- Chứa Foreground service
- Connect hoặc tương tác với 1 số service như Wallpaper, Notification, Voice and text Service
Ngoài ra còn 1 số limitation liên quan tới việc get location dưới background service
19. Giả sử Activity cùng call startService and bindSerivce, những gì xảy ra khi Activity chỉ gọi stopService, hoặc chỉ gọi unbindService, hoặc gọi cả 2?
khi chỉ gọi stopService thì Service chỉ kết thúc chạy trên mode start service mà k destroy
khi chỉ gọi unbindService thì Service chỉ disconnect với client mà k destroy
Trong tình huống này service chỉ destroy khi Activity đồng thời call stopService và unbindService.
khi chỉ gọi stopService thì Service chỉ kết thúc chạy trên mode start service mà k destroy
khi chỉ gọi unbindService thì Service chỉ disconnect với client mà k destroy
Trong tình huống này service chỉ destroy khi Activity đồng thời call stopService và unbindService.
20. Service chạy trên Thread nào?
Nhìn chung service chạy trên Main Thread của process khởi tạo nó, nó không tạo ra process riêng biệt trừ khi bạn declare process khác cho nó bằng file Manifest.
Để thực hiện các task vụ nặng và không block UI thread bạn nên tạo một thread mới để xử lý các task
Nhìn chung service chạy trên Main Thread của process khởi tạo nó, nó không tạo ra process riêng biệt trừ khi bạn declare process khác cho nó bằng file Manifest.
Để thực hiện các task vụ nặng và không block UI thread bạn nên tạo một thread mới để xử lý các task
21. Implicit Intent và Explicit Intent
Explicit Intent: Là Intent định nghĩa tường minh Class name hay component name của các Android Component. Dạng Intent này thường được sử dụng trong ứng dụng của bạn. Ví dụ khởi tạo Activity của ứng dụng.
Implicit Intent: Không định nghĩa tường minh mà chỉ được khởi tạo với dạng các Action (Ngoài ra có thể có thêm Category). Ví dụ bạn muốn mở cuộc gọi trên điện thoại, mở ứng dụng viết email, chụp 1 bức ảnh bằng ứng dụng camera của hệ thống.
Implicit Intent: Không định nghĩa tường minh mà chỉ được khởi tạo với dạng các Action (Ngoài ra có thể có thêm Category). Ví dụ bạn muốn mở cuộc gọi trên điện thoại, mở ứng dụng viết email, chụp 1 bức ảnh bằng ứng dụng camera của hệ thống.
22. AIDL là gì