Chúng ta sẽ tiếp tục tìm hiểu Activity, một thành phần đặc biệt quan trọng của ứng dụng Android. Activity trong Android là nơi diễn ra mọi hoạt động tương tác với người dùng, bởi vì tất cả các màn hình ứng dụng đều phải được “đính” trên một Activity.
Activity là một trong 4 thành phần quan trọng của ứng dụng Android gồm: Activity, Service, Content Provider, Broadcast receivers.
Trong bài viết này, chúng ta sẽ cùng nhau tìm hiểu cách làm việc với Activity. Để bài viết dễ hiểu và không lý thuyết xuông, mình sẽ cùng nhau xây dựng một ứng dụng nhắc nhở công việc: Forget Me not ( Tạm dịch là: Đừng quên tên anh)
- Biết cách tạo, khởi chạy và tạm dừng một Activity trong Android.
- Bạn sẽ biết cách kết nối và truyền dữ liệu giữa các Activity với nhau
- Hiểu rõ bản chất vòng đời của Activity, từ đó dễ dàng xử lý trải nghiệm tương ứng với các trạng thái của Activity.
Nội dung chính của bài viết
Làm việc với Activity trong Android
Để bắt đầu tìm hiểu, bạn hãy download ứng dụng mẫu mà mình đã tạo sẵn. Như mọi khi, đây chỉ là bộ khung của ứng dụng. Trong quá trình đọc bài viết, bạn sẽ code thêm vào để hoàn thành ứng dụng.
Lưu ý: Sử dụng Android Studio 3.0 trở lên. Cách import dự án như sau: chọn menu Open an existing Android Studio project. Sau đó tìm đến thư mục dự án mà bạn vừa giải nén.
Ứng dụng cũng đơn giản thôi, chức năng chỉ có tạo và xóa các task công việc trong ngày của bạn. Mỗi task sẽ có ngày giờ để có thể tiện theo dõi. Rất cơ bản đúng không!
Activity là gì? Vòng đời của Activity
Trước khi bạn múa tay trên bàn phím để code, chúng ta cùng nhau tìm hiểu lý thuyết nhé
Activity là một thành phần của ứng dụng Android. Android Activity là nơi để ứng dụng tương tác trực tiếp với người dùng thông qua giao diện. Một ứng dụng có thể sẽ có nhiều màn hình và mỗi màn hình có thể là một Activity (nếu không sử dụng Fragment).
Mỗi Activity thường hoạt động độc lập với nhau nhưng có thể tương tác và truyển dữ liệu qua nhau thông qua Intent. Chính vì Activity hoạt động độc lập nên sẽ có vòng đời riêng từ lúc được khởi tạo cho đến lúc được huỷ đi.
Thoạt đầu bạn sẽ thắc mắc: với ứng dụng nhiều màn hình mà được thiết kế tương ứng với nhiều Activity thì xây dựng ứng dụng khó lắm à? Chưa kể nghe nói mỗi Activity lại có vòng đời riêng nữa? Mình phải tự viết code để xử lý vòng đời Activity sao?
Đừng quá lo lắng! Android sẽ xử lý vấn đề đó cho bạn. Trong Android, người ta đã định nghĩa sẵn các callback tương ứng với từng trạng thái của vòng đời Activity rồi. Công việc của bạn là viết code xử lý logi của ứng dụng vào thôi.
Việc xử lý logic tương ứng với từng trạng thái của Activity là việc rất quan trọng. Điều đó đảm bảo ứng dụng hoạt động ổn định và đáng tin cậy với người dùng. Bạn có thể tham khảo hình ảnh minh họa vòng đời Activity
Các trạng thái vòng đời của một activity trong android
Mình sẽ giải thích chi tiết từng trạng thái của Activity để các bạn hiểu bản chất:
- onCreate(): Được gọi bởi OS khi activity được tạo(chỉ gọi duy nhất một lần). Tại đây, bạn có thể khởi tạo giao diện hoặc dữ liệu để dùng cho sau này. Ngoài ra, bạn để ý tham số savedInstanceState. Tham số này chính là trạng thái trước đó của Activity. Mục đích của nó là để bạn có thể khôi phục lại trạng thái của Activity
- onStart(): Ngay trước khi activity được chạy và tương tác với người dùng thì hàm được gọi. Thông thường, tại hàm này chúng ta sẽ khởi tạo animation cho UI( nếu có), Audio, hay bất kì đối tượng nào cần thiết để activity có thể hiển thị cho người dùng
- onResume(): Hàm này được gọi khi activity chuẩn bị chạy hoặc activity được kích hoạt trở lại từ trạng thái stop(Ví dụ: người dùng ấn phím HOME hoặc có cuộc gọi đến…). Tại hàm này, thường chúng ta sẽ khởi động lại animation, cập nhật UI, hay khởi động lại camera, Audio/Video playback… Nói chung là khỏi động lại tất cả những mà bạn đã release ở hàm
onPause()
- onPause(): Hàm này được gọi khi ứng dụng chuyển sang chạy nền( Tức là ứng dụng không hiển thị trên màn hình). Ngược với
onResume()
, tại hàm này chúng ta nên stop Animation, Audio/video playback, tạm dừng camera… Lý do đơn giản vì lúc này ứng dụng không hiển thị và tương tác với người dùng nữa. - onStop(): Hàm này được ngay sau
onPause()
, khi activity không còn tương tác với người dùng. Tại đây, tốt nhất là bạn nên tiến hành sao lưu dữ liệu để có thể khôi phục lại khi activity được kích hoạt lại. - onRestart(): Được gọi sau khi activity bị tạm dừng và giờ được kích hoạt trở lại
- onDestroy(): Đây là hàm cuối cùng trong vòng đời của activity. Có 2 cách để hàm được gọi: một là bạn gọi hàm
finish()
để chủ động tắt một activity, hai là được gọi tự động bởi OS khi tài nguyên cạn kiệt. Tại hàm này, bạn nên giải phóng toàn bộ những task nào đang chạy nền, hoặc những đối tượng(object) toàn cục để tránh bị lỗi Memory Leak.
Quá nhiều hàm phải nhớ đúng không?! Đừng sợ, chúng ta sẽ thực hành và rồi mưa dầm thấm lâu.
Chắc hẳn nhiều bạn sẽ ngạc nhiên khi vòng đời Activity gần giống với vòng đời Fragment. Lý do là Fragment được “gắn” trên Activity nên mới có sự tương đồng như vậy.
Minh họa vòng đời Activity bằng code
Mình nhắc lại là vòng đời activity là kiến thức cực kì quan trọng. Bạn nên đọc kỹ và ghi nhớ nó như việc đánh răng buổi sáng vậy.
Để đỡ nhàm chán, chúng ta sẽ bắt đầu với một ví dụ nhé
Bạn vẫn đang mở Android Studio đó chứ. Bạn mở MainActivity.kt và thấy hàm onCreate()
được override như sau
class MainActivity : AppCompatActivity() { // 1 private val taskList: MutableList<String> = mutableListOf() private val adapter by lazy { makeAdapter(taskList) } override fun onCreate(savedInstanceState: Bundle?) { // 2 super.onCreate(savedInstanceState) // 3 setContentView(R.layout.activity_main) // 4 taskListView.adapter = adapter // 5 taskListView.onItemClickListener = AdapterView.OnItemClickListener { parent, view, position, id -> } } // 6 fun addTaskClicked(view: View) { } // 7 private fun makeAdapter(list: List<String>): ArrayAdapter<String> = ArrayAdapter(this, android.R.layout.simple_list_item_1, list) }
Bạn có thấy phức tạp không? Mình sẽ giải thích lần lượt từng bước:
- Bạn khởi tạo các biến mà bạn cần dùng cho Activity: taskList, adapter. Mục đích là để tạo adapter và biến lưu dữ liệu cho Adapter
- Tiếp theo là chúng ta thực hiện việc “chỉ định” layout cho activity thông qua hàm
setContentView()
- Tiếp đến là thiết lập một adapter cho listview: taskListView. Đây là cách viết rút gọn khi bạn sử dụng Kotlin Android Extensions. Còn như cách thông thường là chúng ta sử dụng hàm
findViewById()
- Bạn thêm callback lắng nghe sự kiện
OnItemClickListener()
cho ListView để sử lý khi người dùng click vào listview.
Nếu bạn muốn tìm hiểu kỹ hơn về ListView/RecyclerView thì mình đã có một bài viết rất chi tiết: Hướng dẫn toàn tập về RecyclerView trong Android
Có lẽ hôm nay chúng ta nghiên cứu đến đây là đủ. Vì không nên nhồi nhét quá nhiều thứ vào đầu cùng một lúc, đặc biệt là kiến thức quan trọng. Chúng cần phải được thấm dần dần. Bài viết sau chúng ta sẽ tiếp tục tìm hiểu cách start một Activity, làm sao có thể tạm dừng Activity và còn nhiều thứ hay ho khác. Các bạn nhớ lưu source code về máy tính vì nó sẽ được sử dụng ở bài sau.
Hẹn gặp lại và đừng quên comment ủng hộ mình nhé
Bài viết rất hữu ích cho người bắt đầu và những bạn chuẩn bị đi phỏng vấn :)))
Cám ơn bạn nhé 🙂
cho minh hoi. su dung project for get me not no bao loi. khac phuc loi nay the nao vay ah.
Could not initialize class org.jetbrains.kotlin.gradle.internal.KotlinSourceSetProviderImplKt
Hi,
Để sửa lỗi này, bạn chỉ cần sử dụng kotlin plugin lên phiên bản mới nhất là được (ví dụ: 1.3.72).
Trong build.gradle (app level):
buildscript {
ext {
kotlinVersion = ‘1.3.72’
}
repositories {
mavenCentral()
}
…
}
Mình import project thì nó báo Gradle-4.1 download failed thì làm thế nào bạn?
Hi, máy tính của bạn có sử dụng proxy không?
Không bạn ạ. sau 1 hồi lay hoay fix lổi giờ nó ra tiếp lỗi này khi Sync gradle
“the android gradle plugin supports only kotlin gradle plugin version 1.3.10 and higher”
Bạn hỗ trợ giúp mình nhé.
Bạn viết thật hay. Chúc bạn mạnh khoẻ. Tks
Cám ơn bạn nhiều nhé 🙂
ad ơi cho em xin link download Started project Forgot Me Not vì link trên yêu cầu đăng ký tài khoản vs credit card 🙁
Đâu bạn nhỉ. Link trên là link từ box.com của tài khoản mình mà. Mình share để public.
https://app.box.com/s/4lq4jdweb6he6lxv9c10s25fyttm1z6c
ad ơi nó nói như này thì làm như nào
The specified Android SDK Build Tools version (26.0.0) is ignored, as it is below the minimum supported version (28.0.3) for Android Gradle Plugin 3.5.2.
Hi,
Lỗi này là do bạn cài bản Android Studio bản mới trong khi dự án mình thì vẫn để version của compile tool bản cũ. Bạn đơn giản là nâng version của compile trong build.gradle lên là được. File build.gradle nằm trong thư mục project/app/build.gradle
Migrate Project to Gradle?
This project does not use the Gradle build system. We recommend that you migrate to using the Gradle build system.
More Information about migrating to Gradle
Don’t show this message again.
ad ơi nó nói như này là như nào ad. ad chỉ với
Hi
bạn import dự án của mình hay dự án khác vào Android Studio thì bị lỗi trên? Lỗi trên nó báo nghĩa là dự án đó thiếu build.gradle. Bạn thử làm theo bước sau xem có được không nhé:
1. Close your project
2. Back up your project
3. Delete the .idea folder in the root directory of the project
4. Delete all the .iml files in your project
5. Import your project in Android Studio, and in the dialog that prompts you for a file, choose the build.gradle file.
Chúc bạn fix đc lỗi
Chào Anh,
Khi em Open Project xong thì nó báo lỗi
ERROR: The Android Gradle plugin supports only Kotlin Gradle plugin version 1.3.0 and higher.
The following dependencies do not satisfy the required version:
root project ‘ForgetMeNot-starter’ -> org.jetbrains.kotlin:kotlin-gradle-plugin:1.1.3
Affected Modules: app
Lỗi này khắc phục sao anh?
Thanks
Hi Phong nhé,
Bạn tìm đến build.gradle ( build.gradle của top project) và sửa đoạn sau:
buildscript {
ext.kotlin_version = ‘1.1.3’
Thành:
buildscript {
ext.kotlin_version = ‘1.3.21’ // Version Kotlin plugin trên máy tính của bạn.
Chúc bạn thành công.
Hi Anh, Sau khi em sửa code lại theo như hướng dẫn của anh thì nó báo lỗi này anh ERROR: Failed to resolve: org.jetbrains.kotlin:kotlin-stdlib-jre7:1.3.21 Show in Project Structure dialog Affected Modules: app WARNING: The specified Android SDK Build Tools version (26.0.0) is ignored, as it is below the minimum supported version (28.0.3) for Android Gradle Plugin 3.3.2. Android SDK Build Tools 28.0.3 will be used. To suppress this warning, remove “buildToolsVersion ‘26.0.0’” from your build.gradle file, as each version of the Android Gradle Plugin now has a default version of the build tools. Remove Build Tools version and sync… Đọc thêm »
Bạn thử đổi : implementation “org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlin_version”
Thành
implementation “org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version”
Và đổi “buildToolsVersion ‘28.0.3”
Thanks
bác ấn vào dòng đỏ thì nó chuyển lên dòng màu xanh bị tô đè lên xóa chỗ bị tô đỏ rồi thay bằng version mà nó suport là đc
bác ơi build gradle ở chỗ nào thế bác