From b1d671122a693e31c93d2b46227263e206e16bb5 Mon Sep 17 00:00:00 2001 From: Ethan Nguyen Date: Thu, 1 Aug 2019 14:44:33 +0700 Subject: [PATCH 1/3] Implement new activity --- app/src/main/AndroidManifest.xml | 3 + .../androidk001basic/MainActivity.kt | 1 + .../lesson/activity/TestActivity.kt | 62 +++++++++++++++++++ .../androidk001basic/utils/DebugLog.kt | 19 ++++++ app/src/main/res/layout/activity_test.xml | 19 ++++++ 5 files changed, 104 insertions(+) create mode 100644 app/src/main/java/com/trainingdeveloperpro/androidk001basic/lesson/activity/TestActivity.kt create mode 100644 app/src/main/java/com/trainingdeveloperpro/androidk001basic/utils/DebugLog.kt create mode 100644 app/src/main/res/layout/activity_test.xml diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 976003b..25d5aa6 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -16,6 +16,9 @@ + + + \ No newline at end of file diff --git a/app/src/main/java/com/trainingdeveloperpro/androidk001basic/MainActivity.kt b/app/src/main/java/com/trainingdeveloperpro/androidk001basic/MainActivity.kt index fb9cd55..aaec524 100644 --- a/app/src/main/java/com/trainingdeveloperpro/androidk001basic/MainActivity.kt +++ b/app/src/main/java/com/trainingdeveloperpro/androidk001basic/MainActivity.kt @@ -8,5 +8,6 @@ class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) + } } diff --git a/app/src/main/java/com/trainingdeveloperpro/androidk001basic/lesson/activity/TestActivity.kt b/app/src/main/java/com/trainingdeveloperpro/androidk001basic/lesson/activity/TestActivity.kt new file mode 100644 index 0000000..473f779 --- /dev/null +++ b/app/src/main/java/com/trainingdeveloperpro/androidk001basic/lesson/activity/TestActivity.kt @@ -0,0 +1,62 @@ +package com.trainingdeveloperpro.androidk001basic.lesson.activity + +import android.os.Bundle +import androidx.appcompat.app.AppCompatActivity +import com.trainingdeveloperpro.androidk001basic.R +import com.trainingdeveloperpro.androidk001basic.utils.DebugLog + +/** + * https://developer.android.com/guide/components/activities.html?hl=vi + * Tạo 1 file TestActivity.kt + * Tạo 1 file activity_test.xml ở thư mục layout + * Khai báo ở AndroidManifest.xml + * + * **/ +class TestActivity : AppCompatActivity(){ + + private val TAG = TestActivity::class.java.simpleName + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_test) + + DebugLog.logD(TAG, "onCreate()") + } + + override fun onStart() { + super.onStart() + + DebugLog.logD(TAG, "onStart()") + } + + override fun onResume() { + super.onResume() + + DebugLog.logD(TAG, "onResume()") + } + + override fun onPause() { + super.onPause() + + DebugLog.logD(TAG, "onPause()") + } + + override fun onStop() { + super.onStop() + + DebugLog.logD(TAG, "onStop()") + } + + override fun onRestart() { + super.onRestart() + + DebugLog.logD(TAG, "onRestart()") + } + + override fun onDestroy() { + super.onDestroy() + + DebugLog.logD(TAG, "onDestroy()") + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/trainingdeveloperpro/androidk001basic/utils/DebugLog.kt b/app/src/main/java/com/trainingdeveloperpro/androidk001basic/utils/DebugLog.kt new file mode 100644 index 0000000..6774dcd --- /dev/null +++ b/app/src/main/java/com/trainingdeveloperpro/androidk001basic/utils/DebugLog.kt @@ -0,0 +1,19 @@ +package com.trainingdeveloperpro.androidk001basic.utils + +import android.util.Log +import com.trainingdeveloperpro.androidk001basic.BuildConfig + +class DebugLog { + + companion object { + fun logD(message: String) { + if (BuildConfig.DEBUG) + Log.d("TAG", message) + } + + fun logD(tag: String, message: String) { + if (BuildConfig.DEBUG) Log.d(tag, message) + } + } + +} \ No newline at end of file diff --git a/app/src/main/res/layout/activity_test.xml b/app/src/main/res/layout/activity_test.xml new file mode 100644 index 0000000..716af5a --- /dev/null +++ b/app/src/main/res/layout/activity_test.xml @@ -0,0 +1,19 @@ + + + + + + \ No newline at end of file From ef979ffb8f3cf2e91077127aeb965b7b565df497 Mon Sep 17 00:00:00 2001 From: Ethan Nguyen Date: Thu, 1 Aug 2019 15:00:30 +0700 Subject: [PATCH 2/3] Add note in activity --- .../lesson/activity/TestActivity.kt | 46 +++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/app/src/main/java/com/trainingdeveloperpro/androidk001basic/lesson/activity/TestActivity.kt b/app/src/main/java/com/trainingdeveloperpro/androidk001basic/lesson/activity/TestActivity.kt index 473f779..9762ef9 100644 --- a/app/src/main/java/com/trainingdeveloperpro/androidk001basic/lesson/activity/TestActivity.kt +++ b/app/src/main/java/com/trainingdeveloperpro/androidk001basic/lesson/activity/TestActivity.kt @@ -11,11 +11,22 @@ import com.trainingdeveloperpro.androidk001basic.utils.DebugLog * Tạo 1 file activity_test.xml ở thư mục layout * Khai báo ở AndroidManifest.xml * + * Bật Logcat để xem log chạy qua các hàm như thế nào * **/ class TestActivity : AppCompatActivity(){ private val TAG = TestActivity::class.java.simpleName + /**** + * Được gọi khi Activity mới được tạo. + * Đây là lúc bạn nên thực hiện tất cả thiết lập cố định thông thường của mình — tạo chế độ xem, kết ghép dữ liệu với danh sách, v.v. + * Hàm này được chuyển cho một đối tượng Bundle chứa trạng thái trước đây của Activity, + * nếu trạng thái đó được thu lại. + * + * Không tắt bỏ + * + * Hàm chạy tiếp theo hàm này là hàm onStart() + */ override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_test) @@ -23,36 +34,71 @@ class TestActivity : AppCompatActivity(){ DebugLog.logD(TAG, "onCreate()") } + + /** + * Được gọi ngay trước khi Activity hiển thị trước người dùng. + * Hàm tiếp theo là onResume() nếu Activity vào foreground , hoặc onStop() nếu activity bị ẩn. + * + * **/ override fun onStart() { super.onStart() DebugLog.logD(TAG, "onStart()") } + /** + * Được gọi ngay trước khi Activity bắt đầu tương tác với người dùng. + * Tại điểm này, Activity nằm ở trên cùng của Activity Stack, trong đó mục nhập của người dùng sẽ đến Activity này. + * + * Hàm tiếp theo hàm này là onPause + * */ override fun onResume() { super.onResume() DebugLog.logD(TAG, "onResume()") } + /** + * Được gọi khi hệ thống sắp bắt đầu tiếp tục một hoạt động khác. Hàm này thường được sử dụng để thực hiện các thay đổi chưa lưu cho dữ liệu liên tục, + * dừng các hoạt ảnh và những việc khác mà có thể tiêu tốn công suất CPU, v.v. Nó sẽ thực hiện rất nhanh, vì activity tiếp theo sẽ không được tiếp tục tới khi nó trở lại + * Hàm tiếp theo hàm này là onResume() nếu Activity trở lại phía trước, hoặc bởi onStop() nếu nó không hiển thị với người dùng. + * Có thể bị loại bỏ + * */ override fun onPause() { super.onPause() DebugLog.logD(TAG, "onPause()") } + /** + * Được gọi khi Activity không còn hiển thị với người dùng. Điều này có thể xảy ra vì nó đang bị hủy, hoặc vì một Activity khác (đang tồn tại hoặc mới) đã được tiếp tục và đang che khuất nó. + * Hàm tiếp theo là onRestart() nếu Activity đang quay lại để tương tác với người dùng, hoặc bởi onDestroy() nếu Activity này sẽ đi mất. + * Có thể bị loại bỏ + * */ override fun onStop() { super.onStop() DebugLog.logD(TAG, "onStop()") } + /** + * Được gọi sau khi Activity đã được dừng, ngay trước khi Activity được bắt đầu lại. + * + * Hàm chạy tiếp theo là hàm onStart() + * */ override fun onRestart() { super.onRestart() DebugLog.logD(TAG, "onRestart()") } + /** + * Được gọi trước khi Activity bị hủy. Đây là lần gọi cuối cùng mà Activity sẽ nhận được. + * Nên gọi nó hoặc vì Activity đang kết thúc (ai đó đã gọi finish() trên nó), hoặc vì hệ thống đang tạm thời hủy thực thể này của Activity để tiết kiệm bộ nhớ trống. + * Bạn có thể phân biệt những những kịch bản này bằng hàm isFinishing(). + * + * Có thể bị loại bỏ + * */ override fun onDestroy() { super.onDestroy() From a8a37485ec695b7a2cd3909f9b90fad810d671ae Mon Sep 17 00:00:00 2001 From: Ethan Nguyen Date: Fri, 2 Aug 2019 18:15:48 +0700 Subject: [PATCH 3/3] Add Readme.mv --- README.md | 34 +++++++++++++++++++ .../androidk001basic/MainActivity.kt | 4 +++ .../lesson/activity/TestActivity.kt | 33 ++++++++++++++++-- 3 files changed, 69 insertions(+), 2 deletions(-) create mode 100644 README.md diff --git a/README.md b/README.md new file mode 100644 index 0000000..7aec429 --- /dev/null +++ b/README.md @@ -0,0 +1,34 @@ +#CODING CONVENTION + +#WHY? +Tại sao anh lại yêu cầu về coding convention nghiêm ngặt đến vậy? + +Bởi vì: Trong teamwork bọn e đọc code của nhau rất nhiều, không chuẩn hoá giao tiếp sao có thể hiểu được. Thời gian viết feature ngắn nhưng thời gian fix bug tìm lỗi sẽ chiếm rất nhiều. + +#HOW? +Resource +https://jeroenmols.com/blog/2016/03/07/resourcenaming/ +Android +https://github.com/ribot/android-guidelines/blob/master/project_and_code_guidelines.md +Kotlin +https://kotlinlang.org/docs/reference/coding-conventions.html + +Tool +https://developer.android.com/studio/write/lint +Search inspect code trong Android Studio +Search config với gradle. + +#WHAT? +Coding convention là tập hợp các nguyên tắc viết mã lệnh để giúp cho dễ đọc, dễ hiểu, dễ bảo trì. Giống như bọn em tập viết ấy, nó phải thành chữ nghĩa cẩn thận để bất cứ ai dù code Android hay Java hay ngôn ngữ nào cũng đều đọc được. Đừng vẽ nên 1 cô gái xấu xí. + +#WHEN? +Khi đặt ngón tay lên bàn phím gõ lệnh thì cần phải theo coding convention. Giống như đặt bút viết vậy, phải thành chữ nghĩa rõ ràng. + +#WHERE? +Trong dự án của chính mình cũng nên tuân thủ. coding convention. +Trong dự án của cty thì càng phải tuân thủ coding convention. + +#WHO? +Ai cần: +Developer. +Project manager \ No newline at end of file diff --git a/app/src/main/java/com/trainingdeveloperpro/androidk001basic/MainActivity.kt b/app/src/main/java/com/trainingdeveloperpro/androidk001basic/MainActivity.kt index aaec524..07fd15e 100644 --- a/app/src/main/java/com/trainingdeveloperpro/androidk001basic/MainActivity.kt +++ b/app/src/main/java/com/trainingdeveloperpro/androidk001basic/MainActivity.kt @@ -1,7 +1,9 @@ package com.trainingdeveloperpro.androidk001basic +import android.content.Intent import androidx.appcompat.app.AppCompatActivity import android.os.Bundle +import com.trainingdeveloperpro.androidk001basic.lesson.activity.TestActivity class MainActivity : AppCompatActivity() { @@ -9,5 +11,7 @@ class MainActivity : AppCompatActivity() { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) + //Mở sang một activity mới + startActivity(Intent(this, TestActivity::class.java)) } } diff --git a/app/src/main/java/com/trainingdeveloperpro/androidk001basic/lesson/activity/TestActivity.kt b/app/src/main/java/com/trainingdeveloperpro/androidk001basic/lesson/activity/TestActivity.kt index 9762ef9..4dc5394 100644 --- a/app/src/main/java/com/trainingdeveloperpro/androidk001basic/lesson/activity/TestActivity.kt +++ b/app/src/main/java/com/trainingdeveloperpro/androidk001basic/lesson/activity/TestActivity.kt @@ -5,6 +5,8 @@ import androidx.appcompat.app.AppCompatActivity import com.trainingdeveloperpro.androidk001basic.R import com.trainingdeveloperpro.androidk001basic.utils.DebugLog + + /** * https://developer.android.com/guide/components/activities.html?hl=vi * Tạo 1 file TestActivity.kt @@ -13,9 +15,8 @@ import com.trainingdeveloperpro.androidk001basic.utils.DebugLog * * Bật Logcat để xem log chạy qua các hàm như thế nào * **/ -class TestActivity : AppCompatActivity(){ +class TestActivity : AppCompatActivity() { - private val TAG = TestActivity::class.java.simpleName /**** * Được gọi khi Activity mới được tạo. @@ -105,4 +106,32 @@ class TestActivity : AppCompatActivity(){ DebugLog.logD(TAG, "onDestroy()") } + override fun onSaveInstanceState(outState: Bundle) { + super.onSaveInstanceState(outState) + // Lưu trạng thái của UI vào outState + // Bundle này sẽ chuyển đến hàm onCreate nếu như tiến trình bị killed and restarted + outState.putBoolean(BUNDLE_STATE_BOOLEAN, true) + outState.putString(BUNDLE_STATE_STRING, "Welcome back to Android") + } + + override fun onRestoreInstanceState(savedInstanceState: Bundle) { + super.onRestoreInstanceState(savedInstanceState) + // Restore UI state from the savedInstanceState. + // This bundle has also been passed to onCreate. + val myBoolean = savedInstanceState.getBoolean(BUNDLE_STATE_BOOLEAN) + DebugLog.logD(TAG, "My Boolean $myBoolean") + + val myString = savedInstanceState.getString(BUNDLE_STATE_STRING) + + DebugLog.logD(TAG, "My String $myString") + } + + companion object { + + private val TAG = TestActivity::class.java.simpleName + + private const val BUNDLE_STATE_BOOLEAN = "BUNDLE_STATE_BOOLEAN" + private const val BUNDLE_STATE_STRING = "BUNDLE_STATE_STRING" + } + } \ No newline at end of file